diff --git a/U_present-get_crtc-should-not-return-crtc-when-its-scr.patch b/U_present-get_crtc-should-not-return-crtc-when-its-scr.patch new file mode 100644 index 0000000..cc15701 --- /dev/null +++ b/U_present-get_crtc-should-not-return-crtc-when-its-scr.patch @@ -0,0 +1,96 @@ +From 857f4de8a8fc14a0bce566baf07b0eedc1b6b5b5 Mon Sep 17 00:00:00 2001 +From: Lukasz Spintzyk +Date: Mon, 19 Jul 2021 08:17:09 +0200 +Subject: [PATCH xserver] present: get_crtc should not return crtc when its + screen does not have present extension + +Since crtc can belong to secondary output that may not have present +extension enabled we should fallback to first enabled crtc or fake crtc. + +Fix for issue xorg/xserver#1195 +--- + present/present.c | 11 ++++++++++- + randr/randr.c | 27 +++++++++++++++++++++++++++ + randr/randrstr.h | 2 ++ + 3 files changed, 39 insertions(+), 1 deletion(-) + +diff --git a/present/present.c b/present/present.c +index 3eddb7434..66411212b 100644 +--- a/present/present.c ++++ b/present/present.c +@@ -59,11 +59,20 @@ present_get_crtc(WindowPtr window) + { + ScreenPtr screen = window->drawable.pScreen; + present_screen_priv_ptr screen_priv = present_screen_priv(screen); ++ RRCrtcPtr crtc = NULL; ++ RROutputPtr firstOutput = NULL; + + if (!screen_priv) + return NULL; + +- return screen_priv->get_crtc(screen_priv, window); ++ crtc = screen_priv->get_crtc(screen_priv, window); ++ if (crtc && !present_screen_priv(crtc->pScreen)) { ++ crtc = RRFirstEnabledCrtc(screen); ++ } ++ if (crtc && !present_screen_priv(crtc->pScreen)) { ++ crtc = NULL; ++ } ++ return crtc; + } + + /* +diff --git a/randr/randr.c b/randr/randr.c +index 5db8b5ced..afc867ea9 100644 +--- a/randr/randr.c ++++ b/randr/randr.c +@@ -693,6 +693,33 @@ RRFirstOutput(ScreenPtr pScreen) + return NULL; + } + ++RRCrtcPtr ++RRFirstEnabledCrtc(ScreenPtr pScreen) ++{ ++ rrScrPriv(pScreen); ++ RROutputPtr output; ++ int i, j; ++ ++ if (!pScrPriv) ++ return NULL; ++ ++ if (pScrPriv->primaryOutput && pScrPriv->primaryOutput->crtc && ++ pScrPriv->primaryOutput->pScreen == pScreen) ++ return pScrPriv->primaryOutput->crtc; ++ ++ for (i = 0; i < pScrPriv->numCrtcs; i++) { ++ RRCrtcPtr crtc = pScrPriv->crtcs[i]; ++ ++ for (j = 0; j < pScrPriv->numOutputs; j++) { ++ output = pScrPriv->outputs[j]; ++ if (output->crtc == crtc && crtc->mode) ++ return crtc; ++ } ++ } ++ return NULL; ++} ++ ++ + CARD16 + RRVerticalRefresh(xRRModeInfo * mode) + { +diff --git a/randr/randrstr.h b/randr/randrstr.h +index 0b95d6e25..28ba4ea91 100644 +--- a/randr/randrstr.h ++++ b/randr/randrstr.h +@@ -593,6 +593,8 @@ extern _X_EXPORT Bool RRScreenInit(ScreenPtr pScreen); + + extern _X_EXPORT RROutputPtr RRFirstOutput(ScreenPtr pScreen); + ++extern _X_EXPORT RRCrtcPtr RRFirstEnabledCrtc(ScreenPtr pScreen); ++ + extern _X_EXPORT Bool RROutputSetNonDesktop(RROutputPtr output, Bool non_desktop); + + extern _X_EXPORT CARD16 +-- +2.30.2 + diff --git a/xorg-x11-server.changes b/xorg-x11-server.changes index 6a5022b..76d7ef4 100644 --- a/xorg-x11-server.changes +++ b/xorg-x11-server.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Thu Jul 22 09:30:11 UTC 2021 - Dirk Müller + +- add U_present-get_crtc-should-not-return-crtc-when-its-scr.patch (bsc#1188559) + https://gitlab.freedesktop.org/xorg/xserver/-/issues/1195 + ------------------------------------------------------------------- Fri Jul 9 08:26:19 UTC 2021 - Stefan Dirsch diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec index 5b5b599..d7399fa 100644 --- a/xorg-x11-server.spec +++ b/xorg-x11-server.spec @@ -252,6 +252,7 @@ Patch1801: U_Fix-segfault-on-probing-a-non-PCI-platform-device-on.patch Patch1900: u_no-lto-for-tests.patch Patch1910: u_modesetting-Fix-dirty-updates-for-sw-rotation.patch +Patch1911: U_present-get_crtc-should-not-return-crtc-when-its-scr.patch %description This package contains the X.Org Server. @@ -403,6 +404,7 @@ sh %{SOURCE92} --verify . %{SOURCE91} %patch1801 -p1 %patch1900 -p1 %patch1910 -p1 +%patch1911 -p1 %build %global _lto_cflags %{?_lto_cflags} -ffat-lto-objects