prime: Damage full destination rectangle when we start dirty tracking

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@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Michel Dänzer 2015-12-03 17:04:09 +09:00 committed by Adam Jackson
parent 2a52c06e23
commit 530d3e5ca0

View File

@ -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;