1 /* San Angeles Observation OpenGL ES version example 2 * Copyright 2004-2005 Jetro Lauha 3 * All rights reserved. 4 * Web: http://iki.fi/jetro/ 5 * 6 * This source is free software; you can redistribute it and/or 7 * modify it under the terms of EITHER: 8 * (1) The GNU Lesser General Public License as published by the Free 9 * Software Foundation; either version 2.1 of the License, or (at 10 * your option) any later version. The text of the GNU Lesser 11 * General Public License is included with this source in the 12 * file LICENSE-LGPL.txt. 13 * (2) The BSD-style license that is included with this source in 14 * the file LICENSE-BSD.txt. 15 * 16 * This source is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files 19 * LICENSE-LGPL.txt and LICENSE-BSD.txt for more details. 20 * 21 * $Id: importgl.c,v 1.4 2005/02/08 18:42:55 tonic Exp $ 22 * $Revision: 1.4 $ 23 */ 24 25 #undef WIN32 26 #undef LINUX 27 #ifdef _MSC_VER 28 // Desktop or mobile Win32 environment: 29 #define WIN32 30 #else 31 // Linux environment: 32 #define LINUX 33 #endif 34 35 #ifndef DISABLE_IMPORTGL 36 37 #if defined(WIN32) 38 #define WIN32_LEAN_AND_MEAN 39 #include <windows.h> 40 #include <tchar.h> 41 static HMODULE sGLESDLL = NULL; 42 #endif // WIN32 43 44 #ifdef LINUX 45 #include <stdlib.h> 46 #include <dlfcn.h> 47 static void *sGLESSO = NULL; 48 #endif // LINUX 49 50 #endif /* DISABLE_IMPORTGL */ 51 52 #define IMPORTGL_NO_FNPTR_DEFS 53 #define IMPORTGL_API 54 #define IMPORTGL_FNPTRINIT = NULL 55 #include "importgl.h" 56 57 58 /* Imports function pointers to selected function calls in OpenGL ES Common 59 * or Common Lite profile DLL or shared object. The function pointers are 60 * stored as global symbols with equivalent function name but prefixed with 61 * "funcPtr_". Standard gl/egl calls are redirected to the function pointers 62 * with preprocessor macros (see importgl.h). 63 */ 64 int importGLInit() 65 { 66 int result = 1; 67 68 #ifndef DISABLE_IMPORTGL 69 70 #undef IMPORT_FUNC 71 72 #ifdef WIN32 73 sGLESDLL = LoadLibrary(_T("libGLES_CM.dll")); 74 if (sGLESDLL == NULL) 75 sGLESDLL = LoadLibrary(_T("libGLES_CL.dll")); 76 if (sGLESDLL == NULL) 77 return 0; // Cannot find OpenGL ES Common or Common Lite DLL. 78 79 /* The following fetches address to each egl & gl function call 80 * and stores it to the related function pointer. Casting through 81 * void * results in warnings with VC warning level 4, which 82 * could be fixed by casting to the true type for each fetch. 83 */ 84 #define IMPORT_FUNC(funcName) do { \ 85 void *procAddress = (void *)GetProcAddress(sGLESDLL, _T(#funcName)); \ 86 if (procAddress == NULL) result = 0; \ 87 *((void **)&FNPTR(funcName)) = procAddress; } while (0) 88 #endif // WIN32 89 90 #ifdef LINUX 91 #ifdef ANDROID_NDK 92 sGLESSO = dlopen("libGLESv1_CM.so", RTLD_NOW); 93 #else /* !ANDROID_NDK */ 94 sGLESSO = dlopen("libGLES_CM.so", RTLD_NOW); 95 if (sGLESSO == NULL) 96 sGLESSO = dlopen("libGLES_CL.so", RTLD_NOW); 97 #endif /* !ANDROID_NDK */ 98 if (sGLESSO == NULL) 99 return 0; // Cannot find OpenGL ES Common or Common Lite SO. 100 101 #define IMPORT_FUNC(funcName) do { \ 102 void *procAddress = (void *)dlsym(sGLESSO, #funcName); \ 103 if (procAddress == NULL) result = 0; \ 104 *((void **)&FNPTR(funcName)) = procAddress; } while (0) 105 #endif // LINUX 106 107 #ifndef ANDROID_NDK 108 IMPORT_FUNC(eglChooseConfig); 109 IMPORT_FUNC(eglCreateContext); 110 IMPORT_FUNC(eglCreateWindowSurface); 111 IMPORT_FUNC(eglDestroyContext); 112 IMPORT_FUNC(eglDestroySurface); 113 IMPORT_FUNC(eglGetConfigAttrib); 114 IMPORT_FUNC(eglGetConfigs); 115 IMPORT_FUNC(eglGetDisplay); 116 IMPORT_FUNC(eglGetError); 117 IMPORT_FUNC(eglInitialize); 118 IMPORT_FUNC(eglMakeCurrent); 119 IMPORT_FUNC(eglSwapBuffers); 120 IMPORT_FUNC(eglTerminate); 121 #endif /* !ANDROID_NDK */ 122 123 IMPORT_FUNC(glBlendFunc); 124 IMPORT_FUNC(glClear); 125 IMPORT_FUNC(glClearColorx); 126 IMPORT_FUNC(glColor4x); 127 IMPORT_FUNC(glColorPointer); 128 IMPORT_FUNC(glDisable); 129 IMPORT_FUNC(glDisableClientState); 130 IMPORT_FUNC(glDrawArrays); 131 IMPORT_FUNC(glEnable); 132 IMPORT_FUNC(glEnableClientState); 133 IMPORT_FUNC(glFrustumx); 134 IMPORT_FUNC(glGetError); 135 IMPORT_FUNC(glLightxv); 136 IMPORT_FUNC(glLoadIdentity); 137 IMPORT_FUNC(glMaterialx); 138 IMPORT_FUNC(glMaterialxv); 139 IMPORT_FUNC(glMatrixMode); 140 IMPORT_FUNC(glMultMatrixx); 141 IMPORT_FUNC(glNormalPointer); 142 IMPORT_FUNC(glPopMatrix); 143 IMPORT_FUNC(glPushMatrix); 144 IMPORT_FUNC(glRotatex); 145 IMPORT_FUNC(glScalex); 146 IMPORT_FUNC(glShadeModel); 147 IMPORT_FUNC(glTranslatex); 148 IMPORT_FUNC(glVertexPointer); 149 IMPORT_FUNC(glViewport); 150 151 #endif /* DISABLE_IMPORTGL */ 152 153 return result; 154 } 155 156 157 void importGLDeinit() 158 { 159 #ifndef DISABLE_IMPORTGL 160 #ifdef WIN32 161 FreeLibrary(sGLESDLL); 162 #endif 163 164 #ifdef LINUX 165 dlclose(sGLESSO); 166 #endif 167 #endif /* DISABLE_IMPORTGL */ 168 } 169