[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