Revert "xwayland/glamor: Avoid implicit redirection with depth 32 parent windows"
This commit is meant as an optimization, but has been identified as the
cause of multiple regressions reported in issues xorg/xserver#1564 and
xorg/xserver#1565.
Reverting that commit alone fixes the aforementioned issues, the rest of
the commits from xorg/xserver!1131 seem harmless and do not need
reverting.
This reverts commit d6c5999e94
.
See-also: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1564
See-also: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1565
This commit is contained in:
parent
94deed272c
commit
c4ee35ef24
|
@ -25,8 +25,6 @@
|
||||||
|
|
||||||
#include <xwayland-config.h>
|
#include <xwayland-config.h>
|
||||||
|
|
||||||
#include <compositeext.h>
|
|
||||||
|
|
||||||
#define MESA_EGL_NO_X11_HEADERS
|
#define MESA_EGL_NO_X11_HEADERS
|
||||||
#define EGL_NO_X11
|
#define EGL_NO_X11
|
||||||
#include <glamor_egl.h>
|
#include <glamor_egl.h>
|
||||||
|
@ -895,108 +893,6 @@ xwl_glamor_allow_commits(struct xwl_window *xwl_window)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
xwl_avoid_implicit_redirect(WindowPtr window)
|
|
||||||
{
|
|
||||||
ScreenPtr screen = window->drawable.pScreen;
|
|
||||||
WindowOptPtr parent_optional;
|
|
||||||
VisualPtr parent_visual = NULL;
|
|
||||||
VisualPtr window_visual = NULL;
|
|
||||||
DepthPtr depth32 = NULL;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (!window->optional)
|
|
||||||
return;
|
|
||||||
|
|
||||||
parent_optional = FindWindowWithOptional(window)->optional;
|
|
||||||
if (window->optional == parent_optional ||
|
|
||||||
window->optional->visual == parent_optional->visual ||
|
|
||||||
CompositeIsImplicitRedirectException(screen, parent_optional->visual,
|
|
||||||
window->optional->visual))
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (i = 0; i < screen->numDepths; i++) {
|
|
||||||
if (screen->allowedDepths[i].depth == 32) {
|
|
||||||
depth32 = &screen->allowedDepths[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!depth32)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (i = 0; i < depth32->numVids; i++) {
|
|
||||||
XID argb_vid = depth32->vids[i];
|
|
||||||
|
|
||||||
if (argb_vid != parent_optional->visual)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!compIsAlternateVisual(screen, argb_vid))
|
|
||||||
break;
|
|
||||||
|
|
||||||
for (i = 0; i < screen->numVisuals; i++) {
|
|
||||||
if (screen->visuals[i].vid == argb_vid) {
|
|
||||||
parent_visual = &screen->visuals[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!parent_visual)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (i = 0; i < screen->numVisuals; i++) {
|
|
||||||
if (screen->visuals[i].vid == window->optional->visual) {
|
|
||||||
window_visual = &screen->visuals[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((window_visual->class != TrueColor &&
|
|
||||||
window_visual->class != DirectColor) ||
|
|
||||||
window_visual->redMask != parent_visual->redMask ||
|
|
||||||
window_visual->greenMask != parent_visual->greenMask ||
|
|
||||||
window_visual->blueMask != parent_visual->blueMask ||
|
|
||||||
window_visual->offsetRed != parent_visual->offsetRed ||
|
|
||||||
window_visual->offsetGreen != parent_visual->offsetGreen ||
|
|
||||||
window_visual->offsetBlue != parent_visual->offsetBlue)
|
|
||||||
return;
|
|
||||||
|
|
||||||
CompositeRegisterImplicitRedirectionException(screen, parent_visual->vid, window_visual->vid);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Bool
|
|
||||||
xwl_glamor_create_window(WindowPtr window)
|
|
||||||
{
|
|
||||||
ScreenPtr screen = window->drawable.pScreen;
|
|
||||||
struct xwl_screen *xwl_screen = xwl_screen_get(screen);
|
|
||||||
Bool ret;
|
|
||||||
|
|
||||||
if (window->parent)
|
|
||||||
xwl_avoid_implicit_redirect(window);
|
|
||||||
|
|
||||||
screen->CreateWindow = xwl_screen->CreateWindow;
|
|
||||||
ret = (*screen->CreateWindow) (window);
|
|
||||||
xwl_screen->CreateWindow = screen->CreateWindow;
|
|
||||||
screen->CreateWindow = xwl_glamor_create_window;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
xwl_glamor_reparent_window(WindowPtr window, WindowPtr old_parent)
|
|
||||||
{
|
|
||||||
ScreenPtr screen = window->drawable.pScreen;
|
|
||||||
struct xwl_screen *xwl_screen = xwl_screen_get(screen);
|
|
||||||
|
|
||||||
xwl_avoid_implicit_redirect(window);
|
|
||||||
|
|
||||||
screen->ReparentWindow = xwl_screen->ReparentWindow;
|
|
||||||
(*screen->ReparentWindow) (window, old_parent);
|
|
||||||
xwl_screen->ReparentWindow = screen->ReparentWindow;
|
|
||||||
screen->ReparentWindow = xwl_glamor_reparent_window;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Bool
|
static Bool
|
||||||
xwl_glamor_create_screen_resources(ScreenPtr screen)
|
xwl_glamor_create_screen_resources(ScreenPtr screen)
|
||||||
{
|
{
|
||||||
|
@ -1011,11 +907,6 @@ xwl_glamor_create_screen_resources(ScreenPtr screen)
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
xwl_screen->CreateWindow = screen->CreateWindow;
|
|
||||||
screen->CreateWindow = xwl_glamor_create_window;
|
|
||||||
xwl_screen->ReparentWindow = screen->ReparentWindow;
|
|
||||||
screen->ReparentWindow = xwl_glamor_reparent_window;
|
|
||||||
|
|
||||||
if (xwl_screen->rootless) {
|
if (xwl_screen->rootless) {
|
||||||
screen->devPrivate =
|
screen->devPrivate =
|
||||||
fbCreatePixmap(screen, 0, 0, screen->rootDepth, 0);
|
fbCreatePixmap(screen, 0, 0, screen->rootDepth, 0);
|
||||||
|
|
|
@ -70,14 +70,12 @@ struct xwl_screen {
|
||||||
|
|
||||||
CreateScreenResourcesProcPtr CreateScreenResources;
|
CreateScreenResourcesProcPtr CreateScreenResources;
|
||||||
CloseScreenProcPtr CloseScreen;
|
CloseScreenProcPtr CloseScreen;
|
||||||
CreateWindowProcPtr CreateWindow;
|
|
||||||
RealizeWindowProcPtr RealizeWindow;
|
RealizeWindowProcPtr RealizeWindow;
|
||||||
UnrealizeWindowProcPtr UnrealizeWindow;
|
UnrealizeWindowProcPtr UnrealizeWindow;
|
||||||
DestroyWindowProcPtr DestroyWindow;
|
DestroyWindowProcPtr DestroyWindow;
|
||||||
XYToWindowProcPtr XYToWindow;
|
XYToWindowProcPtr XYToWindow;
|
||||||
SetWindowPixmapProcPtr SetWindowPixmap;
|
SetWindowPixmapProcPtr SetWindowPixmap;
|
||||||
ChangeWindowAttributesProcPtr ChangeWindowAttributes;
|
ChangeWindowAttributesProcPtr ChangeWindowAttributes;
|
||||||
ReparentWindowProcPtr ReparentWindow;
|
|
||||||
ResizeWindowProcPtr ResizeWindow;
|
ResizeWindowProcPtr ResizeWindow;
|
||||||
MoveWindowProcPtr MoveWindow;
|
MoveWindowProcPtr MoveWindow;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue