]> git.mxchange.org Git - simgear.git/commitdiff
Modified Files:
authorfrohlich <frohlich>
Tue, 7 Nov 2006 17:49:36 +0000 (17:49 +0000)
committerfrohlich <frohlich>
Tue, 7 Nov 2006 17:49:36 +0000 (17:49 +0000)
simgear/screen/extensions.cxx simgear/screen/extensions.hxx: Avoid
the assumption that with glx-1.4 glXGetProcAddress is available -
use dlsym to get that function.

simgear/screen/extensions.cxx
simgear/screen/extensions.hxx

index 491618123389babf8000d7915c1c12ff01298769..ad406776e8040435d17dc948e3ee6f552e72a6df 100644 (file)
@@ -26,7 +26,7 @@
 
 #include "extensions.hxx"
 #include <simgear/debug/logstream.hxx>
-#if !defined(WIN32) && !defined( GLX_VERSION_1_4 )
+#if !defined(WIN32)
 #  include <dlfcn.h>
 #endif
 
@@ -99,10 +99,11 @@ void* macosxGetGLProcAddress(const char *func) {
   return function;
 }
 
-#elif !defined( WIN32 ) && !defined(GLX_VERSION_1_4)
+#elif !defined( WIN32 )
 
 void *SGGetGLProcAddress(const char *func) {
     static void *libHandle = NULL;
+    static void *(*glXGetProcAddressPtr)(const GLubyte*) = 0;
     void *fptr = NULL;
 
     /*
@@ -116,10 +117,32 @@ void *SGGetGLProcAddress(const char *func) {
      * arise from linking with a different libGL at link time an than later
      * use the standard libGL at runtime ...
      */
-    if (libHandle == NULL)
+    if (libHandle == NULL) {
         libHandle = dlopen(NULL, RTLD_LAZY);
 
-    if (libHandle != NULL) {
+        if (!libHandle) {
+#if defined (__FreeBSD__)
+            const char *error = dlerror();
+#else
+            char *error = dlerror();
+#endif
+            if (error) {
+                SG_LOG(SG_GENERAL, SG_INFO, error);
+                return 0;
+            }
+        }
+
+        void* symbol = dlsym(libHandle, "glXGetProcAddress");
+        if (!symbol)
+            symbol = dlsym(libHandle, "glXGetProcAddressARB");
+        glXGetProcAddressPtr = (void *(*)(const GLubyte*)) symbol;
+    }
+
+    // First try the glx api function for that
+    if (glXGetProcAddressPtr) {
+        fptr = glXGetProcAddressPtr((const GLubyte*)func);
+
+    } else if (libHandle != NULL) {
         fptr = dlsym(libHandle, func);
 
 #if defined (__FreeBSD__)
index fe40550a32e0903ad34d71fd0c9620f56e8f7ff2..8bbf4f36e1009afa9b44d1173e936de93bfb84c3 100644 (file)
@@ -56,7 +56,7 @@ bool SGIsOpenGLExtensionSupported(char *extName);
   // don't use an inline function for symbol lookup, since it is too big
   void* macosxGetGLProcAddress(const char *func);
 
-#elif !defined( WIN32 ) && !defined( GLX_VERSION_1_4 )
+#elif !defined( WIN32 )
 
   void *SGGetGLProcAddress(const char *func);
   
@@ -70,9 +70,6 @@ inline void (*SGLookupFunction(const char *func))()
 #elif defined( __APPLE__ )
     return (void (*)()) macosxGetGLProcAddress(func);
 
-#elif defined( GLX_VERSION_1_4 )
-    return glXGetProcAddress((const GLubyte*)func);
-
 #else // UNIX, default
     return (void (*)()) SGGetGLProcAddress(func);
 #endif