X-Git-Url: https://deadsoftware.ru/gitweb?p=nanogl.git;a=blobdiff_plain;f=nanogl.cpp;h=fdc2a9a8543a7d17b4d909c7fa40a09cd5d9efd0;hp=53b6384848c5c47f115266f46baaf3fcb299e9f8;hb=HEAD;hpb=f889df536aeeccf338d95f830d3a710b5feea371 diff --git a/nanogl.cpp b/nanogl.cpp index 53b6384..fdc2a9a 100644 --- a/nanogl.cpp +++ b/nanogl.cpp @@ -23,30 +23,41 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include - //#include #include "nanogl.h" #include "glesinterface.h" #include "gl.h" - #define DEBUG_NANO 0 #ifdef __ANDROID__ #include #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,129 +69,240 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifdef _WIN32 #include -#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 +#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 void* glesLib = NULL; - -GlESInterface* glEsImpl = NULL; +static void *glesLib = NULL; -extern void InitGLStructs(); +GlESInterface *glEsImpl = NULL; -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 ) ); + memset( glEsImpl, 0, sizeof( GlESInterface ) ); + +#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)); + glEsImpl = (GlESInterface *)malloc( sizeof( GlESInterface ) ); - if (!glEsImpl) { - return 0; - } + 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; } @@ -188,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 @@ -213,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 @@ -266,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 ); }