1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2bd3e3202ad5111a8a259e976594d7e6864e3b6d2yangsu@google.com/* 3a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon * Copyright 2014 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7bd3e3202ad5111a8a259e976594d7e6864e3b6d2yangsu@google.com */ 8bd3e3202ad5111a8a259e976594d7e6864e3b6d2yangsu@google.com 96c8c34e65ff8248ec7374e0d662d7f5684d800fatomhudson@google.com#include "gl/GrGLInterface.h" 10a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon#include "gl/GrGLAssembleInterface.h" 11a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon#include <dlfcn.h> 12a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon 13a721c8167222a0b2b442a00052104b2a78ab93e5bsalomonclass GLLoader { 14a721c8167222a0b2b442a00052104b2a78ab93e5bsalomonpublic: 15a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon GLLoader() { 16a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon fLibrary = dlopen( 17a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon "/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib", 18a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon RTLD_LAZY); 19a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon } 20a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon 21a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon ~GLLoader() { 2249f085dddff10473b6ebf832a974288300224e60bsalomon if (fLibrary) { 23a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon dlclose(fLibrary); 24a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon } 25a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon } 26a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon 27a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon void* handle() const { 28a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon return NULL == fLibrary ? RTLD_DEFAULT : fLibrary; 29a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon } 30a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon 31a721c8167222a0b2b442a00052104b2a78ab93e5bsalomonprivate: 32a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon void* fLibrary; 33a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon}; 34a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon 35a721c8167222a0b2b442a00052104b2a78ab93e5bsalomonclass GLProcGetter { 36a721c8167222a0b2b442a00052104b2a78ab93e5bsalomonpublic: 37a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon GLProcGetter() {} 38a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon 39a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon GrGLFuncPtr getProc(const char name[]) const { 40a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon return (GrGLFuncPtr) dlsym(fLoader.handle(), name); 41a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon } 42a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon 43a721c8167222a0b2b442a00052104b2a78ab93e5bsalomonprivate: 44a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon GLLoader fLoader; 45a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon}; 46a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon 47a721c8167222a0b2b442a00052104b2a78ab93e5bsalomonstatic GrGLFuncPtr ios_get_gl_proc(void* ctx, const char name[]) { 4849f085dddff10473b6ebf832a974288300224e60bsalomon SkASSERT(ctx); 49a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon const GLProcGetter* getter = (const GLProcGetter*) ctx; 50a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon return getter->getProc(name); 51a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon} 52bd3e3202ad5111a8a259e976594d7e6864e3b6d2yangsu@google.com 53cca3c8f21b80f515a236a4b0d1e1f0b6418fcc97bsalomon@google.comconst GrGLInterface* GrGLCreateNativeInterface() { 54a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon GLProcGetter getter; 55a721c8167222a0b2b442a00052104b2a78ab93e5bsalomon return GrGLAssembleGLESInterface(&getter, ios_get_gl_proc); 566fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com} 57