mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 09:38:07 +02:00
st/xlib: Hang off screen destructor off main XCloseDisplay() callback.
This resolves some order dependencies between the already existing callback the newly created one. Tested-by: Brian Paul <brianp@vmware.com> Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
parent
51e562c3ea
commit
01e92e7010
3 changed files with 29 additions and 37 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
if (xmdpy->screen && xmdpy->smapi) {
|
||||
pipe_mutex_init(xmdpy->mutex);
|
||||
}
|
||||
else {
|
||||
if (xmdpy->screen) {
|
||||
xmdpy->screen->destroy(xmdpy->screen);
|
||||
xmdpy->screen = NULL;
|
||||
}
|
||||
free(xmdpy->smapi);
|
||||
xmdpy->smapi = NULL;
|
||||
|
||||
xmdpy->display = NULL;
|
||||
}
|
||||
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);
|
||||
}
|
||||
else {
|
||||
if (xmdpy->screen) {
|
||||
xmdpy->screen->destroy(xmdpy->screen);
|
||||
xmdpy->screen = NULL;
|
||||
}
|
||||
free(xmdpy->smapi);
|
||||
xmdpy->smapi = NULL;
|
||||
|
||||
xmdpy->display = NULL;
|
||||
}
|
||||
if (!xmdpy->display || xmdpy->display != display)
|
||||
xmdpy = NULL;
|
||||
|
||||
pipe_mutex_unlock(init_mutex);
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue