[Mesa-dev] [PATCH v3 2/2] Hang off screen destructor off main XCloseDisplay() callback.

Brian Paul brianp at vmware.com
Thu Mar 3 17:32:17 UTC 2016


On 03/02/2016 06:28 PM, George Kyriazis wrote:
> This resolves some order dependencies between the already existing
> callback the newly created one.
> ---
>   src/gallium/state_trackers/glx/xlib/glx_api.c |  1 +
>   src/gallium/state_trackers/glx/xlib/xm_api.c  | 58 +++++++++++----------------
>   src/gallium/state_trackers/glx/xlib/xm_api.h  |  3 ++
>   3 files changed, 27 insertions(+), 35 deletions(-)
>
> diff --git a/src/gallium/state_trackers/glx/xlib/glx_api.c b/src/gallium/state_trackers/glx/xlib/glx_api.c
> index 0456d44..1c541b7 100644
> --- a/src/gallium/state_trackers/glx/xlib/glx_api.c
> +++ b/src/gallium/state_trackers/glx/xlib/glx_api.c
> @@ -615,6 +615,7 @@ close_display_callback(Display *dpy, XExtCodes *codes)
>   {
>      xmesa_destroy_buffers_on_display(dpy);
>      destroy_visuals_on_display(dpy);
> +   xmesa_close_display(dpy);
>      return 0;
>   }
>
> diff --git a/src/gallium/state_trackers/glx/xlib/xm_api.c b/src/gallium/state_trackers/glx/xlib/xm_api.c
> index 2f1bfae..cee4f18 100644
> --- a/src/gallium/state_trackers/glx/xlib/xm_api.c
> +++ b/src/gallium/state_trackers/glx/xlib/xm_api.c
> @@ -126,7 +126,6 @@ xmesa_get_param(struct st_manager *smapi,
>   typedef struct _XMesaExtDisplayInfo {
>      struct _XMesaExtDisplayInfo *next;
>      Display *display;
> -   XExtCodes *codes;
>      struct xmesa_display mesaDisplay;
>   } XMesaExtDisplayInfo;
>
> @@ -138,8 +137,8 @@ typedef struct _XMesaExtInfo {
>   static XMesaExtInfo MesaExtInfo;
>
>   /* hook to delete XMesaDisplay on XDestroyDisplay */
> -static int
> -xmesa_close_display(Display *display, XExtCodes *codes)
> +extern void
> +xmesa_close_display(Display *display)
>   {
>      XMesaExtDisplayInfo *info, *prev;
>
> @@ -159,7 +158,7 @@ xmesa_close_display(Display *display, XExtCodes *codes)
>      if (info == NULL) {
>         /* no display found */
>         _XUnlockMutex(_Xglobal_lock);
> -      return 0;
> +      return;
>      }
>
>      /* remove display entry from list */
> @@ -181,7 +180,6 @@ xmesa_close_display(Display *display, XExtCodes *codes)
>      free(xmdpy->smapi);
>
>      XFree((char *) info);
> -   return 1;
>   }
>
>   static XMesaDisplay
> @@ -218,14 +216,6 @@ xmesa_init_display( Display *display )
>         return NULL;
>      }
>      info->display = display;
> -   info->codes = XAddExtension(display);
> -   if (info->codes == NULL) {
> -      /* could not allocate extension.  Fail */
> -      Xfree(info);
> -      pipe_mutex_unlock(init_mutex);
> -      return NULL;
> -   }
> -   XESetCloseDisplay(display, info->codes->extension, xmesa_close_display);
>      xmdpy = &info->mesaDisplay; /* to be filled out below */
>
>      /* chain to the list of displays */
> @@ -236,32 +226,30 @@ xmesa_init_display( Display *display )
>      _XUnlockMutex(_Xglobal_lock);
>
>      /* now create the new XMesaDisplay info */
> -   if (display) {
> -      xmdpy->display = display;
> -      xmdpy->screen = driver.create_pipe_screen(display);
> -      xmdpy->smapi = CALLOC_STRUCT(st_manager);
> -      xmdpy->pipe = NULL;
> -      if (xmdpy->smapi) {
> -         xmdpy->smapi->screen = xmdpy->screen;
> -         xmdpy->smapi->get_param = xmesa_get_param;
> -      }
> +   assert(display);
> +
> +   xmdpy->display = display;
> +   xmdpy->screen = driver.create_pipe_screen(display);
> +   xmdpy->smapi = CALLOC_STRUCT(st_manager);
> +   xmdpy->pipe = NULL;
> +   if (xmdpy->smapi) {
> +      xmdpy->smapi->screen = xmdpy->screen;
> +      xmdpy->smapi->get_param = xmesa_get_param;
> +   }
>
> -      if (xmdpy->screen && xmdpy->smapi) {
> -         pipe_mutex_init(xmdpy->mutex);
> +   if (xmdpy->screen && xmdpy->smapi) {
> +      pipe_mutex_init(xmdpy->mutex);
> +   }
> +   else {
> +      if (xmdpy->screen) {
> +         xmdpy->screen->destroy(xmdpy->screen);
> +         xmdpy->screen = NULL;
>         }
> -      else {
> -         if (xmdpy->screen) {
> -            xmdpy->screen->destroy(xmdpy->screen);
> -            xmdpy->screen = NULL;
> -         }
> -         free(xmdpy->smapi);
> -         xmdpy->smapi = NULL;
> +      free(xmdpy->smapi);
> +      xmdpy->smapi = NULL;
>
> -         xmdpy->display = NULL;
> -      }
> +      xmdpy->display = NULL;
>      }
> -   if (!xmdpy->display || xmdpy->display != display)
> -      xmdpy = NULL;
>
>      pipe_mutex_unlock(init_mutex);
>
> diff --git a/src/gallium/state_trackers/glx/xlib/xm_api.h b/src/gallium/state_trackers/glx/xlib/xm_api.h
> index ffdffc0..ccf35a5 100644
> --- a/src/gallium/state_trackers/glx/xlib/xm_api.h
> +++ b/src/gallium/state_trackers/glx/xlib/xm_api.h
> @@ -378,6 +378,9 @@ xmesa_check_buffer_size(XMesaBuffer b);
>   extern void
>   xmesa_destroy_buffers_on_display(Display *dpy);
>
> +extern void
> +xmesa_close_display(Display *dpy);
> +
>   static inline GLuint
>   xmesa_buffer_width(XMesaBuffer b)
>   {
>

For both:
Tested-by: Brian Paul <brianp at vmware.com>
Reviewed-by: Brian Paul <brianp at vmware.com>

I'll push this in a bit.

-Brian



More information about the mesa-dev mailing list