/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "gl/GrGLInterface.h" #include "gl/GrGLAssembleInterface.h" #include "../ports/SkOSLibrary.h" #include <EGL/egl.h> namespace { struct Libs { void* fGLLib; void* fEGLLib; }; } static GrGLFuncPtr angle_get_gl_proc(void* ctx, const char name[]) { const Libs* libs = reinterpret_cast<const Libs*>(ctx); GrGLFuncPtr proc = (GrGLFuncPtr) GetProcedureAddress(libs->fGLLib, name); if (proc) { return proc; } proc = (GrGLFuncPtr) GetProcedureAddress(libs->fEGLLib, name); if (proc) { return proc; } return eglGetProcAddress(name); } const GrGLInterface* GrGLCreateANGLEInterface() { static Libs gLibs = { nullptr, nullptr }; if (nullptr == gLibs.fGLLib) { // We load the ANGLE library and never let it go #if defined _WIN32 gLibs.fGLLib = DynamicLoadLibrary("libGLESv2.dll"); gLibs.fEGLLib = DynamicLoadLibrary("libEGL.dll"); #elif defined SK_BUILD_FOR_MAC gLibs.fGLLib = DynamicLoadLibrary("libGLESv2.dylib"); gLibs.fEGLLib = DynamicLoadLibrary("libEGL.dylib"); #else gLibs.fGLLib = DynamicLoadLibrary("libGLESv2.so"); gLibs.fEGLLib = DynamicLoadLibrary("libEGL.so"); #endif } if (nullptr == gLibs.fGLLib || nullptr == gLibs.fEGLLib) { // We can't setup the interface correctly w/o the so return nullptr; } return GrGLAssembleGLESInterface(&gLibs, angle_get_gl_proc); }