xserver: Branch 'master' - 6 commits

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Apr 16 11:05:59 UTC 2021


 configure.ac                              |    2 
 hw/dmx/dmxextension.c                     |    3 
 hw/dmx/dmxinit.c                          |    2 
 hw/xfree86/drivers/modesetting/dri2.c     |    2 
 hw/xfree86/drivers/modesetting/driver.c   |    9 -
 hw/xfree86/drivers/modesetting/driver.h   |    2 
 hw/xfree86/drivers/modesetting/pageflip.c |    2 
 hw/xfree86/drivers/modesetting/present.c  |    2 
 hw/xfree86/drivers/modesetting/vblank.c   |  191 ++++++------------------------
 present/present_scmd.c                    |   18 ++
 present/present_vblank.c                  |    4 
 randr/randrstr.h                          |    5 
 randr/rrcrtc.c                            |   43 ++++++
 randr/rrprovider.c                        |    2 
 14 files changed, 120 insertions(+), 167 deletions(-)

New commits:
commit 5be3b80b8d084ca5721be8791910d5827d1b6014
Author: Łukasz Spintzyk <lukasz.spintzyk at synaptics.com>
Date:   Fri Sep 18 14:32:01 2020 +0200

    modesetting: Remove few common functions from ms namespace
    
    A lot of that code is the same as in xf86-amdgpu and xf86-nouveau drivers. By removing that functions from
    ms namespace we can move that code to common implementation.
    
    Signed-off-by: Łukasz Spintzyk <lukasz.spintzyk at synaptics.com>

diff --git a/hw/xfree86/drivers/modesetting/dri2.c b/hw/xfree86/drivers/modesetting/dri2.c
index e893da422..7ff52be6d 100644
--- a/hw/xfree86/drivers/modesetting/dri2.c
+++ b/hw/xfree86/drivers/modesetting/dri2.c
@@ -552,7 +552,7 @@ can_exchange(ScrnInfoPtr scrn, DrawablePtr draw,
             return FALSE;
 #endif
 
-        if (ms_crtc_on(config->crtc[i]))
+        if (xf86_crtc_on(config->crtc[i]))
             num_crtcs_on++;
     }
 
diff --git a/hw/xfree86/drivers/modesetting/driver.h b/hw/xfree86/drivers/modesetting/driver.h
index 77afc8302..114971048 100644
--- a/hw/xfree86/drivers/modesetting/driver.h
+++ b/hw/xfree86/drivers/modesetting/driver.h
@@ -200,7 +200,7 @@ void ms_drm_abort(ScrnInfoPtr scrn,
                   void *match_data);
 void ms_drm_abort_seq(ScrnInfoPtr scrn, uint32_t seq);
 
-Bool ms_crtc_on(xf86CrtcPtr crtc);
+Bool xf86_crtc_on(xf86CrtcPtr crtc);
 
 xf86CrtcPtr ms_dri2_crtc_covering_drawable(DrawablePtr pDraw);
 RRCrtcPtr   ms_randr_crtc_covering_drawable(DrawablePtr pDraw);
