https://gitlab.winehq.org/wine/wine/-/merge_requests/7227 with some tweaks.
-- v2: winex11.drv: Choose alpha-enabled xrender format for argb drawables. winex11.drv: Pass visual to is_wxrformat_compatible_with_visual.
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/window.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index b13c54531ac..470f202a84f 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -2695,6 +2695,7 @@ void X11DRV_GetDC( HDC hdc, HWND hwnd, HWND top, const RECT *win_rect, const RECT *top_rect, DWORD flags ) { struct x11drv_escape_set_drawable escape; + struct x11drv_win_data *data;
escape.code = X11DRV_SET_DRAWABLE; escape.mode = IncludeInferiors; @@ -2705,14 +2706,11 @@ void X11DRV_GetDC( HDC hdc, HWND hwnd, HWND top, const RECT *win_rect, escape.dc_rect.right = win_rect->right - top_rect->left; escape.dc_rect.bottom = win_rect->bottom - top_rect->top;
- if (top == hwnd) + if ((data = get_win_data( top ))) { - struct x11drv_win_data *data = get_win_data( hwnd ); - - escape.drawable = data ? data->whole_window : X11DRV_get_whole_window( hwnd ); - + escape.drawable = data->whole_window; /* special case: when repainting the root window, clip out top-level windows */ - if (data && data->whole_window == root_window) escape.mode = ClipByChildren; + if (top == hwnd && data->whole_window == root_window) escape.mode = ClipByChildren; release_win_data( data ); } else
From: Paul Gofman pgofman@codeweavers.com
--- dlls/winex11.drv/xrender.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-)
diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c index bac3e6fac4b..48e2fea4280 100644 --- a/dlls/winex11.drv/xrender.c +++ b/dlls/winex11.drv/xrender.c @@ -250,15 +250,12 @@ static BOOL get_xrender_template(const WineXRenderFormatTemplate *fmt, XRenderPi return TRUE; }
-static BOOL is_wxrformat_compatible_with_default_visual(const WineXRenderFormatTemplate *fmt) +static BOOL is_wxrformat_compatible_with_visual( const WineXRenderFormatTemplate *fmt, const XVisualInfo *visual ) { - if(fmt->depth != default_visual.depth) return FALSE; - if( (fmt->redMask << fmt->red) != default_visual.red_mask) return FALSE; - if( (fmt->greenMask << fmt->green) != default_visual.green_mask) return FALSE; - if( (fmt->blueMask << fmt->blue) != default_visual.blue_mask) return FALSE; - - /* We never select a default ARGB visual */ - if(fmt->alphaMask) return FALSE; + if (fmt->depth != visual->depth) return FALSE; + if ((fmt->redMask << fmt->red) != visual->red_mask) return FALSE; + if ((fmt->greenMask << fmt->green) != visual->green_mask) return FALSE; + if ((fmt->blueMask << fmt->blue) != visual->blue_mask) return FALSE; return TRUE; }
@@ -278,7 +275,8 @@ static int load_xrender_formats(void) TRACE( "Loaded root pict_format with id=%#lx\n", pict_formats[i]->id ); continue; } - if(is_wxrformat_compatible_with_default_visual(&wxr_formats_template[i])) + if (is_wxrformat_compatible_with_visual( &wxr_formats_template[i], &default_visual ) && + !wxr_formats_template[i].alphaMask /* We never select a default ARGB visual */) { pict_formats[i] = pXRenderFindVisualFormat(gdi_display, default_visual.visual); if (!pict_formats[i])
From: Paul Gofman pgofman@codeweavers.com
--- dlls/winex11.drv/opengl.c | 1 + dlls/winex11.drv/window.c | 2 ++ dlls/winex11.drv/x11drv.h | 1 + dlls/winex11.drv/xrender.c | 20 +++++++++++++++++++- 4 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index 74f78482b41..78b00677099 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -2310,6 +2310,7 @@ static HDC X11DRV_wglGetPbufferDCARB( struct wgl_pbuffer *object ) escape.drawable = object->gl->drawable; escape.mode = IncludeInferiors; SetRect( &escape.dc_rect, 0, 0, object->width, object->height ); + escape.visual = default_visual; NtGdiExtEscape( hdc, NULL, 0, X11DRV_ESCAPE, sizeof(escape), (LPSTR)&escape, 0, NULL );
TRACE( "(%p)->(%p)\n", object, hdc ); diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 470f202a84f..b033960fc26 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -2709,6 +2709,7 @@ void X11DRV_GetDC( HDC hdc, HWND hwnd, HWND top, const RECT *win_rect, if ((data = get_win_data( top ))) { escape.drawable = data->whole_window; + escape.visual = data->vis; /* special case: when repainting the root window, clip out top-level windows */ if (top == hwnd && data->whole_window == root_window) escape.mode = ClipByChildren; release_win_data( data ); @@ -2716,6 +2717,7 @@ void X11DRV_GetDC( HDC hdc, HWND hwnd, HWND top, const RECT *win_rect, else { escape.drawable = X11DRV_get_whole_window( top ); + escape.visual = default_visual; /* FIXME: use the right visual for other process window */ }
if (!escape.drawable) return; /* don't create a GC for foreign windows */ diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index ee5bbe07dd4..8e383ae4c48 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -344,6 +344,7 @@ struct x11drv_escape_set_drawable Drawable drawable; /* X drawable */ int mode; /* ClipByChildren or IncludeInferiors */ RECT dc_rect; /* DC rectangle relative to drawable */ + XVisualInfo visual; /* X visual used by drawable, may be unspecified if no change is needed */ };
struct x11drv_escape_get_drawable diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c index 48e2fea4280..66c3a337263 100644 --- a/dlls/winex11.drv/xrender.c +++ b/dlls/winex11.drv/xrender.c @@ -256,6 +256,7 @@ static BOOL is_wxrformat_compatible_with_visual( const WineXRenderFormatTemplate if ((fmt->redMask << fmt->red) != visual->red_mask) return FALSE; if ((fmt->greenMask << fmt->green) != visual->green_mask) return FALSE; if ((fmt->blueMask << fmt->blue) != visual->blue_mask) return FALSE; + if (fmt->alphaMask && visual->class != TrueColor) return FALSE; return TRUE; }
@@ -983,8 +984,25 @@ static INT xrenderdrv_ExtEscape( PHYSDEV dev, INT escape, INT in_count, LPCVOID BOOL ret = dev->funcs->pExtEscape( dev, escape, in_count, in_data, out_count, out_data ); if (ret) { + const struct x11drv_escape_set_drawable *set = in_data; + enum wxr_format format = physdev->format; + unsigned int i; + + if (set->visual.visual) + { + for (i = 0; i < WXR_NB_FORMATS; ++i) + { + if (!pict_formats[i]) continue; + if (is_wxrformat_compatible_with_visual( &wxr_formats_template[i], &set->visual )) + { + format = i; + break; + } + } + if (i == WXR_NB_FORMATS) WARN( "Format not found for drawable visual.\n" ); + } free_xrender_picture( physdev ); - set_physdev_format( physdev, default_format ); + set_physdev_format( physdev, format ); } return ret; }
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=151232
Your paranoid android.
=== debian11 (build log) ===
error: patch failed: dlls/winex11.drv/window.c:2695 error: patch failed: dlls/winex11.drv/window.c:2709 Task: Patch failed to apply
=== debian11b (build log) ===
error: patch failed: dlls/winex11.drv/window.c:2695 error: patch failed: dlls/winex11.drv/window.c:2709 Task: Patch failed to apply
This merge request was approved by Rémi Bernon.