From 99041a6fd369deeeb60ce1f11195414d16c9dc44 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Fri, 9 Feb 2018 13:08:04 +0100 Subject: [PATCH] winex11: Store only the pixmap size instead of the window rectangle in the GL drawable. Signed-off-by: Alexandre Julliard --- dlls/winex11.drv/opengl.c | 40 +++++++++++++++++++--------------------- dlls/winex11.drv/window.c | 7 ++++++- dlls/winex11.drv/x11drv.h | 2 +- 3 files changed, 26 insertions(+), 23 deletions(-) diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index a7f5756bb09..27f0154a05f 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -259,7 +259,7 @@ struct gl_drawable Pixmap pixmap; /* base pixmap if drawable is a GLXPixmap */ Colormap colormap; /* colormap used for the drawable */ const struct wgl_pixel_format *format; /* pixel format for the drawable */ - RECT rect; /* drawable rect, relative to whole window drawable */ + SIZE pixmap_size; /* pixmap size for GLXPixmap drawables */ int swap_interval; BOOL refresh_swap_interval; }; @@ -1348,6 +1348,12 @@ static void free_gl_drawable( struct gl_drawable *gl ) static BOOL create_gl_drawable( HWND hwnd, struct gl_drawable *gl ) { XVisualInfo *visual = gl->format->visual; + RECT rect; + int width, height; + + GetClientRect( hwnd, &rect ); + width = min( max( 1, rect.right ), 65535 ); + height = min( max( 1, rect.bottom ), 65535 ); gl->drawable = 0; @@ -1389,8 +1395,7 @@ static BOOL create_gl_drawable( HWND hwnd, struct gl_drawable *gl ) XInstallColormap(gdi_display, attrib.colormap); gl->type = DC_GL_CHILD_WIN; - gl->window = XCreateWindow( gdi_display, dummy_parent, 0, 0, - gl->rect.right - gl->rect.left, gl->rect.bottom - gl->rect.top, + gl->window = XCreateWindow( gdi_display, dummy_parent, 0, 0, width, height, 0, visual->depth, InputOutput, visual->visual, CWColormap | CWBorderPixel | CWOverrideRedirect, &attrib ); if (gl->window) @@ -1410,13 +1415,13 @@ static BOOL create_gl_drawable( HWND hwnd, struct gl_drawable *gl ) WARN("XComposite is not available, using GLXPixmap hack\n"); gl->type = DC_GL_PIXMAP_WIN; - gl->pixmap = XCreatePixmap( gdi_display, root_window, - gl->rect.right - gl->rect.left, gl->rect.bottom - gl->rect.top, - visual->depth ); + gl->pixmap = XCreatePixmap( gdi_display, root_window, width, height, visual->depth ); if (gl->pixmap) { gl->drawable = pglXCreatePixmap( gdi_display, gl->format->fbconfig, gl->pixmap, NULL ); if (!gl->drawable) XFreePixmap( gdi_display, gl->pixmap ); + gl->pixmap_size.cx = width; + gl->pixmap_size.cy = height; } } @@ -1442,9 +1447,6 @@ static BOOL set_win_format( HWND hwnd, const struct wgl_pixel_format *format ) gl->swap_interval = 1; gl->refresh_swap_interval = TRUE; gl->format = format; - GetClientRect( hwnd, &gl->rect ); - gl->rect.right = min( max( 1, gl->rect.right ), 65535 ); - gl->rect.bottom = min( max( 1, gl->rect.bottom ), 65535 ); if (!create_gl_drawable( hwnd, gl )) { @@ -1517,31 +1519,26 @@ static BOOL set_pixel_format(HDC hdc, int format, BOOL allow_change) /*********************************************************************** * sync_gl_drawable */ -void sync_gl_drawable( HWND hwnd, const RECT *visible_rect, const RECT *client_rect ) +void sync_gl_drawable( HWND hwnd, int width, int height ) { struct gl_drawable *gl; GLXDrawable glxp; Pixmap pix; - int mask = 0; XWindowChanges changes; - changes.width = min( max( 1, client_rect->right - client_rect->left ), 65535 ); - changes.height = min( max( 1, client_rect->bottom - client_rect->top ), 65535 ); + changes.width = min( max( 1, width ), 65535 ); + changes.height = min( max( 1, height ), 65535 ); if (!(gl = get_gl_drawable( hwnd, 0 ))) return; - if (changes.width != gl->rect.right - gl->rect.left) mask |= CWWidth; - if (changes.height != gl->rect.bottom - gl->rect.top) mask |= CWHeight; - TRACE( "setting drawable %lx size %dx%d\n", gl->drawable, changes.width, changes.height ); switch (gl->type) { case DC_GL_CHILD_WIN: - if (mask) XConfigureWindow( gdi_display, gl->window, mask, &changes ); + XConfigureWindow( gdi_display, gl->window, CWWidth | CWHeight, &changes ); break; case DC_GL_PIXMAP_WIN: - if (!mask) break; pix = XCreatePixmap(gdi_display, root_window, changes.width, changes.height, gl->format->visual->depth); if (!pix) goto done; @@ -1560,11 +1557,12 @@ void sync_gl_drawable( HWND hwnd, const RECT *visible_rect, const RECT *client_r gl->pixmap = pix; gl->drawable = glxp; + gl->pixmap_size.cx = width; + gl->pixmap_size.cy = height; break; default: break; } - SetRect( &gl->rect, 0, 0, changes.width, changes.height ); done: release_gl_drawable( gl ); } @@ -3344,7 +3342,7 @@ static BOOL glxdrv_wglSwapBuffers( HDC hdc ) * copying */ pglFlush(); pglXCopySubBufferMESA( gdi_display, gl->drawable, 0, 0, - gl->rect.right - gl->rect.left, gl->rect.bottom - gl->rect.top ); + gl->pixmap_size.cx, gl->pixmap_size.cy ); break; } if (pglXSwapBuffersMscOML) @@ -3413,7 +3411,7 @@ struct opengl_funcs *get_glx_driver( UINT version ) return NULL; } -void sync_gl_drawable( HWND hwnd, const RECT *visible_rect, const RECT *client_rect ) +void sync_gl_drawable( HWND hwnd, int width, int height ) { } diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index a6101ad012c..8645ad961f5 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -2307,8 +2307,13 @@ void CDECL X11DRV_WindowPosChanged( HWND hwnd, HWND insert_after, UINT swp_flags if (!data->whole_window) { + int width = data->client_rect.right - data->client_rect.left; + int height = data->client_rect.bottom - data->client_rect.top; + release_win_data( data ); - sync_gl_drawable( hwnd, visible_rect, rectClient ); + if (width != old_client_rect.right - old_client_rect.left || + height != old_client_rect.bottom - old_client_rect.top) + sync_gl_drawable( hwnd, width, height ); return; } diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index eca0dc55b69..0b802763070 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -579,7 +579,7 @@ extern void release_win_data( struct x11drv_win_data *data ) DECLSPEC_HIDDEN; extern Window X11DRV_get_whole_window( HWND hwnd ) DECLSPEC_HIDDEN; extern XIC X11DRV_get_ic( HWND hwnd ) DECLSPEC_HIDDEN; -extern void sync_gl_drawable( HWND hwnd, const RECT *visible_rect, const RECT *client_rect ) DECLSPEC_HIDDEN; +extern void sync_gl_drawable( HWND hwnd, int width, int height ) DECLSPEC_HIDDEN; extern void set_gl_drawable_parent( HWND hwnd, HWND parent ) DECLSPEC_HIDDEN; extern void destroy_gl_drawable( HWND hwnd ) DECLSPEC_HIDDEN; -- 2.11.4.GIT