[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