[PATCH xserver] prime: Damage full destination rectangle when we start dirty tracking

Michel Dänzer michel at daenzer.net
Thu Dec 3 00:04:09 PST 2015


From: Michel Dänzer <michel.daenzer at amd.com>

This makes sure that the destination pixmap contents will be fully
initialized. Without this, a PRIME output starts out with garbage.

Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
---
 dix/pixmap.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/dix/pixmap.c b/dix/pixmap.c
index 05aebc4..11d83fe 100644
--- a/dix/pixmap.c
+++ b/dix/pixmap.c
@@ -173,6 +173,9 @@ PixmapStartDirtyTracking(PixmapPtr src,
 {
     ScreenPtr screen = src->drawable.pScreen;
     PixmapDirtyUpdatePtr dirty_update;
+    RegionPtr damageregion;
+    RegionRec dstregion;
+    BoxRec box;
 
     dirty_update = calloc(1, sizeof(PixmapDirtyUpdateRec));
     if (!dirty_update)
@@ -205,6 +208,24 @@ PixmapStartDirtyTracking(PixmapPtr src,
         return FALSE;
     }
 
+    /* Damage destination rectangle so that the destination pixmap contents
+     * will get fully initialized
+     */
+    box.x1 = dirty_update->x;
+    box.y1 = dirty_update->y;
+    if (dirty_update->rotation == RR_Rotate_90 ||
+        dirty_update->rotation == RR_Rotate_270) {
+        box.x2 = dirty_update->x + slave_dst->drawable.height;
+        box.y2 = dirty_update->y + slave_dst->drawable.width;
+    } else {
+        box.x2 = dirty_update->x + slave_dst->drawable.width;
+        box.y2 = dirty_update->y + slave_dst->drawable.height;
+    }
+    RegionInit(&dstregion, &box, 1);
+    damageregion = DamageRegion(dirty_update->damage);
+    RegionUnion(damageregion, damageregion, &dstregion);
+    RegionUninit(&dstregion);
+
     DamageRegister(&src->drawable, dirty_update->damage);
     xorg_list_add(&dirty_update->ent, &screen->pixmap_dirty_list);
     return TRUE;
-- 
2.6.2



More information about the xorg-devel mailing list