]> git.mxchange.org Git - simgear.git/blobdiff - simgear/screen/extensions.cxx
Change SGPath::exists to use stat(), fix '.' and '..' handling on Windows, add simgea...
[simgear.git] / simgear / screen / extensions.cxx
index e6c17ea24e36d9ed3b09974468b87c6615a9ee21..130673c51f92c7654a1ba47c36b865a4ce14c3e5 100644 (file)
 
 #include <string.h>
 
-#ifndef WIN32
-#include <dlfcn.h>
-#else
-#include <windows.h>
-#endif
-
 #include "extensions.hxx"
+#include <simgear/debug/logstream.hxx>
+#if !defined(WIN32)
+#  include <dlfcn.h>
+#endif
 
-bool SGSearchExtensionsString(char *extString, char *extName) {
+bool SGSearchExtensionsString(const char *extString, const char *extName) {
     // Returns GL_TRUE if the *extName string appears in the *extString string,
     // surrounded by white spaces, or GL_FALSE otherwise.
 
-    char *p, *end;
+    const char *p, *end;
     int n, extNameLen;
 
+    if ((extString == NULL) || (extName == NULL))
+        return false;
+
     extNameLen = strlen(extName);
 
     p=extString;
@@ -55,15 +56,14 @@ bool SGSearchExtensionsString(char *extString, char *extName) {
     return GL_FALSE;
 }
 
-bool SGIsOpenGLExtensionSupported(char *extName) {
+bool SGIsOpenGLExtensionSupported(const char *extName) {
    // Returns GL_TRUE if the OpenGL Extension whose name is *extName
    // is supported by the system, or GL_FALSE otherwise.
    //
    // The *extName string must follow the OpenGL extensions naming scheme
    // (ie: "GL_type_extension", like GL_EXT_convolution)
 
-    return SGSearchExtensionsString((char *)glGetString(GL_EXTENSIONS),
-extName);
+    return SGSearchExtensionsString((const char *)glGetString(GL_EXTENSIONS),extName);
 }
 
 #ifdef __APPLE__
@@ -99,4 +99,55 @@ void* macosxGetGLProcAddress(const char *func) {
   return function;
 }
 
+#elif !defined( WIN32 )
+
+void *SGGetGLProcAddress(const char *func) {
+    static void *libHandle = NULL;
+    static void *(*glXGetProcAddressPtr)(const GLubyte*) = 0;
+    void *fptr = NULL;
+
+    /*
+     * Clear the error buffer
+     */
+    dlerror();
+
+    /*
+     * Since libGL must be linked to the binary we run on, this is the
+     * right handle. That 'current binary' handle also avoids conflicts which
+     * arise from linking with a different libGL at link time an than later
+     * use the standard libGL at runtime ...
+     */
+    if (libHandle == NULL) {
+        libHandle = dlopen(NULL, RTLD_LAZY);
+
+        if (!libHandle) {
+            const char *error = dlerror();
+            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);
+
+        const char *error = dlerror();
+        if (error)
+            SG_LOG(SG_GENERAL, SG_INFO, error);
+    }
+
+    return fptr;
+}
+
 #endif
+