Module: wine Branch: master Commit: 2d9b38133b292f01661a527f7aa0974c0ebc9278 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2d9b38133b292f01661a527f7a...
Author: Alexandre Julliard julliard@winehq.org Date: Wed May 28 17:52:06 2008 +0200
winex11: Add support for performing GL calls on a top-level window DC.
---
dlls/winex11.drv/init.c | 1 + dlls/winex11.drv/opengl.c | 2 +- dlls/winex11.drv/window.c | 12 ++++++++++-- dlls/winex11.drv/x11drv.h | 2 ++ 4 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index 5e549b9..cc95057 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -342,6 +342,7 @@ INT X11DRV_ExtEscape( X11DRV_PDEVICE *physDev, INT escape, INT in_count, LPCVOID physDev->current_pf = pixelformat_from_fbconfig_id( data->fbconfig_id ); physDev->gl_drawable = data->gl_drawable; physDev->pixmap = data->pixmap; + physDev->gl_copy = data->gl_copy; wine_tsx11_lock(); XSetSubwindowMode( gdi_display, physDev->gc, data->mode ); wine_tsx11_unlock(); diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index fa81e2e..393c11a 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -2112,7 +2112,7 @@ void flush_gl_drawable(X11DRV_PDEVICE *physDev) { int w, h;
- if(!physDev->gl_drawable) + if (!physDev->gl_copy) return;
w = physDev->dc_rect.right - physDev->dc_rect.left; diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 6a5cc6f..e8535bc 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -1747,14 +1747,21 @@ void X11DRV_GetDC( HDC hdc, HWND hwnd, HWND top, const RECT *win_rect, escape.fbconfig_id = 0; escape.gl_drawable = 0; escape.pixmap = 0; + escape.gl_copy = FALSE;
if (top == hwnd && data && IsIconic( hwnd ) && data->icon_window) { escape.drawable = data->icon_window; } - else if (top == hwnd && (flags & DCX_WINDOW)) + else if (top == hwnd) { - escape.drawable = data ? data->whole_window : X11DRV_get_whole_window( hwnd ); + escape.fbconfig_id = data ? data->fbconfig_id : (XID)GetPropA( hwnd, fbconfig_id_prop ); + /* GL draws to the client area even for window DCs */ + escape.gl_drawable = data ? data->client_window : X11DRV_get_client_window( hwnd ); + if (flags & DCX_WINDOW) + escape.drawable = data ? data->whole_window : X11DRV_get_whole_window( hwnd ); + else + escape.drawable = escape.gl_drawable; } else { @@ -1762,6 +1769,7 @@ void X11DRV_GetDC( HDC hdc, HWND hwnd, HWND top, const RECT *win_rect, escape.fbconfig_id = data ? data->fbconfig_id : (XID)GetPropA( hwnd, fbconfig_id_prop ); escape.gl_drawable = data ? data->gl_drawable : (Drawable)GetPropA( hwnd, gl_drawable_prop ); escape.pixmap = data ? data->pixmap : (Pixmap)GetPropA( hwnd, pixmap_prop ); + escape.gl_copy = (escape.gl_drawable != 0); if (flags & DCX_CLIPCHILDREN) escape.mode = ClipByChildren; }
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 862ac8d..3bfe118 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -139,6 +139,7 @@ typedef struct int current_pf; Drawable gl_drawable; Pixmap pixmap; /* Pixmap for a GLXPixmap gl_drawable */ + int gl_copy; XRENDERINFO xrender; } X11DRV_PDEVICE;
@@ -497,6 +498,7 @@ struct x11drv_escape_set_drawable XID fbconfig_id; /* fbconfig id used by the GL drawable */ Drawable gl_drawable; /* GL drawable */ Pixmap pixmap; /* Pixmap for a GLXPixmap gl_drawable */ + int gl_copy; /* whether the GL contents need explicit copying */ };
/**************************************************************************