diff --git a/hw/xfree86/drivers/modesetting/pageflip.c b/hw/xfree86/drivers/modesetting/pageflip.c
index 9c199668f..aaa284bf6 100644
--- a/hw/xfree86/drivers/modesetting/pageflip.c
+++ b/hw/xfree86/drivers/modesetting/pageflip.c
@@ -313,7 +313,7 @@ ms_do_pageflip(ScreenPtr screen,
     for (i = 0; i < config->num_crtc; i++) {
         xf86CrtcPtr crtc = config->crtc[i];
 
-        if (!ms_crtc_on(crtc))
+        if (!xf86_crtc_on(crtc))
             continue;
 
         if (!queue_flip_on_crtc(screen, crtc, flipdata,
diff --git a/hw/xfree86/drivers/modesetting/present.c b/hw/xfree86/drivers/modesetting/present.c
index 869a38c8e..f0a0e2704 100644
--- a/hw/xfree86/drivers/modesetting/present.c
+++ b/hw/xfree86/drivers/modesetting/present.c
@@ -259,7 +259,7 @@ ms_present_check_unflip(RRCrtcPtr crtc,
         if (drmmode_crtc->rotate_bo.gbm)
             return FALSE;
 
-        if (ms_crtc_on(config->crtc[i]))
+        if (xf86_crtc_on(config->crtc[i]))
             num_crtcs_on++;
     }
 
diff --git a/hw/xfree86/drivers/modesetting/vblank.c b/hw/xfree86/drivers/modesetting/vblank.c
index 25784777e..c8da476b5 100644
--- a/hw/xfree86/drivers/modesetting/vblank.c
+++ b/hw/xfree86/drivers/modesetting/vblank.c
@@ -49,7 +49,7 @@
 static struct xorg_list ms_drm_queue;
 static uint32_t ms_drm_seq;
 
-static void ms_box_intersect(BoxPtr dest, BoxPtr a, BoxPtr b)
+static void box_intersect(BoxPtr dest, BoxPtr a, BoxPtr b)
 {
     dest->x1 = a->x1 > b->x1 ? a->x1 : b->x1;
     dest->x2 = a->x2 < b->x2 ? a->x2 : b->x2;
@@ -64,7 +64,7 @@ static void ms_box_intersect(BoxPtr dest, BoxPtr a, BoxPtr b)
         dest->x1 = dest->x2 = dest->y1 = dest->y2 = 0;
 }
 
-static void ms_randr_crtc_box(RRCrtcPtr crtc, BoxPtr crtc_box)
+static void rr_crtc_box(RRCrtcPtr crtc, BoxPtr crtc_box)
 {
     if (crtc->mode) {
         crtc_box->x1 = crtc->x;
@@ -86,25 +86,25 @@ static void ms_randr_crtc_box(RRCrtcPtr crtc, BoxPtr crtc_box)
         crtc_box->x1 = crtc_box->x2 = crtc_box->y1 = crtc_box->y2 = 0;
 }
 
-static int ms_box_area(BoxPtr box)
+static int box_area(BoxPtr box)
 {
     return (int)(box->x2 - box->x1) * (int)(box->y2 - box->y1);
 }
 
-static Bool rr_crtc_on(RRCrtcPtr crtc, Bool crtc_is_ms_hint)
+static Bool rr_crtc_on(RRCrtcPtr crtc, Bool crtc_is_xf86_hint)
 {
     if (!crtc) {
         return FALSE;
     }
-    if (crtc_is_ms_hint && crtc->devPrivate) {
-         return ms_crtc_on(crtc->devPrivate);
+    if (crtc_is_xf86_hint && crtc->devPrivate) {
+         return xf86_crtc_on(crtc->devPrivate);
     } else {
         return !!crtc->mode;
     }
 }
 
 Bool
-ms_crtc_on(xf86CrtcPtr crtc)
+xf86_crtc_on(xf86CrtcPtr crtc)
 {
     drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
 
@@ -117,7 +117,7 @@ ms_crtc_on(xf86CrtcPtr crtc)
  * 'box', then prefer the crtc with greater coverage.
  */
 static RRCrtcPtr
-ms_covering_randr_crtc(ScreenPtr pScreen, BoxPtr box, Bool screen_is_ms)
+rr_crtc_covering_box(ScreenPtr pScreen, BoxPtr box, Bool screen_is_xf86_hint)
 {
     rrScrPrivPtr pScrPriv;
     RRCrtcPtr crtc, best_crtc;
@@ -140,12 +140,12 @@ ms_covering_randr_crtc(ScreenPtr pScreen, BoxPtr box, Bool screen_is_ms)
         crtc = pScrPriv->crtcs[c];
 
         /* If the CRTC is off, treat it as not covering */
-        if (!rr_crtc_on(crtc, screen_is_ms))
+        if (!rr_crtc_on(crtc, screen_is_xf86_hint))
             continue;
 
-        ms_randr_crtc_box(crtc, &crtc_box);
-        ms_box_intersect(&cover_box, &crtc_box, box);
-        coverage = ms_box_area(&cover_box);
+        rr_crtc_box(crtc, &crtc_box);
+        box_intersect(&cover_box, &crtc_box, box);
+        coverage = box_area(&cover_box);
         if (coverage > best_coverage) {
             best_crtc = crtc;
             best_coverage = coverage;
@@ -156,7 +156,7 @@ ms_covering_randr_crtc(ScreenPtr pScreen, BoxPtr box, Bool screen_is_ms)
 }
 
 static RRCrtcPtr
-ms_covering_randr_crtc_on_secondary(ScreenPtr pScreen, BoxPtr box)
+rr_crtc_covering_box_on_secondary(ScreenPtr pScreen, BoxPtr box)
 {
     if (!pScreen->isGPU) {
         ScreenPtr secondary;
@@ -166,7 +166,7 @@ ms_covering_randr_crtc_on_secondary(ScreenPtr pScreen, BoxPtr box)
             if (!secondary->is_output_secondary)
                 continue;
 
-            crtc = ms_covering_randr_crtc(secondary, box, FALSE);
+            crtc = rr_crtc_covering_box(secondary, box, FALSE);
             if (crtc)
                 return crtc;
         }
@@ -187,7 +187,7 @@ ms_dri2_crtc_covering_drawable(DrawablePtr pDraw)
     box.x2 = box.x1 + pDraw->width;
     box.y2 = box.y1 + pDraw->height;
 
-    crtc = ms_covering_randr_crtc(pScreen, &box, TRUE);
+    crtc = rr_crtc_covering_box(pScreen, &box, TRUE);
     if (crtc) {
         return crtc->devPrivate;
     }
@@ -206,9 +206,9 @@ ms_randr_crtc_covering_drawable(DrawablePtr pDraw)
     box.x2 = box.x1 + pDraw->width;
     box.y2 = box.y1 + pDraw->height;
 
-    crtc = ms_covering_randr_crtc(pScreen, &box, TRUE);
+    crtc = rr_crtc_covering_box(pScreen, &box, TRUE);
     if (!crtc) {
-        crtc = ms_covering_randr_crtc_on_secondary(pScreen, &box);
+        crtc = rr_crtc_covering_box_on_secondary(pScreen, &box);
     }
     return crtc;
 }
commit c282be503e267afdd050df837d4cf61e0e7287b7
Author: Łukasz Spintzyk <lukasz.spintzyk at synaptics.com>
Date:   Fri Sep 18 14:31:53 2020 +0200

    modesetting: remove unnecessary ms_covering_xf86_crtc dup of ms_covering_randr_crtc
    
    Signed-off-by: Łukasz Spintzyk <lukasz.spintzyk at synaptics.com>

diff --git a/hw/xfree86/drivers/modesetting/vblank.c b/hw/xfree86/drivers/modesetting/vblank.c
index 2337a37ad..25784777e 100644
--- a/hw/xfree86/drivers/modesetting/vblank.c
+++ b/hw/xfree86/drivers/modesetting/vblank.c
@@ -64,19 +64,6 @@ static void ms_box_intersect(BoxPtr dest, BoxPtr a, BoxPtr b)
         dest->x1 = dest->x2 = dest->y1 = dest->y2 = 0;
 }
 
-static void ms_crtc_box(xf86CrtcPtr crtc, BoxPtr crtc_box)
-{
-    if (crtc->enabled) {
-        crtc_box->x1 = crtc->x;
-        crtc_box->x2 =
-            crtc->x + xf86ModeWidth(&crtc->mode, crtc->rotation);
-        crtc_box->y1 = crtc->y;
-        crtc_box->y2 =
-            crtc->y + xf86ModeHeight(&crtc->mode, crtc->rotation);
-    } else
-        crtc_box->x1 = crtc_box->x2 = crtc_box->y1 = crtc_box->y2 = 0;
-}
-
 static void ms_randr_crtc_box(RRCrtcPtr crtc, BoxPtr crtc_box)
 {
     if (crtc->mode) {
@@ -124,110 +111,11 @@ ms_crtc_on(xf86CrtcPtr crtc)
     return crtc->enabled && drmmode_crtc->dpms_mode == DPMSModeOn;
 }
 
-/*
- * Return the first output which is connected to an active CRTC on this screen.
- *
- * RRFirstOutput() will return an output from a secondary screen if it is primary,
- * which is not the behavior that ms_covering_crtc() wants.
- */
-
-static RROutputPtr ms_first_output(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;
-    }
-
-    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)
-                return output;
-        }
-    }
-    return NULL;
-}
 
 /*
  * Return the crtc covering 'box'. If two crtcs cover a portion of
  * 'box', then prefer the crtc with greater coverage.
  */
-
-static xf86CrtcPtr
-ms_covering_xf86_crtc(ScreenPtr pScreen, BoxPtr box, Bool screen_is_ms)
-{
-    ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
-    xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-    xf86CrtcPtr crtc, best_crtc;
-    int coverage, best_coverage;
-    int c;
-    BoxRec crtc_box, cover_box;
-    Bool crtc_on;
-
-    best_crtc = NULL;
-    best_coverage = 0;
-
-    if (!xf86_config)
-        return NULL;
-
-    for (c = 0; c < xf86_config->num_crtc; c++) {
-        crtc = xf86_config->crtc[c];
-
-        if (screen_is_ms)
-            crtc_on = ms_crtc_on(crtc);
-        else
-            crtc_on = crtc->enabled;
-
-        /* If the CRTC is off, treat it as not covering */
-        if (!crtc_on)
-            continue;
-
-        ms_crtc_box(crtc, &crtc_box);
-        ms_box_intersect(&cover_box, &crtc_box, box);
-        coverage = ms_box_area(&cover_box);
-        if (coverage > best_coverage) {
-            best_crtc = crtc;
-            best_coverage = coverage;
-        }
-    }
-
-    /* Fallback to primary crtc for drawable's on secondary outputs */
-    if (best_crtc == NULL && !pScreen->isGPU) {
-        RROutputPtr primary_output = NULL;
-        ScreenPtr secondary;
-
-        if (dixPrivateKeyRegistered(rrPrivKey))
-            primary_output = ms_first_output(scrn->pScreen);
-        if (!primary_output || !primary_output->crtc)
-            return NULL;
-
-        crtc = primary_output->crtc->devPrivate;
-        if (!ms_crtc_on(crtc))
-            return NULL;
-
-        xorg_list_for_each_entry(secondary, &pScreen->secondary_list, secondary_head) {
-            if (!secondary->is_output_secondary)
-                continue;
-
-            if (ms_covering_xf86_crtc(secondary, box, FALSE)) {
-                /* The drawable is on a secondary output, return primary crtc */
-                return crtc;
-            }
-        }
-    }
-
-    return best_crtc;
-}
-
 static RRCrtcPtr
 ms_covering_randr_crtc(ScreenPtr pScreen, BoxPtr box, Bool screen_is_ms)
 {
@@ -291,6 +179,7 @@ xf86CrtcPtr
 ms_dri2_crtc_covering_drawable(DrawablePtr pDraw)
 {
     ScreenPtr pScreen = pDraw->pScreen;
+    RRCrtcPtr crtc = NULL;
     BoxRec box;
 
     box.x1 = pDraw->x;
@@ -298,7 +187,11 @@ ms_dri2_crtc_covering_drawable(DrawablePtr pDraw)
     box.x2 = box.x1 + pDraw->width;
     box.y2 = box.y1 + pDraw->height;
 
-    return ms_covering_xf86_crtc(pScreen, &box, TRUE);
+    crtc = ms_covering_randr_crtc(pScreen, &box, TRUE);
+    if (crtc) {
+        return crtc->devPrivate;
+    }
+    return NULL;
 }
 
 RRCrtcPtr
commit b923364c5ec8251e81b4aa5fd451d9d7bb038009
Author: Łukasz Spintzyk <lukasz.spintzyk at synaptics.com>
Date:   Fri Sep 18 14:31:47 2020 +0200

    modesetting: Find crtc on secondary outputs as fallback instead of returning primary crtc
    
    Signed-off-by: Łukasz Spintzyk <lukasz.spintzyk at synaptics.com>

diff --git a/hw/xfree86/drivers/modesetting/vblank.c b/hw/xfree86/drivers/modesetting/vblank.c
index b02d75aef..2337a37ad 100644
--- a/hw/xfree86/drivers/modesetting/vblank.c
+++ b/hw/xfree86/drivers/modesetting/vblank.c
@@ -104,6 +104,18 @@ static int ms_box_area(BoxPtr box)
     return (int)(box->x2 - box->x1) * (int)(box->y2 - box->y1);
 }
 
+static Bool rr_crtc_on(RRCrtcPtr crtc, Bool crtc_is_ms_hint)
+{
+    if (!crtc) {
+        return FALSE;
+    }
+    if (crtc_is_ms_hint && crtc->devPrivate) {
+         return ms_crtc_on(crtc->devPrivate);
+    } else {
+        return !!crtc->mode;
+    }
+}
+
 Bool
 ms_crtc_on(xf86CrtcPtr crtc)
 {
@@ -219,13 +231,11 @@ ms_covering_xf86_crtc(ScreenPtr pScreen, BoxPtr box, Bool screen_is_ms)
 static RRCrtcPtr
 ms_covering_randr_crtc(ScreenPtr pScreen, BoxPtr box, Bool screen_is_ms)
 {
-    ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
     rrScrPrivPtr pScrPriv;
     RRCrtcPtr crtc, best_crtc;
     int coverage, best_coverage;
     int c;
     BoxRec crtc_box, cover_box;
-    Bool crtc_on;
 
     best_crtc = NULL;
     best_coverage = 0;
@@ -241,14 +251,8 @@ ms_covering_randr_crtc(ScreenPtr pScreen, BoxPtr box, Bool screen_is_ms)
     for (c = 0; c < pScrPriv->numCrtcs; c++) {
         crtc = pScrPriv->crtcs[c];
 
-        if (screen_is_ms) {
-            crtc_on = ms_crtc_on((xf86CrtcPtr) crtc->devPrivate);
-        } else {
-            crtc_on = !!crtc->mode;
-        }
-
         /* If the CRTC is off, treat it as not covering */
-        if (!crtc_on)
+        if (!rr_crtc_on(crtc, screen_is_ms))
             continue;
 
         ms_randr_crtc_box(crtc, &crtc_box);
@@ -260,32 +264,27 @@ ms_covering_randr_crtc(ScreenPtr pScreen, BoxPtr box, Bool screen_is_ms)
         }
     }
 
-    /* Fallback to primary crtc for drawable's on secondary outputs */
-    if (best_crtc == NULL && !pScreen->isGPU) {
-        RROutputPtr primary_output = NULL;
-        ScreenPtr secondary;
-
-        if (dixPrivateKeyRegistered(rrPrivKey))
-            primary_output = ms_first_output(scrn->pScreen);
-        if (!primary_output || !primary_output->crtc)
-            return NULL;
+    return best_crtc;
+}
 
-        crtc = primary_output->crtc;
-        if (!ms_crtc_on((xf86CrtcPtr) crtc->devPrivate))
-            return NULL;
+static RRCrtcPtr
+ms_covering_randr_crtc_on_secondary(ScreenPtr pScreen, BoxPtr box)
+{
+    if (!pScreen->isGPU) {
+        ScreenPtr secondary;
+        RRCrtcPtr crtc = NULL;
 
         xorg_list_for_each_entry(secondary, &pScreen->secondary_list, secondary_head) {
             if (!secondary->is_output_secondary)
                 continue;
 
-            if (ms_covering_randr_crtc(secondary, box, FALSE)) {
-                /* The drawable is on a secondary output, return primary crtc */
+            crtc = ms_covering_randr_crtc(secondary, box, FALSE);
+            if (crtc)
                 return crtc;
-            }
         }
     }
 
-    return best_crtc;
+    return NULL;
 }
 
 xf86CrtcPtr
@@ -306,6 +305,7 @@ RRCrtcPtr
 ms_randr_crtc_covering_drawable(DrawablePtr pDraw)
 {
     ScreenPtr pScreen = pDraw->pScreen;
+    RRCrtcPtr crtc = NULL;
     BoxRec box;
 
     box.x1 = pDraw->x;
@@ -313,7 +313,11 @@ ms_randr_crtc_covering_drawable(DrawablePtr pDraw)
     box.x2 = box.x1 + pDraw->width;
     box.y2 = box.y1 + pDraw->height;
 
-    return ms_covering_randr_crtc(pScreen, &box, TRUE);
+    crtc = ms_covering_randr_crtc(pScreen, &box, TRUE);
+    if (!crtc) {
+        crtc = ms_covering_randr_crtc_on_secondary(pScreen, &box);
+    }
+    return crtc;
 }
 
 static Bool
commit d2dce22b6775c772282ac2c0e224ef9685ab34fa
Author: Łukasz Spintzyk <lukasz.spintzyk at synaptics.com>
Date:   Fri Sep 18 14:31:34 2020 +0200

    present: fix msc offset calculation in screen mode
    
    Instead of getting the current msc value from the window crtc,
    which not exist take the last saved msc value saved in
    the window_priv struct
    
    Signed-off-by: Łukasz Spintzyk <lukasz.spintzyk at synaptics.com>

diff --git a/configure.ac b/configure.ac
index 445a80b3c..196d78b96 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2207,7 +2207,7 @@ if test "x$DMX" = xyes; then
 	fi
 	DMX_INCLUDES="$XEXT_INC $RENDER_INC $RECORD_INC"
 	XDMX_CFLAGS="$DMXMODULES_CFLAGS"
-	XDMX_LIBS="$FB_LIB $MI_LIB $XEXT_LIB $RENDER_LIB $RECORD_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $DRI3_LIB $PRESENT_LIB $MIEXT_SYNC_LIB $MIEXT_SHADOW_LIB $MIEXT_DAMAGE_LIB $COMPOSITE_LIB $DAMAGE_LIB $MAIN_LIB $DIX_LIB $RANDR_LIB $CONFIG_LIB $OS_LIB $FIXES_LIB"
+	XDMX_LIBS="$FB_LIB $MI_LIB $XEXT_LIB $RENDER_LIB $RECORD_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $DRI3_LIB $PRESENT_LIB $MIEXT_SYNC_LIB $MIEXT_SHADOW_LIB $MIEXT_DAMAGE_LIB $COMPOSITE_LIB $DAMAGE_LIB $MAIN_LIB $DIX_LIB $RANDR_LIB $RENDER_LIB $CONFIG_LIB $OS_LIB $FIXES_LIB"
 	XDMX_SYS_LIBS="$DMXMODULES_LIBS"
 	AC_SUBST([XDMX_CFLAGS])
 	AC_SUBST([XDMX_LIBS])
diff --git a/hw/dmx/dmxextension.c b/hw/dmx/dmxextension.c
index 504e5a00b..5b860481c 100644
--- a/hw/dmx/dmxextension.c
+++ b/hw/dmx/dmxextension.c
@@ -68,9 +68,6 @@
  * _any_ header files. */
 extern FontPtr defaultFont;
 
-/* Hack to get Present to build (present requires RandR) */
-RESTYPE RRCrtcType;
-
 /** This routine provides information to the DMX protocol extension
  * about a particular screen. */
 Bool
diff --git a/hw/dmx/dmxinit.c b/hw/dmx/dmxinit.c
index 07f147ceb..e0bb3b704 100644
--- a/hw/dmx/dmxinit.c
+++ b/hw/dmx/dmxinit.c
@@ -109,8 +109,6 @@ Bool dmxGLXSyncSwap = FALSE;
 Bool dmxGLXFinishSwap = FALSE;
 #endif
 
-RESTYPE RRProviderType = 0;
-
 Bool dmxIgnoreBadFontPaths = FALSE;
 
 Bool dmxAddRemoveScreens = FALSE;
diff --git a/present/present_scmd.c b/present/present_scmd.c
index efe1fd698..c8c701d72 100644
--- a/present/present_scmd.c
+++ b/present/present_scmd.c
@@ -634,8 +634,9 @@ present_scmd_update_window_crtc(WindowPtr window, RRCrtcPtr crtc, uint64_t new_m
         return;
     }
 
-    /* Crtc may have been turned off, just use whatever previous MSC we'd seen from this CRTC. */
-    if (present_get_ust_msc(window->drawable.pScreen, window_priv->crtc, &old_ust, &old_msc) != Success)
+    /* Crtc may have been turned off or be destroyed, just use whatever previous MSC we'd seen from this CRTC. */
+    if (!RRCrtcExists(window->drawable.pScreen, window_priv->crtc) ||
+        present_get_ust_msc(window->drawable.pScreen, window_priv->crtc, &old_ust, &old_msc) != Success)
         old_msc = window_priv->msc;
 
     window_priv->msc_offset += new_msc - old_msc;
diff --git a/randr/randrstr.h b/randr/randrstr.h
index 44076f496..8f427a48e 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -642,6 +642,11 @@ extern _X_EXPORT void
  */
 extern _X_EXPORT RRCrtcPtr RRCrtcCreate(ScreenPtr pScreen, void *devPrivate);
 
+/*
+ * Tests if findCrtc belongs to pScreen or secondary screens
+ */
+extern _X_EXPORT Bool RRCrtcExists(ScreenPtr pScreen, RRCrtcPtr findCrtc);
+
 /*
  * Set the allowed rotations on a CRTC
  */
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index c8626b982..3a9b620ab 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -27,7 +27,7 @@
 
 #include <X11/Xatom.h>
 
-RESTYPE RRCrtcType;
+RESTYPE RRCrtcType = 0;
 
 /*
  * Notify the CRTC of some change
@@ -960,6 +960,47 @@ RRCrtcGammaGet(RRCrtcPtr crtc)
     return ret;
 }
 
+static Bool RRCrtcInScreen(ScreenPtr pScreen, RRCrtcPtr findCrtc)
+{
+    rrScrPrivPtr pScrPriv;
+    int c;
+
+    if (pScreen == NULL)
+        return FALSE;
+
+    if (findCrtc == NULL)
+        return FALSE;
+
+    if (!dixPrivateKeyRegistered(rrPrivKey))
+        return FALSE;
+
+    pScrPriv = rrGetScrPriv(pScreen);
+    for (c = 0; c < pScrPriv->numCrtcs; c++) {
+        if (pScrPriv->crtcs[c] == findCrtc)
+            return TRUE;
+    }
+
+    return FALSE;
+}
+
+Bool RRCrtcExists(ScreenPtr pScreen, RRCrtcPtr findCrtc)
+{
+    ScreenPtr secondary= NULL;
+
+    if (RRCrtcInScreen(pScreen, findCrtc))
+        return TRUE;
+
+    xorg_list_for_each_entry(secondary, &pScreen->secondary_list, secondary_head) {
+        if (!secondary->is_output_secondary)
+            continue;
+        if (RRCrtcInScreen(secondary, findCrtc))
+            return TRUE;
+    }
+
+    return FALSE;
+}
+
+
 /*
  * Notify the extension that the Crtc gamma has been changed
  * The driver calls this whenever it has changed the gamma values
diff --git a/randr/rrprovider.c b/randr/rrprovider.c
index 617185cf7..d628a20d4 100644
--- a/randr/rrprovider.c
+++ b/randr/rrprovider.c
@@ -28,7 +28,7 @@
 
 #include <X11/Xatom.h>
 
-RESTYPE RRProviderType;
+RESTYPE RRProviderType = 0;
 
 /*
  * Initialize provider type error value
commit 908deb0895f9fe345d70be933d251ea10511d30a
Author: Łukasz Spintzyk <lukasz.spintzyk at synaptics.com>
Date:   Fri Sep 18 14:31:25 2020 +0200

    present: Use crtc's screen present operation for syncing
    
    Signed-off-by: Łukasz Spintzyk <lukasz.spintzyk at synaptics.com>

diff --git a/present/present_scmd.c b/present/present_scmd.c
index 123e95cae..efe1fd698 100644
--- a/present/present_scmd.c
+++ b/present/present_scmd.c
@@ -78,6 +78,9 @@ present_check_flip(RRCrtcPtr            crtc,
     WindowPtr                   root = screen->root;
     present_screen_priv_ptr     screen_priv = present_screen_priv(screen);
 
+    if (crtc) {
+       screen_priv = present_screen_priv(crtc->pScreen);
+    }
     if (reason)
         *reason = PRESENT_FLIP_REASON_UNKNOWN;
 
@@ -177,11 +180,14 @@ static int
 present_get_ust_msc(ScreenPtr screen, RRCrtcPtr crtc, uint64_t *ust, uint64_t *msc)
 {
     present_screen_priv_ptr     screen_priv = present_screen_priv(screen);
+    present_screen_priv_ptr     crtc_screen_priv = screen_priv;
+    if (crtc)
+        crtc_screen_priv = present_screen_priv(crtc->pScreen);
 
     if (crtc == NULL)
         return present_fake_get_ust_msc(screen, ust, msc);
     else
-        return (*screen_priv->info->get_ust_msc)(crtc, ust, msc);
+        return (*crtc_screen_priv->info->get_ust_msc)(crtc, ust, msc);
 }
 
 static void
@@ -212,7 +218,7 @@ present_queue_vblank(ScreenPtr screen,
         ret = present_fake_queue_vblank(screen, event_id, msc);
     else
     {
-        present_screen_priv_ptr     screen_priv = present_screen_priv(screen);
+        present_screen_priv_ptr     screen_priv = present_screen_priv(crtc->pScreen);
         ret = (*screen_priv->info->queue_vblank) (crtc, event_id, msc);
     }
     return ret;
@@ -511,6 +517,9 @@ present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
     WindowPtr                   window = vblank->window;
     ScreenPtr                   screen = window->drawable.pScreen;
     present_screen_priv_ptr     screen_priv = present_screen_priv(screen);
+    if (vblank && vblank->crtc) {
+        screen_priv=present_screen_priv(vblank->crtc->pScreen);
+    }
 
     if (present_execute_wait(vblank, crtc_msc))
         return;
diff --git a/present/present_vblank.c b/present/present_vblank.c
index 3c3f3ca1c..b46370982 100644
--- a/present/present_vblank.c
+++ b/present/present_vblank.c
@@ -62,6 +62,10 @@ present_vblank_create(WindowPtr window,
     present_vblank_ptr          vblank;
     PresentFlipReason           reason = PRESENT_FLIP_REASON_UNKNOWN;
 
+    if (target_crtc) {
+        screen_priv = present_screen_priv(target_crtc->pScreen);
+    }
+
     vblank = calloc (1, sizeof (present_vblank_rec));
     if (!vblank)
         return NULL;
commit d03c0de77ba36bb5221d00ac84dcdd6aae0df453
Author: Łukasz Spintzyk <lukasz.spintzyk at synaptics.com>
Date:   Fri Sep 18 14:29:25 2020 +0200

    modesetting: Initialize present extension despite glamor is disabled
    
    Signed-off-by: Łukasz Spintzyk <lukasz.spintzyk at synaptics.com>

diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c
index 49f7349d8..2fc2074eb 100644
--- a/hw/xfree86/drivers/modesetting/driver.c
+++ b/hw/xfree86/drivers/modesetting/driver.c
@@ -1933,10 +1933,6 @@ ScreenInit(ScreenPtr pScreen, int argc, char **argv)
                        "Failed to initialize the DRI2 extension.\n");
         }
 
-        if (!(ms->drmmode.present_enable = ms_present_screen_init(pScreen))) {
-            xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                       "Failed to initialize the Present extension.\n");
-        }
         /* enable reverse prime if we are a GPU screen, and accelerated, and not
          * i915. i915 is happy scanning out from sysmem. */
         if (pScreen->isGPU) {
@@ -1955,6 +1951,11 @@ ScreenInit(ScreenPtr pScreen, int argc, char **argv)
         }
     }
 #endif
+    if (!(ms->drmmode.present_enable = ms_present_screen_init(pScreen))) {
+        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                   "Failed to initialize the Present extension.\n");
+    }
+
 
     pScrn->vtSema = TRUE;
 


More information about the xorg-commit mailing list