[PATCH 0/3] MR7255: winex11.drv: Choose alpha-enabled xrender format for argb drawables. (alt)
From: Rémi Bernon <rbernon(a)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 -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/7255
From: Paul Gofman <pgofman(a)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..78145c7b594 100644 --- a/dlls/winex11.drv/xrender.c +++ b/dlls/winex11.drv/xrender.c @@ -250,15 +250,13 @@ 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; + if (fmt->alphaMask) return FALSE; return TRUE; } @@ -278,7 +276,7 @@ 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 )) { pict_formats[i] = pXRenderFindVisualFormat(gdi_display, default_visual.visual); if (!pict_formats[i]) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/7255
From: Paul Gofman <pgofman(a)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 | 21 +++++++++++++++++++-- 4 files changed, 23 insertions(+), 2 deletions(-) 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 78145c7b594..fe5a155381a 100644 --- a/dlls/winex11.drv/xrender.c +++ b/dlls/winex11.drv/xrender.c @@ -256,7 +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) return FALSE; + if (fmt->alphaMask && visual->visualid == default_visual.visualid) return FALSE; return TRUE; } @@ -983,8 +983,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; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/7255
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=151230 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
participants (3)
-
Marvin -
Paul Gofman -
Rémi Bernon