From cc6179a4dd6c85993680de95259b9ed37535acfa Mon Sep 17 00:00:00 2001 From: frohlich Date: Tue, 7 Nov 2006 17:49:36 +0000 Subject: [PATCH] Modified Files: 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 | 31 +++++++++++++++++++++++++++---- simgear/screen/extensions.hxx | 5 +---- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/simgear/screen/extensions.cxx b/simgear/screen/extensions.cxx index 49161812..ad406776 100644 --- a/simgear/screen/extensions.cxx +++ b/simgear/screen/extensions.cxx @@ -26,7 +26,7 @@ #include "extensions.hxx" #include -#if !defined(WIN32) && !defined( GLX_VERSION_1_4 ) +#if !defined(WIN32) # include #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__) diff --git a/simgear/screen/extensions.hxx b/simgear/screen/extensions.hxx index fe40550a..8bbf4f36 100644 --- a/simgear/screen/extensions.hxx +++ b/simgear/screen/extensions.hxx @@ -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