X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=nanogl.cpp;h=bd699da41c968ebe4af9455963bb0afac9e2b35a;hb=57b822a8a58cbc7ff7edd99a1d375b559a198c9e;hp=823851fcae9117a6fcd0c8b94b2c605400565a10;hpb=2a342cb7b58f8e29ec4852e195beed47d5f40821;p=nanogl.git diff --git a/nanogl.cpp b/nanogl.cpp index 823851f..bd699da 100644 --- a/nanogl.cpp +++ b/nanogl.cpp @@ -22,27 +22,54 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include -#include + //#include -#include #include "nanogl.h" #include "glesinterface.h" #include "gl.h" -#define LOG __android_log_print + #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__) +#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") +#else +#define LOGI printf +#define LOGD printf +#define LOGE printf +#define LOGW printf + +#endif +#endif + +#ifdef _WIN32 +#include +#define dlopen(x,y) LoadLibraryA(x) +#define dlsym(x,y) (void*)GetProcAddress((HINSTANCE)x,y) +#define dlclose(x) FreeLibrary((HINSTANCE)x) +#else +#include +#endif + -#define GL_ENTRY(_r, _api, ...) #_api, +//#define GL_ENTRY(_r, _api, ...) #_api, static char const * const gl_names[] = { - #include "gl_entries.in" + #include "funcnames.h" NULL }; @@ -54,10 +81,30 @@ GlESInterface* glEsImpl = NULL; extern void InitGLStructs(); -static void gl_unimplemented() { - LOGE ("Called unimplemented OpenGL ES API\n"); +void APIENTRY gl_unimplemented(GLenum none) { +#ifndef USE_CORE_PROFILE + LOGE ("Called unimplemented OpenGL ES API\n"); +#endif } +void *nanoGL_GetProcAddress(const char *name) +{ +#if defined(__MULTITEXTURE_SUPPORT__) + if (!strcmp(procname, "glMultiTexCoord2fARB")) + { + return (void*)&glMultiTexCoord2fARB; + } + else if (!strcmp(procname, "glActiveTextureARB")) + { + return (void*)&glActiveTexture; + } + else if (!strcmp(procname, "glClientActiveTextureARB")) + { + return (void*)&glClientActiveTexture; + } +#endif + return dlsym(glesLib, name); +} static int CreateGlEsInterface( const char * name, void * lib, void * lib1, void * default_func ) { @@ -80,8 +127,21 @@ static int CreateGlEsInterface( const char * name, void * lib, void * lib1, void { void * f; - f = dlsym(lib, *api); // ltry ibGLESxx_CM.so + f = dlsym(lib, *api); // try libGLESxx_CM.so +#ifdef USE_CORE_PROFILE + // Hack: try ARB and EXT suffix + if (f == NULL) { + char namearb[256]; + snprintf( namearb, 256, "%sARB", *api ); + f = dlsym( lib, namearb ); + } + 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); @@ -97,8 +157,11 @@ static int CreateGlEsInterface( const char * name, void * lib, void * lib1, void LOGD ("<%s> @ 0x%p\n", *api, f); } } - else + else + { + LOGE ( "libEGL.so not loaded!"); f = default_func; + } } else { LOGD ("<%s> @ 0x%p\n", *api, f); @@ -106,7 +169,7 @@ static int CreateGlEsInterface( const char * name, void * lib, void * lib1, void *ptr++ = f; api++; - } + } return 1; } @@ -121,6 +184,60 @@ static int loadDriver(const char * name) { /** * Init */ +#ifdef _WIN32 +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; + + // load lib + LOGI("nanoGL: Init loading driver %s\n", lib1); + //LOG (ANDROID_LOG_DEBUG, LOG_TAG, "nanoGL: Init loading driver %s\n", lib1); + + if ( ! loadDriver(lib1) ) + { + LOGE("Failed to load driver %s. Trying %s\n", lib1, lib2); + + if ( ! loadDriver(lib2) ) { + LOGE ("Failed to load %s.\n", lib2); + return 0; + } + else + driver = lib2; + } + else + driver = lib1; + + 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); + } + //} + + // 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) + { + // release lib + LOGE ( "CreateGlEsInterface failed."); + + dlclose(glesLib); + return 0; + } + + // Init nanoGL + InitGLStructs(); + return 1; +} +#else int nanoGL_Init() { const char * lib1 = "libGLESv1_CM.so"; // Has both gl* & egl* funcs SDK < 1.5 @@ -173,17 +290,17 @@ int nanoGL_Init() InitGLStructs(); return 1; } - +#endif void nanoGL_Destroy() { LOGD ("nanoGL_Destroy"); if (glEsImpl) { - free( glEsImpl); + free( glEsImpl); glEsImpl = NULL; } // release lib dlclose(glesLib); } - +