[Mesa-dev] [PATCH] [EGL/GLX driver] Try first a default lookup for glXGetProcAddress before loading dynamic lib.
Chia-I Wu
olvaffe at gmail.com
Sat Nov 26 19:23:59 PST 2011
On Fri, Nov 25, 2011 at 6:58 PM, Beren Minor <beren.minor at gmail.com> wrote:
> GLX functions are sometimes directly available in the current binary. In such
> cases, we do not need any alternate library loaded using dlopen. Otherwise,
> dlopen may find the wrong libGL library and get functions that conflicts with
> the current loaded ones.
>
> For example, on Debian Sid with nvidia binary drivers, using mesa's libEGL with
> GLX driver leads to wrong glXGetFBConfigs symbol loaded (or loaded twice?),
> which leads to "GLX: failed to create any config" error message as the
> glXGetFBConfigs symbol seems to return garbage. If the binary is linked with
> nvidia's libGL, the GLX symbols are already available.
> Without this patch, convert_fbconfig (src/egl/drivers/glx/egl_glx.c:233) fails
> for every config found, after glXGetFBConfigAttrib(... GLX_RENDER_TYPE, ...)
> call, as the value returned has GLX_COLOR_INDEX_BIT and not GLX_RGBA_BIT.
Committed, thanks. I made one change to make sure "handle" is initialized.
> ---
> src/egl/drivers/glx/egl_glx.c | 21 +++++++++++++--------
> 1 files changed, 13 insertions(+), 8 deletions(-)
>
> diff --git a/src/egl/drivers/glx/egl_glx.c b/src/egl/drivers/glx/egl_glx.c
> index 9082fb3..4836895 100644
> --- a/src/egl/drivers/glx/egl_glx.c
> +++ b/src/egl/drivers/glx/egl_glx.c
> @@ -1071,15 +1071,20 @@ GLX_Load(_EGLDriver *drv)
> struct GLX_egl_driver *GLX_drv = GLX_egl_driver(drv);
> void *handle;
>
> - handle = dlopen("libGL.so", RTLD_LAZY | RTLD_LOCAL);
> - if (!handle)
> - goto fail;
> -
> - GLX_drv->glXGetProcAddress = dlsym(handle, "glXGetProcAddress");
> - if (!GLX_drv->glXGetProcAddress)
> - GLX_drv->glXGetProcAddress = dlsym(handle, "glXGetProcAddressARB");
> + GLX_drv->glXGetProcAddress = dlsym(RTLD_DEFAULT, "glXGetProcAddress");
> if (!GLX_drv->glXGetProcAddress)
> - goto fail;
> + GLX_drv->glXGetProcAddress = dlsym(RTLD_DEFAULT, "glXGetProcAddressARB");
> + if (!GLX_drv->glXGetProcAddress) {
> + handle = dlopen("libGL.so", RTLD_LAZY | RTLD_LOCAL);
> + if (!handle)
> + goto fail;
> +
> + GLX_drv->glXGetProcAddress = dlsym(handle, "glXGetProcAddress");
> + if (!GLX_drv->glXGetProcAddress)
> + GLX_drv->glXGetProcAddress = dlsym(handle, "glXGetProcAddressARB");
> + if (!GLX_drv->glXGetProcAddress)
> + goto fail;
> + }
>
> #define GET_PROC(proc_type, proc_name, check) \
> do { \
> --
> 1.7.7.1
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
--
olv at LunarG.com
More information about the mesa-dev
mailing list