xserver: Branch 'master' - 2 commits

Keith Packard keithp at kemper.freedesktop.org
Thu Dec 25 13:01:59 PST 2014


 hw/xfree86/drivers/modesetting/driver.c |   36 ++++++++++++++++----------------
 1 file changed, 19 insertions(+), 17 deletions(-)

New commits:
commit 0d37c7e4b5d63308a60ca59c9de981b380af8689
Author: Keith Packard <keithp at keithp.com>
Date:   Fri Dec 19 18:40:19 2014 -0800

    modesetting: Detect whether damage tracking is needed
    
    Call drmModeDirtyFB and check the return value to detect whether the
    driver support for damage tracking is present, only initialize it in
    that case.
    
    Signed-off-by: Keith Packard <keithp at keithp.com>
    Reviewed-by: Jason Ekstrand <jason.ekstrand at intel.com>

diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c
index 5929c03..be025bd 100644
--- a/hw/xfree86/drivers/modesetting/driver.c
+++ b/hw/xfree86/drivers/modesetting/driver.c
@@ -875,6 +875,7 @@ CreateScreenResources(ScreenPtr pScreen)
     PixmapPtr rootPixmap;
     Bool ret;
     void *pixels = NULL;
+    int err;
 
     pScreen->CreateScreenResources = ms->createScreenResources;
     ret = pScreen->CreateScreenResources(pScreen);
@@ -911,18 +912,22 @@ CreateScreenResources(ScreenPtr pScreen)
             return FALSE;
     }
 
-    ms->damage = DamageCreate(NULL, NULL, DamageReportNone, TRUE,
-                              pScreen, rootPixmap);
+    err = drmModeDirtyFB(ms->fd, ms->drmmode.fb_id, NULL, 0);
 
-    if (ms->damage) {
-        DamageRegister(&rootPixmap->drawable, ms->damage);
-        ms->dirty_enabled = TRUE;
-        xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Damage tracking initialized\n");
-    }
-    else {
-        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-                   "Failed to create screen damage record\n");
-        return FALSE;
+    if (err != -EINVAL && err != -ENOSYS) {
+        ms->damage = DamageCreate(NULL, NULL, DamageReportNone, TRUE,
+                                  pScreen, rootPixmap);
+
+        if (ms->damage) {
+            DamageRegister(&rootPixmap->drawable, ms->damage);
+            ms->dirty_enabled = TRUE;
+            xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Damage tracking initialized\n");
+        }
+        else {
+            xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+                       "Failed to create screen damage record\n");
+            return FALSE;
+        }
     }
     return ret;
 }
commit 7804305673ca63720e8736c0c88afa711ebe208a
Author: Keith Packard <keithp at keithp.com>
Date:   Fri Dec 19 19:34:34 2014 -0800

    modesetting: Fix damage tracking auto-disable code
    
    dispatch_dirty_region was only returning -EINVAL error codes,
    otherwise it would return 0. The kernel returns -ENOSYS when the
    driver doesn't support damage tracking, so dispatch_dirty would never
    see the error and never disable damage tracking.
    
    Pass all errors back from dispatch_dirty_region and let dispatch_dirty
    deal with them.
    
    Signed-off-by: Keith Packard <keithp at keithp.com>
    Reviewed-by: Jason Ekstrand <jason.ekstrand at intel.com>

diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c
index d9a2982..5929c03 100644
--- a/hw/xfree86/drivers/modesetting/driver.c
+++ b/hw/xfree86/drivers/modesetting/driver.c
@@ -453,11 +453,12 @@ dispatch_dirty_region(ScrnInfoPtr scrn,
     modesettingPtr ms = modesettingPTR(scrn);
     RegionPtr dirty = DamageRegion(damage);
     unsigned num_cliprects = REGION_NUM_RECTS(dirty);
+    int ret = 0;
 
     if (num_cliprects) {
         drmModeClip *clip = malloc(num_cliprects * sizeof(drmModeClip));
         BoxPtr rect = REGION_RECTS(dirty);
-        int i, ret;
+        int i;
 
         if (!clip)
             return -ENOMEM;
@@ -474,12 +475,8 @@ dispatch_dirty_region(ScrnInfoPtr scrn,
         ret = drmModeDirtyFB(ms->fd, fb_id, clip, num_cliprects);
         free(clip);
         DamageEmpty(damage);
-        if (ret) {
-            if (ret == -EINVAL)
-                return ret;
-        }
     }
-    return 0;
+    return ret;
 }
 
 static void


More information about the xorg-commit mailing list