1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 #include "gl/GrGLInterface.h" 10 #include "gl/GrGLAssembleInterface.h" 11 #define WIN32_LEAN_AND_MEAN 12 #include <windows.h> 13 14 class AutoLibraryUnload { 15 public: 16 AutoLibraryUnload(const char* moduleName) { 17 fModule = LoadLibrary(moduleName); 18 } 19 ~AutoLibraryUnload() { 20 if (NULL != fModule) { 21 FreeLibrary(fModule); 22 } 23 } 24 HMODULE get() const { return fModule; } 25 26 private: 27 HMODULE fModule; 28 }; 29 30 class GLProcGetter { 31 public: 32 GLProcGetter() : fGLLib("opengl32.dll") {} 33 34 bool isInitialized() const { return NULL != fGLLib.get(); } 35 36 GrGLFuncPtr getProc(const char name[]) const { 37 GrGLFuncPtr proc; 38 if (NULL != (proc = (GrGLFuncPtr) GetProcAddress(fGLLib.get(), name))) { 39 return proc; 40 } 41 if (NULL != (proc = (GrGLFuncPtr) wglGetProcAddress(name))) { 42 return proc; 43 } 44 return NULL; 45 } 46 47 private: 48 AutoLibraryUnload fGLLib; 49 }; 50 51 static GrGLFuncPtr win_get_gl_proc(void* ctx, const char name[]) { 52 SkASSERT(NULL != ctx); 53 SkASSERT(NULL != wglGetCurrentContext()); 54 const GLProcGetter* getter = (const GLProcGetter*) ctx; 55 return getter->getProc(name); 56 } 57 58 /* 59 * Windows makes the GL funcs all be __stdcall instead of __cdecl :( 60 * This implementation will only work if GR_GL_FUNCTION_TYPE is __stdcall. 61 * Otherwise, a springboard would be needed that hides the calling convention. 62 */ 63 const GrGLInterface* GrGLCreateNativeInterface() { 64 if (NULL == wglGetCurrentContext()) { 65 return NULL; 66 } 67 68 GLProcGetter getter; 69 if (!getter.isInitialized()) { 70 return NULL; 71 } 72 73 return GrGLAssembleGLInterface(&getter, win_get_gl_proc); 74 } 75