Fixed bug #232
------- 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. --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401855
This commit is contained in:
parent
11452ed23e
commit
f9881b12fa
1 changed files with 26 additions and 14 deletions
|
@ -422,12 +422,24 @@ void X11_GL_SwapBuffers(_THIS)
|
||||||
|
|
||||||
#endif /* SDL_VIDEO_OPENGL_GLX */
|
#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)
|
void X11_GL_UnloadLibrary(_THIS)
|
||||||
{
|
{
|
||||||
#if SDL_VIDEO_OPENGL_GLX
|
#if SDL_VIDEO_OPENGL_GLX
|
||||||
if ( this->gl_config.driver_loaded ) {
|
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->glXGetProcAddress = NULL;
|
||||||
this->gl_data->glXChooseVisual = NULL;
|
this->gl_data->glXChooseVisual = NULL;
|
||||||
|
@ -464,7 +476,7 @@ int X11_GL_LoadLibrary(_THIS, const char* path)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handle = SDL_LoadObject(path);
|
handle = GL_LoadObject(path);
|
||||||
if ( handle == NULL ) {
|
if ( handle == NULL ) {
|
||||||
/* SDL_LoadObject() will call SDL_SetError() for us. */
|
/* SDL_LoadObject() will call SDL_SetError() for us. */
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -475,27 +487,27 @@ int X11_GL_LoadLibrary(_THIS, const char* path)
|
||||||
|
|
||||||
/* Load new function pointers */
|
/* Load new function pointers */
|
||||||
this->gl_data->glXGetProcAddress =
|
this->gl_data->glXGetProcAddress =
|
||||||
(void *(*)(const GLubyte *)) SDL_LoadFunction(handle, "glXGetProcAddressARB");
|
(void *(*)(const GLubyte *)) GL_LoadFunction(handle, "glXGetProcAddressARB");
|
||||||
this->gl_data->glXChooseVisual =
|
this->gl_data->glXChooseVisual =
|
||||||
(XVisualInfo *(*)(Display *, int, int *)) SDL_LoadFunction(handle, "glXChooseVisual");
|
(XVisualInfo *(*)(Display *, int, int *)) GL_LoadFunction(handle, "glXChooseVisual");
|
||||||
this->gl_data->glXCreateContext =
|
this->gl_data->glXCreateContext =
|
||||||
(GLXContext (*)(Display *, XVisualInfo *, GLXContext, int)) SDL_LoadFunction(handle, "glXCreateContext");
|
(GLXContext (*)(Display *, XVisualInfo *, GLXContext, int)) GL_LoadFunction(handle, "glXCreateContext");
|
||||||
this->gl_data->glXDestroyContext =
|
this->gl_data->glXDestroyContext =
|
||||||
(void (*)(Display *, GLXContext)) SDL_LoadFunction(handle, "glXDestroyContext");
|
(void (*)(Display *, GLXContext)) GL_LoadFunction(handle, "glXDestroyContext");
|
||||||
this->gl_data->glXMakeCurrent =
|
this->gl_data->glXMakeCurrent =
|
||||||
(int (*)(Display *, GLXDrawable, GLXContext)) SDL_LoadFunction(handle, "glXMakeCurrent");
|
(int (*)(Display *, GLXDrawable, GLXContext)) GL_LoadFunction(handle, "glXMakeCurrent");
|
||||||
this->gl_data->glXSwapBuffers =
|
this->gl_data->glXSwapBuffers =
|
||||||
(void (*)(Display *, GLXDrawable)) SDL_LoadFunction(handle, "glXSwapBuffers");
|
(void (*)(Display *, GLXDrawable)) GL_LoadFunction(handle, "glXSwapBuffers");
|
||||||
this->gl_data->glXGetConfig =
|
this->gl_data->glXGetConfig =
|
||||||
(int (*)(Display *, XVisualInfo *, int, int *)) SDL_LoadFunction(handle, "glXGetConfig");
|
(int (*)(Display *, XVisualInfo *, int, int *)) GL_LoadFunction(handle, "glXGetConfig");
|
||||||
this->gl_data->glXQueryExtensionsString =
|
this->gl_data->glXQueryExtensionsString =
|
||||||
(const char *(*)(Display *, int)) SDL_LoadFunction(handle, "glXQueryExtensionsString");
|
(const char *(*)(Display *, int)) GL_LoadFunction(handle, "glXQueryExtensionsString");
|
||||||
this->gl_data->glXSwapIntervalSGI =
|
this->gl_data->glXSwapIntervalSGI =
|
||||||
(int (*)(int)) SDL_LoadFunction(handle, "glXSwapIntervalSGI");
|
(int (*)(int)) GL_LoadFunction(handle, "glXSwapIntervalSGI");
|
||||||
this->gl_data->glXSwapIntervalMESA =
|
this->gl_data->glXSwapIntervalMESA =
|
||||||
(GLint (*)(unsigned)) SDL_LoadFunction(handle, "glXSwapIntervalMESA");
|
(GLint (*)(unsigned)) GL_LoadFunction(handle, "glXSwapIntervalMESA");
|
||||||
this->gl_data->glXGetSwapIntervalMESA =
|
this->gl_data->glXGetSwapIntervalMESA =
|
||||||
(GLint (*)(void)) SDL_LoadFunction(handle, "glXGetSwapIntervalMESA");
|
(GLint (*)(void)) GL_LoadFunction(handle, "glXGetSwapIntervalMESA");
|
||||||
|
|
||||||
if ( (this->gl_data->glXChooseVisual == NULL) ||
|
if ( (this->gl_data->glXChooseVisual == NULL) ||
|
||||||
(this->gl_data->glXCreateContext == NULL) ||
|
(this->gl_data->glXCreateContext == NULL) ||
|
||||||
|
@ -527,7 +539,7 @@ void *X11_GL_GetProcAddress(_THIS, const char* proc)
|
||||||
if ( this->gl_data->glXGetProcAddress ) {
|
if ( this->gl_data->glXGetProcAddress ) {
|
||||||
return this->gl_data->glXGetProcAddress((const GLubyte *)proc);
|
return this->gl_data->glXGetProcAddress((const GLubyte *)proc);
|
||||||
}
|
}
|
||||||
return SDL_LoadFunction(handle, proc);
|
return GL_LoadFunction(handle, proc);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* SDL_VIDEO_OPENGL_GLX */
|
#endif /* SDL_VIDEO_OPENGL_GLX */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue