Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
Fixed bug #232
Browse files Browse the repository at this point in the history
 ------- Comment #2 From Matthias Geissert  2006-05-24 07:54  [reply] -------
See http://dri.sourceforge.net/doc/DRIuserguide.html, section 11.5. There is written that you need to use RTLD_GLOBAL, since, otherwise, nested open of dynamic libraries doesn't work. However, This is necassary in this case, since libGL opens the hardware-specific driver/library. I hope this helps you.
  • Loading branch information
slouken committed Jun 20, 2006
1 parent b99747c commit e55cce5
Showing 1 changed file with 32 additions and 21 deletions.
53 changes: 32 additions & 21 deletions src/video/x11/SDL_x11gl.c
Expand Up @@ -435,13 +435,25 @@ X11_GL_SwapBuffers(_THIS)

#endif /* SDL_VIDEO_OPENGL_GLX */

#define OPENGL_REQUIRS_DLOPEN
#if defined(OPENGL_REQUIRS_DLOPEN) && defined(SDL_LOADSO_DLOPEN)
#include <dlfcn.h>
#define GL_LoadObject(X) dlopen(X, (RTLD_NOW|RTLD_GLOBAL))
#define GL_LoadFunction dlsym
#define GL_UnloadObject dlclose
#else
#define GL_LoadObject SDL_LoadObject
#define GL_LoadFunction SDL_LoadFunction
#define GL_UnloadObject SDL_UnloadObject
#endif

void
X11_GL_UnloadLibrary(_THIS)
{
#if SDL_VIDEO_OPENGL_GLX
if (this->gl_config.driver_loaded) {

SDL_UnloadObject(this->gl_config.dll_handle);
GL_UnloadObject(this->gl_config.dll_handle);

this->gl_data->glXGetProcAddress = NULL;
this->gl_data->glXChooseVisual = NULL;
Expand Down Expand Up @@ -479,7 +491,7 @@ X11_GL_LoadLibrary(_THIS, const char *path)
}
}

handle = SDL_LoadObject(path);
handle = GL_LoadObject(path);
if (handle == NULL) {
/* SDL_LoadObject() will call SDL_SetError() for us. */
return -1;
Expand All @@ -490,35 +502,35 @@ X11_GL_LoadLibrary(_THIS, const char *path)

/* Load new function pointers */
this->gl_data->glXGetProcAddress =
(void *(*)(const GLubyte *)) SDL_LoadFunction(handle,
"glXGetProcAddressARB");
(void *(*)(const GLubyte *)) GL_LoadFunction(handle,
"glXGetProcAddressARB");
this->gl_data->glXChooseVisual =
(XVisualInfo * (*)(Display *, int, int *)) SDL_LoadFunction(handle,
"glXChooseVisual");
(XVisualInfo * (*)(Display *, int, int *)) GL_LoadFunction(handle,
"glXChooseVisual");
this->gl_data->glXCreateContext =
(GLXContext(*)(Display *, XVisualInfo *, GLXContext, int))
SDL_LoadFunction(handle, "glXCreateContext");
GL_LoadFunction(handle, "glXCreateContext");
this->gl_data->glXDestroyContext =
(void (*)(Display *, GLXContext)) SDL_LoadFunction(handle,
"glXDestroyContext");
(void (*)(Display *, GLXContext)) GL_LoadFunction(handle,
"glXDestroyContext");
this->gl_data->glXMakeCurrent =
(int (*)(Display *, GLXDrawable, GLXContext))
SDL_LoadFunction(handle, "glXMakeCurrent");
(int (*)(Display *, GLXDrawable, GLXContext)) GL_LoadFunction(handle,
"glXMakeCurrent");
this->gl_data->glXSwapBuffers =
(void (*)(Display *, GLXDrawable)) SDL_LoadFunction(handle,
"glXSwapBuffers");
(void (*)(Display *, GLXDrawable)) GL_LoadFunction(handle,
"glXSwapBuffers");
this->gl_data->glXGetConfig =
(int (*)(Display *, XVisualInfo *, int, int *))
SDL_LoadFunction(handle, "glXGetConfig");
GL_LoadFunction(handle, "glXGetConfig");
this->gl_data->glXQueryExtensionsString =
(const char *(*)(Display *, int)) SDL_LoadFunction(handle,
"glXQueryExtensionsString");
(const char *(*)(Display *, int)) GL_LoadFunction(handle,
"glXQueryExtensionsString");
this->gl_data->glXSwapIntervalSGI =
(int (*)(int)) SDL_LoadFunction(handle, "glXSwapIntervalSGI");
(int (*)(int)) GL_LoadFunction(handle, "glXSwapIntervalSGI");
this->gl_data->glXSwapIntervalMESA =
(GLint(*)(unsigned)) SDL_LoadFunction(handle, "glXSwapIntervalMESA");
(GLint(*)(unsigned)) GL_LoadFunction(handle, "glXSwapIntervalMESA");
this->gl_data->glXGetSwapIntervalMESA =
(GLint(*)(void)) SDL_LoadFunction(handle, "glXGetSwapIntervalMESA");
(GLint(*)(void)) GL_LoadFunction(handle, "glXGetSwapIntervalMESA");

if ((this->gl_data->glXChooseVisual == NULL) ||
(this->gl_data->glXCreateContext == NULL) ||
Expand Down Expand Up @@ -551,8 +563,7 @@ X11_GL_GetProcAddress(_THIS, const char *proc)
if (this->gl_data->glXGetProcAddress) {
return this->gl_data->glXGetProcAddress((const GLubyte *) proc);
}
return SDL_LoadFunction(handle, proc);
return GL_LoadFunction(handle, proc);
}

#endif /* SDL_VIDEO_OPENGL_GLX */
/* vi: set ts=4 sw=4 expandtab: */

0 comments on commit e55cce5

Please sign in to comment.