xserver: Branch 'server-1.20-branch' - 2 commits

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jul 29 18:16:19 UTC 2021


 hw/xfree86/drivers/modesetting/present.c |    3 +++
 present/present.c                        |   10 +++++++++-
 randr/randr.c                            |   27 +++++++++++++++++++++++++++
 randr/randrstr.h                         |    2 ++
 4 files changed, 41 insertions(+), 1 deletion(-)

New commits:
commit f85e4edba489316950fc3422f39e3c2ef8fb1ac5
Author: Łukasz Spintzyk <lukasz.spintzyk at synaptics.com>
Date:   Thu Jul 22 13:12:05 2021 +0200

    modesetting: unflip not possible when glamor is not set
    
    This is fixing crashes of xfce when running under qemu
    
    (cherry picked from commit 8836b9d243444031b6396d39d345f2f83b5fa6a9)

diff --git a/hw/xfree86/drivers/modesetting/present.c b/hw/xfree86/drivers/modesetting/present.c
index 02671c594..186309a29 100644
--- a/hw/xfree86/drivers/modesetting/present.c
+++ b/hw/xfree86/drivers/modesetting/present.c
@@ -257,6 +257,9 @@ ms_present_check_unflip(RRCrtcPtr crtc,
         pixmap->devKind != drmmode_bo_get_pitch(&ms->drmmode.front_bo))
         return FALSE;
 
+    if (!ms->drmmode.glamor)
+        return FALSE;
+
 #ifdef GBM_BO_WITH_MODIFIERS
     /* Check if buffer format/modifier is supported by all active CRTCs */
     gbm = glamor_gbm_bo_from_pixmap(screen, pixmap);
commit b03d7184b7906121a432b05473675937ab6c0f1e
Author: Łukasz Spintzyk <lukasz.spintzyk at synaptics.com>
Date:   Mon Jul 19 14:25:28 2021 +0200

    present: fallback get_crtc to return crtc belonging to screen with 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
    
    (cherry picked from commit d6c02ffd9c910637f6b3b7249507998e9e45f93c)

diff --git a/present/present.c b/present/present.c
index 3eddb7434..d81095375 100644
--- a/present/present.c
+++ b/present/present.c
@@ -59,11 +59,19 @@ present_get_crtc(WindowPtr window)
 {
     ScreenPtr                   screen = window->drawable.pScreen;
     present_screen_priv_ptr     screen_priv = present_screen_priv(screen);
+    RRCrtcPtr                   crtc = 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


More information about the xorg-commit mailing list