DEADSOFTWARE

glIsEnabled uses interanl structures, added glPushAttrib/glPopAttrib (not fully imple...
[nanogl.git] / nanogl.cpp
index c8454b079163a82e5796de264ea3f41f5bdd6314..fdc2a9a8543a7d17b4d909c7fa40a09cd5d9efd0 100644 (file)
@@ -23,30 +23,41 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include <stdio.h>
 #include <stdlib.h>
 
-
 //#include <cutils/log.h>
 
 #include "nanogl.h"
 #include "glesinterface.h"
 #include "gl.h"
 
-
 #define DEBUG_NANO 0
 
 #ifdef __ANDROID__
 #include <android/log.h>
 #define LOG __android_log_print
 
-#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
-#define LOGD(...) if (DEBUG_NANO) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
-#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,__VA_ARGS__)
-#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG,__VA_ARGS__)
+#define LOGI( ... ) __android_log_print( ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__ )
+#define LOGD( ... )   \
+       if ( DEBUG_NANO ) \
+       __android_log_print( ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__ )
+#define LOGE( ... ) __android_log_print( ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__ )
+#define LOGW( ... ) __android_log_print( ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__ )
 #else
 #ifndef _MSC_VER
-#define LOGI(...) printf("I: "__VA_ARGS__);printf("\n")
-#define LOGD(...) if(DEBUG_NANO) {printf("D: "__VA_ARGS__);printf("\n");} 
-#define LOGE(...) printf("E: "__VA_ARGS__);printf("\n")
-#define LOGW(...) printf("W: "__VA_ARGS__);printf("\n")
+#define LOGI( ... )             \
+       printf( "I: " __VA_ARGS__ ); \
+       printf( "\n" )
+#define LOGD( ... )                 \
+       if ( DEBUG_NANO )               \
+       {                               \
+               printf( "D: " __VA_ARGS__ ); \
+               printf( "\n" );             \
+       }
+#define LOGE( ... )             \
+       printf( "E: " __VA_ARGS__ ); \
+       printf( "\n" )
+#define LOGW( ... )             \
+       printf( "W: " __VA_ARGS__ ); \
+       printf( "\n" )
 #else
 #define LOGI printf
 #define LOGD printf
@@ -58,125 +69,240 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 #ifdef _WIN32
 #include <windows.h>
-#define dlopen(x,y) LoadLibraryA(x)
-#define dlsym(x,y) (void*)GetProcAddress((HINSTANCE)x,y)
-#define dlclose(x) FreeLibrary((HINSTANCE)x)
+#define loadDriver( x ) LoadLibraryA( x )
+#define procAddress( x, y ) (( void * ) GetProcAddress( (HINSTANCE)x, y ))
+#define freeDriver( x ) FreeLibrary( (HINSTANCE)x )
+#define GL_LIB "opengl32.dll"
+#define GLES_LIB "GLESv1_CM.dll"
+#define EGL_LIB "EGL.dll"
 #else
 #include <dlfcn.h>
+#define loadDriver( x ) dlopen( x, RTLD_NOW | RTLD_LOCAL )
+#define procAddress( x, y ) dlsym( x, y )
+#define freeDriver( x ) dlclose() x )
+#define GL_LIB "libGL.so.1"
+#define GLES_LIB "libGLESv1_CM.so"
+#define EGL_LIB "libEGL.so"
 #endif
 
-
 //#define GL_ENTRY(_r, _api, ...) #_api,
 
-static char const * const gl_names[] = {
-    #include "funcnames.h"
-    NULL
-};
+static char const *const gl_names[] = {
+#include "funcnames.h"
+    NULL};
 
 //const char * driver;
 
-static voidglesLib = NULL;
+static void *glesLib = NULL;
 
-GlESInterfaceglEsImpl = NULL;
+GlESInterface *glEsImpl = NULL;
 
-extern void InitGLStructs();
-
-void APIENTRY gl_unimplemented(GLenum none) {
+extern void InitGLStructs( );
+#ifdef WIN32
+void APIENTRY gl_unimplemented( GLenum none )
+{
 #ifndef USE_CORE_PROFILE
-       LOGE ("Called unimplemented OpenGL ES API\n");
+       LOGE( "Called unimplemented OpenGL ES API\n" );
 #endif
 }
+#else // make glGetString not crash
+const char * APIENTRY gl_unimplemented( GLenum none )
+{
+#ifndef USE_CORE_PROFILE
+       LOGE( "Called unimplemented OpenGL ES API\n" );
+#endif
+       return "";
+}
+#endif
+#ifdef XASH_SDL
+#define NANOGL_SDL
+#endif
+#ifdef __ANDROID__
+#define NANOGL_EGL
+#endif
+#ifdef NANOGL_SDL
+#include "SDL.h"
+#endif
 
-void *nanoGL_GetProcAddress(const char *name)
+#ifdef NANOGL_EGL
+void *eglLib;
+#endif
+
+void *nanoGL_GetProcAddress( const char *name )
 {
        void *addr = NULL;
-#ifdef XASH_SDL
-       addr = SDL_GL_GetProcAddress( name ); 
+#ifdef NANOGL_SDL
+       addr = SDL_GL_GetProcAddress( name );
+       if ( !addr )
+#endif
+       addr = procAddress( glesLib, name );
+#ifdef NANOGL_EGL
        if( !addr )
+               addr = procAddress( eglLib, name );
+       if( !addr && glEsImpl->eglGetProcAddress )
+               addr = (void *)glEsImpl->eglGetProcAddress( name );
 #endif
-       addr = dlsym(glesLib, name);
        return addr;
 }
 
-static int CreateGlEsInterface( const char * name, void * lib, void * lib1, void * default_func )
+#if 1
+int nanoGL_Init( void)
 {
+       // load GL API calls
+       char const *const *api;
+       api = gl_names;
+       int count = 0;
+
        // alloc space
        if ( !glEsImpl )
-               glEsImpl = (GlESInterface *) malloc(sizeof(GlESInterface)); 
+               glEsImpl = (GlESInterface *)malloc( sizeof( GlESInterface ) );
+       memset( glEsImpl, 0, sizeof( GlESInterface ) );
 
-       if (!glEsImpl) {
-        return 0;
-    }
+#ifdef NANOGL_EGL
+       eglLib = loadDriver( EGL_LIB );
+#endif
+#ifdef USE_CORE_PROFILE
+       glesLib = loadDriver( GL_LIB );
+#else
+       glesLib = loadDriver( GLES_LIB );
+#endif
+
+       // nanoGL interface pointer
+       void **ptr = (void **)( glEsImpl );
+
+       while ( *api )
+       {
+               void *f;
+
+               f = nanoGL_GetProcAddress( *api);
+
+       #ifdef USE_CORE_PROFILE
+               // Hack: try ARB and EXT suffix
+               if ( f == NULL )
+               {
+                       char namearb[256];
+                       snprintf( namearb, 256, "%sARB", *api );
+                       f = nanoGL_GetProcAddress( namearb );
+               }
+               if ( f == NULL )
+               {
+                       char namearb[256];
+                       snprintf( namearb, 256, "%sEXT", *api );
+                       f = nanoGL_GetProcAddress( namearb );
+               }
+       #endif
+               if ( f == NULL )
+               {
+                       LOGW( "<%s> not found.", *api);
+                       f = (void*)gl_unimplemented;
+               }
+               else
+               {
+                       LOGD( "<%s> @ 0x%p\n", *api, f );
+                       count++;
+               }
+
+               *ptr++ = f;
+               api++;
+       }
+
+       InitGLStructs();
+
+       // it has loaded something, maybe it will work
+       if( count > 10 )
+               return 1;
+       else
+               return 0;
+}
+#else
+
+static int CreateGlEsInterface( const char *name, void *lib, void *lib1, void *default_func )
+{
+       // alloc space
+       if ( !glEsImpl )
+               glEsImpl = (GlESInterface *)malloc( sizeof( GlESInterface ) );
+
+       if ( !glEsImpl )
+       {
+               return 0;
+       }
 
        // load GL API calls
-       char const * const * api;
+       char const *const *api;
        api = gl_names;
 
        // nanoGL interface pointer
-       void ** ptr = (void **)(glEsImpl);
+       void **ptr = (void **)( glEsImpl );
 
-       while (*api) 
+       while ( *api )
        {
-               void * f;
-               
-               f = dlsym(lib, *api); // try libGLESxx_CM.so
+               void *f;
+
+               f = dlsym( lib, *api ); // try libGLESxx_CM.so
 
 #ifdef USE_CORE_PROFILE
                // Hack: try ARB and EXT suffix
-               if (f == NULL) {
+               if ( f == NULL )
+               {
                        char namearb[256];
                        snprintf( namearb, 256, "%sARB", *api );
                        f = dlsym( lib, namearb );
                }
-               if (f == NULL) {
+               if ( f == NULL )
+               {
                        char namearb[256];
                        snprintf( namearb, 256, "%sEXT", *api );
                        f = dlsym( lib, namearb );
                }
 #endif
-               if (f == NULL) {
-                       LOGW( "<%s> not found in %s. Trying libEGL.so.", *api, name); //driver);
-                       
-                       // try lib1
-                       if ( lib1 ) {
-                               f = dlsym(lib1, *api); // libEGL.so
-                               
-                               if ( f == NULL ) {
-                                       LOGE ( "<%s> not found in libEGL.so", *api);
-                    if( glEsImpl->eglGetProcAddress && ( (void*)glEsImpl->eglGetProcAddress != (void*)gl_unimplemented ) )
-                        f = (void*)glEsImpl->eglGetProcAddress( *api );
-                    if(f == NULL)
-                        f = (void*)default_func; //(void*)gl_unimplemented;
+               if ( f == NULL )
+               {
+                       LOGW( "<%s> not found in %s. Trying libEGL.so.", *api, name ); //driver);
 
+                       // try lib1
+                       if ( lib1 )
+                       {
+                               f = dlsym( lib1, *api ); // libEGL.so
+
+                               if ( f == NULL )
+                               {
+                                       LOGE( "<%s> not found in libEGL.so", *api );
+                                       if ( glEsImpl->eglGetProcAddress && ( (void *)glEsImpl->eglGetProcAddress != (void *)gl_unimplemented ) )
+                                               f = (void *)glEsImpl->eglGetProcAddress( *api );
+                                       if ( f == NULL )
+                                               f = (void *)default_func; //(void*)gl_unimplemented;
                                }
-                               else {
-                                       LOGD ("<%s> @ 0x%p\n", *api, f);
+                               else
+                               {
+                                       LOGD( "<%s> @ 0x%p\n", *api, f );
                                }
                        }
                        else
                        {
-                               LOGE ( "libEGL.so not loaded!");
-                            if( glEsImpl->eglGetProcAddress && ( (void*)glEsImpl->eglGetProcAddress != (void*)gl_unimplemented ) )
-                                f = (void*)glEsImpl->eglGetProcAddress( *api );
-                if( !f )
-                               f = (void*)default_func;
+                               LOGE( "libEGL.so not loaded!" );
+                               if ( glEsImpl->eglGetProcAddress && ( (void *)glEsImpl->eglGetProcAddress != (void *)gl_unimplemented ) )
+                                       f = (void *)glEsImpl->eglGetProcAddress( *api );
+                               if ( !f )
+                                       f = (void *)default_func;
                        }
                }
-               else {
-                       LOGD ("<%s> @ 0x%p\n", *api, f);
+               else
+               {
+                       LOGD( "<%s> @ 0x%p\n", *api, f );
                }
-                       
-           *ptr++ = f;
-        api++;
-    }  
+
+               *ptr++ = f;
+               api++;
+       }
 
        return 1;
 }
 
 // Load using the dynamic loader
-static int loadDriver(const char * name) {
-       glesLib = dlopen(name, RTLD_NOW | RTLD_LOCAL);
-       int rc = (glesLib) ? 1 : 0;
+static int loadDriver( const char *name )
+{
+       glesLib = dlopen( name, RTLD_NOW | RTLD_LOCAL );
+       int rc  = ( glesLib ) ? 1 : 0;
        return rc;
 }
 
@@ -184,23 +310,24 @@ static int loadDriver(const char * name) {
  * Init
  */
 #ifdef _WIN32
-int nanoGL_Init()
+int nanoGL_Init( )
 {
-       const char * lib1 = "opengl32.dll";     // Has both gl* & egl* funcs SDK < 1.5
-       const char * lib2 = "opengl32.dll";     // Only gl* funcs SDK >= 1.5
-       const char * lib3 = "opengl32.dll";             // Only egl* funcs SDK >= 1.5
-       const char * driver;
-       
+       const char *lib1 = "opengl32.dll"; // Has both gl* & egl* funcs SDK < 1.5
+       const char *lib2 = "opengl32.dll"; // Only gl* funcs SDK >= 1.5
+       const char *lib3 = "opengl32.dll"; // Only egl* funcs SDK >= 1.5
+       const char *driver;
+
        // load lib
-       LOGI("nanoGL: Init loading driver %s\n", lib1);
+       LOGI( "nanoGL: Init loading driver %s\n", lib1 );
        //LOG (ANDROID_LOG_DEBUG, LOG_TAG, "nanoGL: Init loading driver %s\n", lib1);
 
-       if ( ! loadDriver(lib1) ) 
+       if ( !loadDriver( lib1 ) )
        {
-               LOGE("Failed to load driver %s. Trying %s\n", lib1, lib2);
+               LOGE( "Failed to load driver %s. Trying %s\n", lib1, lib2 );
 
-               if ( ! loadDriver(lib2) ) {
-                       LOGE ("Failed to load  %s.\n", lib2);
+               if ( !loadDriver( lib2 ) )
+               {
+                       LOGE( "Failed to load  %s.\n", lib2 );
                        return 0;
                }
                else
@@ -209,51 +336,53 @@ int nanoGL_Init()
        else
                driver = lib1;
 
-       void * eglLib;
-       
+       void *eglLib;
+
        //if ( strcmp(driver, lib2) == 0 ) {
-               LOGD ("**** Will Load EGL subs from %s ****", lib3);
-               
-               eglLib = dlopen(lib3, RTLD_NOW | RTLD_LOCAL);
-               
-               if ( ! eglLib ) {
-                       LOGE ( "Failed to load %s", lib3);
-               }
+       LOGD( "**** Will Load EGL subs from %s ****", lib3 );
+
+       eglLib = dlopen( lib3, RTLD_NOW | RTLD_LOCAL );
+
+       if ( !eglLib )
+       {
+               LOGE( "Failed to load %s", lib3 );
+       }
        //}
-       
-       // Load API gl* for 1.5+  else egl* gl* 
+
+       // Load API gl* for 1.5+  else egl* gl*
        //if (CreateGlEsInterface(driver, glesLib, eglLib, NULL) == -1)
-       if ( !CreateGlEsInterface(driver, glesLib, eglLib, (void *) gl_unimplemented) == -1)
-    {
+       if ( !CreateGlEsInterface( driver, glesLib, eglLib, (void *)gl_unimplemented ) == -1 )
+       {
                // release lib
-               LOGE ( "CreateGlEsInterface failed.");
+               LOGE( "CreateGlEsInterface failed." );
 
-               dlclose(glesLib);
-           return 0;
-    }
+               dlclose( glesLib );
+               return 0;
+       }
 
        // Init nanoGL
-       InitGLStructs();
+       InitGLStructs( );
        return 1;
 }
 #else
-int nanoGL_Init()
+int nanoGL_Init( )
 {
-       const char * lib1 = "libGLESv1_CM.so";  // Has both gl* & egl* funcs SDK < 1.5
-       const char * lib2 = "libGLESv2.so";     // Only gl* funcs SDK >= 1.5
-       const char * lib3 = "libEGL.so";                // Only egl* funcs SDK >= 1.5
-       const char * driver;
-       
+       const char *lib1 = "libGLESv1_CM.so"; // Has both gl* & egl* funcs SDK < 1.5
+       const char *lib2 = "libGLESv2.so";    // Only gl* funcs SDK >= 1.5
+       const char *lib3 = "libEGL.so";       // Only egl* funcs SDK >= 1.5
+       const char *driver;
+
        // load lib
-       LOGI("nanoGL: Init loading driver %s\n", lib1);
+       LOGI( "nanoGL: Init loading driver %s\n", lib1 );
        //LOG (ANDROID_LOG_DEBUG, LOG_TAG, "nanoGL: Init loading driver %s\n", lib1);
 
-       if ( ! loadDriver(lib1) ) 
+       if ( !loadDriver( lib1 ) )
        {
-               LOGE("Failed to load driver %s. Trying %s\n", lib1, lib2);
+               LOGE( "Failed to load driver %s. Trying %s\n", lib1, lib2 );
 
-               if ( ! loadDriver(lib2) ) {
-                       LOGE ("Failed to load  %s.\n", lib2);
+               if ( !loadDriver( lib2 ) )
+               {
+                       LOGE( "Failed to load  %s.\n", lib2 );
                        return 0;
                }
                else
@@ -262,56 +391,64 @@ int nanoGL_Init()
        else
                driver = lib1;
 
-       void * eglLib;
-       
+       void *eglLib;
+
        //if ( strcmp(driver, lib2) == 0 ) {
-               LOGD ("**** Will Load EGL subs from %s ****", lib3);
-               
-               eglLib = dlopen(lib3, RTLD_NOW | RTLD_LOCAL);
-               
-               if ( ! eglLib ) {
-                       LOGE ( "Failed to load %s", lib3);
-               }
+       LOGD( "**** Will Load EGL subs from %s ****", lib3 );
+
+       eglLib = dlopen( lib3, RTLD_NOW | RTLD_LOCAL );
+
+       if ( !eglLib )
+       {
+               LOGE( "Failed to load %s", lib3 );
+       }
        //}
-       
-       // Load API gl* for 1.5+  else egl* gl* 
+
+       // Load API gl* for 1.5+  else egl* gl*
        //if (CreateGlEsInterface(driver, glesLib, eglLib, NULL) == -1)
-       if ( !CreateGlEsInterface(driver, glesLib, eglLib, (void *) gl_unimplemented) == -1)
-    {
+       if ( !CreateGlEsInterface( driver, glesLib, eglLib, (void *)gl_unimplemented ) == -1 )
+       {
                // release lib
-               LOGE ( "CreateGlEsInterface failed.");
+               LOGE( "CreateGlEsInterface failed." );
 
-               dlclose(glesLib);
-           return 0;
-    }
+               dlclose( glesLib );
+               return 0;
+       }
 
 #ifdef __ANDROID__
        // somewhy it does not initialize correctly
-       *((void**)&glEsImpl->glGenFramebuffers) = (void*)glEsImpl->eglGetProcAddress( "glGenFramebuffersOES" );
-       *((void**)&glEsImpl->glGenRenderbuffers) = (void*)glEsImpl->eglGetProcAddress( "glGenRenderbuffersOES" );
-       *((void**)&glEsImpl->glRenderbufferStorage) = (void*)glEsImpl->eglGetProcAddress( "glRenderbufferStorageOES" );
-       *((void**)&glEsImpl->glBindFramebuffer) = (void*)glEsImpl->eglGetProcAddress( "glBindFramebufferOES" );
-       *((void**)&glEsImpl->glBindRenderbuffer) = (void*)glEsImpl->eglGetProcAddress( "glBindRenderbufferOES" );
-       *((void**)&glEsImpl->glFramebufferTexture2D) = (void*)glEsImpl->eglGetProcAddress( "glFramebufferTexture2DOES" );
-       *((void**)&glEsImpl->glDeleteRenderbuffers) = (void*)glEsImpl->eglGetProcAddress( "glDeleteRenderbuffersOES" );
-       *((void**)&glEsImpl->glDeleteFramebuffers) = (void*)glEsImpl->eglGetProcAddress( "glDeleteFramebuffersOES" );
-       *((void**)&glEsImpl->glFramebufferRenderbuffer) = (void*)glEsImpl->eglGetProcAddress( "glFramebufferRenderbufferOES" );
+       *( (void **)&glEsImpl->glGenFramebuffers ) = (void *)glEsImpl->eglGetProcAddress( "glGenFramebuffersOES" );
+       *( (void **)&glEsImpl->glGenRenderbuffers ) = (void *)glEsImpl->eglGetProcAddress( "glGenRenderbuffersOES" );
+       *( (void **)&glEsImpl->glRenderbufferStorage ) = (void *)glEsImpl->eglGetProcAddress( "glRenderbufferStorageOES" );
+       *( (void **)&glEsImpl->glBindFramebuffer ) = (void *)glEsImpl->eglGetProcAddress( "glBindFramebufferOES" );
+       *( (void **)&glEsImpl->glBindRenderbuffer ) = (void *)glEsImpl->eglGetProcAddress( "glBindRenderbufferOES" );
+       *( (void **)&glEsImpl->glFramebufferTexture2D ) = (void *)glEsImpl->eglGetProcAddress( "glFramebufferTexture2DOES" );
+       *( (void **)&glEsImpl->glDeleteRenderbuffers ) = (void *)glEsImpl->eglGetProcAddress( "glDeleteRenderbuffersOES" );
+       *( (void **)&glEsImpl->glDeleteFramebuffers ) = (void *)glEsImpl->eglGetProcAddress( "glDeleteFramebuffersOES" );
+       *( (void **)&glEsImpl->glFramebufferRenderbuffer ) = (void *)glEsImpl->eglGetProcAddress( "glFramebufferRenderbufferOES" );
+       *( (void **)&glEsImpl->glTexGeniOES ) = (void *)glEsImpl->eglGetProcAddress( "glTexGeniOES" );
+       *( (void **)&glEsImpl->glTexGenfvOES ) = (void *)glEsImpl->eglGetProcAddress( "glTexGenfv" );
+
+
 #endif
 
        // Init nanoGL
-       InitGLStructs();
+       InitGLStructs( );
        return 1;
 }
 #endif
-void nanoGL_Destroy()
+
+#endif
+void nanoGL_Destroy( )
 {
-       LOGD ("nanoGL_Destroy");
-       
-       if (glEsImpl) {
-        free( glEsImpl);
-        glEsImpl = NULL;
-    }
-       
+       LOGD( "nanoGL_Destroy" );
+
+       if ( glEsImpl )
+       {
+               free( glEsImpl );
+               glEsImpl = NULL;
+       }
+
        // release lib
-       dlclose(glesLib);
+       dlclose( glesLib );
 }