DEADSOFTWARE

Windows and core profile support
[nanogl.git] / nanogl.cpp
index 11bd1eac4faf162e8d1bd5e9063deaee398499f1..bd699da41c968ebe4af9455963bb0afac9e2b35a 100644 (file)
@@ -22,7 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <dlfcn.h>
+
 
 //#include <cutils/log.h>
 
@@ -42,19 +42,34 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #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
 
-#define LOGI(...) printf("I: "__VA_ARGS__)
-#define LOGD(...) if(DEBUG_NANO) printf("D: "__VA_ARGS__) 
-#define LOGE(...) printf("E: "__VA_ARGS__)
-#define LOGW(...) printf("W: "__VA_ARGS__)
+#endif
+#endif
 
+#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)
+#else
+#include <dlfcn.h>
 #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
 };
 
@@ -66,8 +81,10 @@ GlESInterface* glEsImpl = NULL;
 
 extern void InitGLStructs();
 
-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)
@@ -112,6 +129,19 @@ static int CreateGlEsInterface( const char * name, void * lib, void * lib1, void
                
                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);
                        
@@ -139,7 +169,7 @@ static int CreateGlEsInterface( const char * name, void * lib, void * lib1, void
                        
            *ptr++ = f;
         api++;
-    }
+    }  
 
        return 1;
 }
@@ -154,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
@@ -206,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);
 }
-    
+