• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  */
importGLInit()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 
importGLDeinit()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