[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