Report damage before modifying the area, not after.
authorPeter Hutterer <peter@cs.unisa.edu.au>
Thu, 21 Aug 2008 09:22:40 +0000 (11:22 +0200)
committerMichel Dänzer <michel@tungstengraphics.com>
Thu, 21 Aug 2008 09:22:40 +0000 (11:22 +0200)
If we copy the area before reporting the damage in this area, the server may
restore buffered data over the new data, leading to artefacts on the screen.
Reproducable with two cursors (second of which is SW rendered) and moving
windows around in compiz.

Fixes http://bugs.freedesktop.org/show_bug.cgi?id=16384 .

src/mesa/drivers/dri/common/dri_util.c

index 9655741bbba556282e87f9130ae2899fc0555dc7..93b9f458e4163cce899a06a005bb110985bad504 100644 (file)
@@ -512,13 +512,13 @@ static void driCopySubBuffer(__DRIdrawable *dPriv,
 {
     drm_clip_rect_t rect;
 
-    dPriv->driScreenPriv->DriverAPI.CopySubBuffer(dPriv, x, y, w, h);
-
     rect.x1 = x;
     rect.y1 = dPriv->h - y - h;
     rect.x2 = x + w;
     rect.y2 = rect.y1 + h;
     driReportDamage(dPriv, &rect, 1);
+
+    dPriv->driScreenPriv->DriverAPI.CopySubBuffer(dPriv, x, y, w, h);
 }
 
 const __DRIcopySubBufferExtension driCopySubBufferExtension = {