[Mesa-dev] [PATCH v2] Fix indirect fallback when a non-Mesa GLX extension is present.

Brian Paul brianp at vmware.com
Tue Dec 6 15:35:45 PST 2011


On 12/06/2011 11:20 AM, Aaron Plattner wrote:
> When driCreateScreen calls driConvertConfigs to try to convert the
> configs for swrast, it fails and returns NULL.  Instead of checking,
> it just clobbers psc->base.configs.  Then, when the application asks
> for the FBconfigs, there aren't any.
>
> Instead, make the caller responsible for freeing the old modes lists
> if both calls to driConvertConfigs succeed.
>
> Without the second fix, glxinfo fails unless you run it with
> LIBGL_ALWAYS_INDIRECT:
>
>      $ glxinfo
>      name of display: :0.0
>      Error: couldn't find RGB GLX visual or fbconfig
>
>      $ LIBGL_ALWAYS_INDIRECT=1 glxinfo
>      name of display: :0.0
>      display: :0  screen: 0
>      direct rendering: No (LIBGL_ALWAYS_INDIRECT set)
>      server glx vendor string: NVIDIA Corporation
>      server glx version string: 1.4
>      [...]
>
> Signed-off-by: Aaron Plattner<aplattner at nvidia.com>
> ---
> This is a rebased version of [1], which was never applied (possibly
> because I forgot to send out a version that didn't accidentally revert
> the change to glxext.c).
>
> [1] http://lists.freedesktop.org/archives/mesa-dev/2010-April/000200.html
>
>   src/glx/dri2_glx.c   |   23 +++++++++++++++++++----
>   src/glx/dri_common.c |    2 --
>   src/glx/dri_glx.c    |   21 ++++++++++++++++-----
>   src/glx/drisw_glx.c  |   23 +++++++++++++++++++----
>   4 files changed, 54 insertions(+), 15 deletions(-)
>
> diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c
> index 940626c..553869a 100644
> --- a/src/glx/dri2_glx.c
> +++ b/src/glx/dri2_glx.c
> @@ -865,6 +865,7 @@ dri2CreateScreen(int screen, struct glx_display * priv)
>         priv->dri2Display;
>      struct dri2_screen *psc;
>      __GLXDRIscreen *psp;
> +   struct glx_config *configs = NULL, *visuals = NULL;
>      char *driverName, *deviceName;
>      drm_magic_t magic;
>      int i;
> @@ -947,10 +948,16 @@ dri2CreateScreen(int screen, struct glx_display * priv)
>      extensions = psc->core->getExtensions(psc->driScreen);
>      dri2BindExtensions(psc, extensions);
>
> -   psc->base.configs =
> -      driConvertConfigs(psc->core, psc->base.configs, driver_configs);
> -   psc->base.visuals =
> -      driConvertConfigs(psc->core, psc->base.visuals, driver_configs);
> +   configs = driConvertConfigs(psc->core, psc->base.configs, driver_configs);
> +   visuals = driConvertConfigs(psc->core, psc->base.visuals, driver_configs);
> +
> +   if (!configs || !visuals)
> +       goto handle_error;
> +
> +   glx_config_destroy_list(psc->base.configs);
> +   psc->base.configs = configs;
> +   glx_config_destroy_list(psc->base.visuals);
> +   psc->base.visuals = visuals;
>
>      psc->driver_configs = driver_configs;
>
> @@ -994,10 +1001,18 @@ dri2CreateScreen(int screen, struct glx_display * priv)
>      return&psc->base;
>
>   handle_error:
> +   if (configs)
> +       glx_config_destroy_list(configs);
> +   if (visuals)
> +       glx_config_destroy_list(visuals);
> +   if (psc->driScreen)
> +       psc->core->destroyScreen(psc->driScreen);
> +   psc->driScreen = NULL;
>      if (psc->fd>= 0)
>         close(psc->fd);
>      if (psc->driver)
>         dlclose(psc->driver);
> +
>      Xfree(driverName);
>      Xfree(deviceName);
>      glx_screen_cleanup(&psc->base);
> diff --git a/src/glx/dri_common.c b/src/glx/dri_common.c
> index eb62c82..1482b88 100644
> --- a/src/glx/dri_common.c
> +++ b/src/glx/dri_common.c
> @@ -340,8 +340,6 @@ driConvertConfigs(const __DRIcoreExtension * core,
>         tail = tail->next;
>      }
>
> -   glx_config_destroy_list(configs);
> -
>      return head.next;
>   }
>
> diff --git a/src/glx/dri_glx.c b/src/glx/dri_glx.c
> index a52159c..666423a 100644
> --- a/src/glx/dri_glx.c
> +++ b/src/glx/dri_glx.c
> @@ -336,7 +336,7 @@ CallCreateNewScreen(Display *dpy, int scrn, struct dri_screen *psc,
>      drm_handle_t hFB;
>      int junk;
>      const __DRIconfig **driver_configs;
> -   struct glx_config *visual;
> +   struct glx_config *visual, *configs = NULL, *visuals = NULL;
>
>      /* DRI protocol version. */
>      dri_version.major = driDpy->driMajor;
> @@ -446,10 +446,16 @@ CallCreateNewScreen(Display *dpy, int scrn, struct dri_screen *psc,
>         goto handle_error;
>      }
>
> -   psc->base.configs =
> -      driConvertConfigs(psc->core, psc->base.configs, driver_configs);
> -   psc->base.visuals =
> -      driConvertConfigs(psc->core, psc->base.visuals, driver_configs);
> +   configs = driConvertConfigs(psc->core, psc->base.configs, driver_configs);
> +   visuals = driConvertConfigs(psc->core, psc->base.visuals, driver_configs);
> +
> +   if (!configs || !visuals)
> +       goto handle_error;
> +
> +   glx_config_destroy_list(psc->base.configs);
> +   psc->base.configs = configs;
> +   glx_config_destroy_list(psc->base.visuals);
> +   psc->base.visuals = visuals;
>
>      psc->driver_configs = driver_configs;
>
> @@ -478,6 +484,11 @@ CallCreateNewScreen(Display *dpy, int scrn, struct dri_screen *psc,
>      return psp;
>
>    handle_error:
> +   if (configs)
> +       glx_config_destroy_list(configs);
> +   if (visuals)
> +       glx_config_destroy_list(visuals);
> +
>      if (pSAREA != MAP_FAILED)
>         drmUnmap(pSAREA, SAREA_MAX);
>
> diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c
> index a150c61..fbc6be2 100644
> --- a/src/glx/drisw_glx.c
> +++ b/src/glx/drisw_glx.c
> @@ -524,6 +524,7 @@ driswCreateScreen(int screen, struct glx_display *priv)
>      const __DRIconfig **driver_configs;
>      const __DRIextension **extensions;
>      struct drisw_screen *psc;
> +   struct glx_config *configs = NULL, *visuals = NULL;
>      int i;
>
>      psc = Xcalloc(1, sizeof *psc);
> @@ -569,10 +570,16 @@ driswCreateScreen(int screen, struct glx_display *priv)
>      extensions = psc->core->getExtensions(psc->driScreen);
>      driswBindExtensions(psc, extensions);
>
> -   psc->base.configs =
> -      driConvertConfigs(psc->core, psc->base.configs, driver_configs);
> -   psc->base.visuals =
> -      driConvertConfigs(psc->core, psc->base.visuals, driver_configs);
> +   configs = driConvertConfigs(psc->core, psc->base.configs, driver_configs);
> +   visuals = driConvertConfigs(psc->core, psc->base.visuals, driver_configs);
> +
> +   if (!configs || !visuals)
> +       goto handle_error;
> +
> +   glx_config_destroy_list(psc->base.configs);
> +   psc->base.configs = configs;
> +   glx_config_destroy_list(psc->base.visuals);
> +   psc->base.visuals = visuals;
>
>      psc->driver_configs = driver_configs;
>
> @@ -586,6 +593,14 @@ driswCreateScreen(int screen, struct glx_display *priv)
>      return&psc->base;
>
>    handle_error:
> +   if (configs)
> +       glx_config_destroy_list(configs);
> +   if (visuals)
> +       glx_config_destroy_list(visuals);
> +   if (psc->driScreen)
> +       psc->core->destroyScreen(psc->driScreen);
> +   psc->driScreen = NULL;
> +
>      if (psc->driver)
>         dlclose(psc->driver);
>      glx_screen_cleanup(&psc->base);

Looks reasonable to me.  I'll commit/push this in a day or so if there 
aren't any other comments.

Thanks.

-Brian



More information about the mesa-dev mailing list