xf86-video-intel: src/sna/gen4_render.c src/sna/sna_composite.c src/sna/sna_damage.c

Chris Wilson ickle at kemper.freedesktop.org
Mon Oct 17 06:26:21 PDT 2011


 src/sna/gen4_render.c   |    4 ++++
 src/sna/sna_composite.c |   10 +++++++---
 src/sna/sna_damage.c    |   13 ++++++++++---
 3 files changed, 21 insertions(+), 6 deletions(-)

New commits:
commit f1bb4ebfd8991f2f9eb9c38b9259792c11e7c86a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Oct 17 14:22:58 2011 +0100

    sna/damage: Clear damage->all when subtracting
    
    I missed clearing the all-damaged flag on the subtract fast paths,
    causing us to disregard further GPU damage and losing track of render
    coherency.
    
    Reported-by: Roman Jarosz <kedgedev at gmail.com>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=41769
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 95d9a9d..fb60c39 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -1855,6 +1855,10 @@ gen4_composite_set_target(PicturePtr dst, struct sna_composite_op *op)
 	if (!priv->gpu_only &&
 	    !sna_damage_is_all(&priv->gpu_damage, op->dst.width, op->dst.height))
 		op->damage = &priv->gpu_damage;
+	DBG(("%s: gpu_only=%d, all-damaged=%d, damage=%p\n",
+	     __FUNCTION__, priv->gpu_only,
+	     sna_damage_is_all(&priv->gpu_damage, op->dst.width, op->dst.height),
+	    op->damage));
 
 	get_drawable_deltas(dst->pDrawable, op->dst.pixmap,
 			    &op->dst.x, &op->dst.y);
diff --git a/src/sna/sna_composite.c b/src/sna/sna_composite.c
index 200ab73..e0b1ca3 100644
--- a/src/sna/sna_composite.c
+++ b/src/sna/sna_composite.c
@@ -388,13 +388,17 @@ static void _assert_pixmap_contains_box(PixmapPtr pixmap, BoxPtr box, const char
 
 static void apply_damage(struct sna_composite_op *op, RegionPtr region)
 {
-	DBG(("%s: damage=%p, region=%d\n",
-	     __FUNCTION__, op->damage, REGION_NUM_RECTS(region)));
+	DBG(("%s: damage=%p, region=%d [(%d, %d), (%d, %d) + (%d, %d)]\n",
+	     __FUNCTION__, op->damage, REGION_NUM_RECTS(region),
+	     region->extents.x1, region->extents.y1,
+	     region->extents.x2, region->extents.y2,
+	     op->dst.x, op->dst.y));
 
 	if (op->damage == NULL)
 		return;
 
-	RegionTranslate(region, op->dst.x, op->dst.y);
+	if (op->dst.x | op->dst.y)
+		RegionTranslate(region, op->dst.x, op->dst.y);
 
 	assert_pixmap_contains_box(op->dst.pixmap, RegionExtents(region));
 	sna_damage_add(op->damage, region);
diff --git a/src/sna/sna_damage.c b/src/sna/sna_damage.c
index 7358c3a..efb1cfe 100644
--- a/src/sna/sna_damage.c
+++ b/src/sna/sna_damage.c
@@ -247,6 +247,8 @@ static void __sna_damage_reduce(struct sna_damage *damage)
 	BoxPtr boxes;
 	pixman_region16_t tmp, *region = &damage->region;
 
+	assert(!damage->all);
+
 	DBG(("    reduce: before damage.n=%d region.n=%d\n",
 	     damage->n, REGION_NUM_RECTS(region)));
 
@@ -461,7 +463,6 @@ struct sna_damage *_sna_damage_all(struct sna_damage *damage,
 		pixman_region_fini(&damage->region);
 		damage->n = 0;
 		damage->last_box = NULL;
-		damage->all = 1;
 	} else
 		damage = _sna_damage_create();
 
@@ -484,7 +485,7 @@ struct sna_damage *_sna_damage_is_all(struct sna_damage *damage,
 	box.x1 = box.y1 = 0;
 	box.x2 = width;
 	box.y2 = height;
-	
+
 	if (pixman_region_contains_rectangle(&damage->region,
 					     &box) != PIXMAN_REGION_IN)
 		return damage;
@@ -540,6 +541,7 @@ static struct sna_damage *__sna_damage_subtract(struct sna_damage *damage,
 					       &damage->region,
 					       region);
 			damage->extents = damage->region.extents;
+			damage->all = 0;
 			return damage;
 		}
 	}
@@ -607,10 +609,12 @@ inline static struct sna_damage *__sna_damage_subtract_box(struct sna_damage *da
 					       &damage->region,
 					       &region);
 			damage->extents = damage->region.extents;
+			damage->all = 0;
 			return damage;
 		}
 	}
 
+	damage->all = 0;
 	damage->mode = SUBTRACT;
 	_sna_damage_create_elt(damage, SUBTRACT, box, 1);
 
@@ -646,7 +650,10 @@ static int _sna_damage_contains_box(struct sna_damage *damage,
 				    const BoxRec *box)
 {
 	if (!damage)
-		return PIXMAN_REGION_OUT;;
+		return PIXMAN_REGION_OUT;
+
+	if (damage->all)
+		return PIXMAN_REGION_IN;
 
 	if (!sna_damage_maybe_contains_box(damage, box))
 		return PIXMAN_REGION_OUT;


More information about the xorg-commit mailing list