Home | History | Annotate | Download | only in jni
      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