winex11: Create all the GL drawables using the gdi_display to avoid synchronization issues.
This commit is contained in:
parent
6c8d315a72
commit
6e9dea8a27
|
@ -414,7 +414,6 @@ static void sync_window_text( Display *display, Window win, const WCHAR *text )
|
|||
*/
|
||||
BOOL X11DRV_set_win_format( HWND hwnd, XID fbconfig_id )
|
||||
{
|
||||
Display *display = thread_display();
|
||||
struct x11drv_win_data *data;
|
||||
XVisualInfo *vis;
|
||||
int w, h;
|
||||
|
@ -429,6 +428,7 @@ BOOL X11DRV_set_win_format( HWND hwnd, XID fbconfig_id )
|
|||
|
||||
if (data->whole_window)
|
||||
{
|
||||
Display *display = thread_display();
|
||||
Window client = data->client_window;
|
||||
|
||||
if (vis->visualid != XVisualIDFromVisual(visual))
|
||||
|
@ -438,6 +438,7 @@ BOOL X11DRV_set_win_format( HWND hwnd, XID fbconfig_id )
|
|||
}
|
||||
wine_tsx11_lock();
|
||||
XFree(vis);
|
||||
XFlush( display );
|
||||
wine_tsx11_unlock();
|
||||
if (client) goto done;
|
||||
return FALSE;
|
||||
|
@ -457,7 +458,7 @@ BOOL X11DRV_set_win_format( HWND hwnd, XID fbconfig_id )
|
|||
|
||||
if (!parent) parent = root_window;
|
||||
wine_tsx11_lock();
|
||||
data->colormap = XCreateColormap(display, parent, vis->visual,
|
||||
data->colormap = XCreateColormap(gdi_display, parent, vis->visual,
|
||||
(vis->class == PseudoColor ||
|
||||
vis->class == GrayScale ||
|
||||
vis->class == DirectColor) ?
|
||||
|
@ -467,17 +468,18 @@ BOOL X11DRV_set_win_format( HWND hwnd, XID fbconfig_id )
|
|||
XInstallColormap(gdi_display, attrib.colormap);
|
||||
|
||||
if(data->gl_drawable) XDestroyWindow(gdi_display, data->gl_drawable);
|
||||
data->gl_drawable = XCreateWindow(display, parent, -w, 0, w, h, 0,
|
||||
data->gl_drawable = XCreateWindow(gdi_display, parent, -w, 0, w, h, 0,
|
||||
vis->depth, InputOutput, vis->visual,
|
||||
CWColormap | CWOverrideRedirect,
|
||||
&attrib);
|
||||
if(data->gl_drawable)
|
||||
{
|
||||
pXCompositeRedirectWindow(display, data->gl_drawable,
|
||||
pXCompositeRedirectWindow(gdi_display, data->gl_drawable,
|
||||
CompositeRedirectManual);
|
||||
XMapWindow(display, data->gl_drawable);
|
||||
XMapWindow(gdi_display, data->gl_drawable);
|
||||
}
|
||||
XFree(vis);
|
||||
XFlush( gdi_display );
|
||||
wine_tsx11_unlock();
|
||||
}
|
||||
else
|
||||
|
@ -487,8 +489,8 @@ BOOL X11DRV_set_win_format( HWND hwnd, XID fbconfig_id )
|
|||
|
||||
wine_tsx11_lock();
|
||||
|
||||
if(data->pixmap) XFreePixmap(display, data->pixmap);
|
||||
data->pixmap = XCreatePixmap(display, root_window, w, h, vis->depth);
|
||||
if(data->pixmap) XFreePixmap(gdi_display, data->pixmap);
|
||||
data->pixmap = XCreatePixmap(gdi_display, root_window, w, h, vis->depth);
|
||||
if(!data->pixmap)
|
||||
{
|
||||
XFree(vis);
|
||||
|
@ -496,14 +498,15 @@ BOOL X11DRV_set_win_format( HWND hwnd, XID fbconfig_id )
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
if(data->gl_drawable) destroy_glxpixmap(display, data->gl_drawable);
|
||||
data->gl_drawable = create_glxpixmap(display, vis, data->pixmap);
|
||||
if(data->gl_drawable) destroy_glxpixmap(gdi_display, data->gl_drawable);
|
||||
data->gl_drawable = create_glxpixmap(gdi_display, vis, data->pixmap);
|
||||
if(!data->gl_drawable)
|
||||
{
|
||||
XFreePixmap(display, data->pixmap);
|
||||
XFreePixmap(gdi_display, data->pixmap);
|
||||
data->pixmap = 0;
|
||||
}
|
||||
XFree(vis);
|
||||
XFlush( gdi_display );
|
||||
wine_tsx11_unlock();
|
||||
if (data->pixmap) SetPropA(hwnd, pixmap_prop, (HANDLE)data->pixmap);
|
||||
}
|
||||
|
@ -517,9 +520,6 @@ BOOL X11DRV_set_win_format( HWND hwnd, XID fbconfig_id )
|
|||
done:
|
||||
data->fbconfig_id = fbconfig_id;
|
||||
SetPropA(hwnd, fbconfig_id_prop, (HANDLE)data->fbconfig_id);
|
||||
wine_tsx11_lock();
|
||||
XFlush( display );
|
||||
wine_tsx11_unlock();
|
||||
/* force DCE invalidation */
|
||||
SetWindowPos( hwnd, 0, 0, 0, 0, 0,
|
||||
SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE |
|
||||
|
@ -530,7 +530,7 @@ done:
|
|||
/***********************************************************************
|
||||
* sync_gl_drawable
|
||||
*/
|
||||
static void sync_gl_drawable(Display *display, struct x11drv_win_data *data)
|
||||
static void sync_gl_drawable(struct x11drv_win_data *data)
|
||||
{
|
||||
int w = data->client_rect.right - data->client_rect.left;
|
||||
int h = data->client_rect.bottom - data->client_rect.top;
|
||||
|
@ -546,7 +546,7 @@ static void sync_gl_drawable(Display *display, struct x11drv_win_data *data)
|
|||
if(usexcomposite)
|
||||
{
|
||||
wine_tsx11_lock();
|
||||
XMoveResizeWindow(display, data->gl_drawable, -w, 0, w, h);
|
||||
XMoveResizeWindow(gdi_display, data->gl_drawable, -w, 0, w, h);
|
||||
wine_tsx11_unlock();
|
||||
return;
|
||||
}
|
||||
|
@ -561,7 +561,7 @@ static void sync_gl_drawable(Display *display, struct x11drv_win_data *data)
|
|||
return;
|
||||
}
|
||||
|
||||
pix = XCreatePixmap(display, root_window, w, h, vis->depth);
|
||||
pix = XCreatePixmap(gdi_display, root_window, w, h, vis->depth);
|
||||
if(!pix)
|
||||
{
|
||||
ERR("Failed to create pixmap for offscreen rendering\n");
|
||||
|
@ -570,11 +570,11 @@ static void sync_gl_drawable(Display *display, struct x11drv_win_data *data)
|
|||
return;
|
||||
}
|
||||
|
||||
glxp = create_glxpixmap(display, vis, pix);
|
||||
glxp = create_glxpixmap(gdi_display, vis, pix);
|
||||
if(!glxp)
|
||||
{
|
||||
ERR("Failed to create drawable for offscreen rendering\n");
|
||||
XFreePixmap(display, pix);
|
||||
XFreePixmap(gdi_display, pix);
|
||||
XFree(vis);
|
||||
wine_tsx11_unlock();
|
||||
return;
|
||||
|
@ -584,14 +584,14 @@ static void sync_gl_drawable(Display *display, struct x11drv_win_data *data)
|
|||
|
||||
mark_drawable_dirty(data->gl_drawable, glxp);
|
||||
|
||||
XFreePixmap(display, data->pixmap);
|
||||
destroy_glxpixmap(display, data->gl_drawable);
|
||||
XFreePixmap(gdi_display, data->pixmap);
|
||||
destroy_glxpixmap(gdi_display, data->gl_drawable);
|
||||
TRACE( "Recreated GL drawable %lx to replace %lx\n", glxp, data->gl_drawable );
|
||||
|
||||
data->pixmap = pix;
|
||||
data->gl_drawable = glxp;
|
||||
|
||||
XFlush( display );
|
||||
XFlush( gdi_display );
|
||||
wine_tsx11_unlock();
|
||||
|
||||
SetPropA(data->hwnd, gl_drawable_prop, (HANDLE)data->gl_drawable);
|
||||
|
@ -1252,7 +1252,7 @@ static void sync_client_position( Display *display, struct x11drv_win_data *data
|
|||
wine_tsx11_unlock();
|
||||
}
|
||||
|
||||
if (data->gl_drawable && (mask & (CWWidth|CWHeight))) sync_gl_drawable( display, data );
|
||||
if (data->gl_drawable && (mask & (CWWidth|CWHeight))) sync_gl_drawable( data );
|
||||
}
|
||||
|
||||
|
||||
|
@ -1496,15 +1496,15 @@ void X11DRV_DestroyWindow( HWND hwnd )
|
|||
|
||||
if (data->pixmap)
|
||||
{
|
||||
destroy_glxpixmap(display, data->gl_drawable);
|
||||
wine_tsx11_lock();
|
||||
XFreePixmap(display, data->pixmap);
|
||||
destroy_glxpixmap(gdi_display, data->gl_drawable);
|
||||
XFreePixmap(gdi_display, data->pixmap);
|
||||
wine_tsx11_unlock();
|
||||
}
|
||||
else if (data->gl_drawable)
|
||||
{
|
||||
wine_tsx11_lock();
|
||||
XDestroyWindow(display, data->gl_drawable);
|
||||
XDestroyWindow(gdi_display, data->gl_drawable);
|
||||
wine_tsx11_unlock();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue