xf86-video-intel: 3 commits - src/sna/sna_accel.c src/sna/sna_damage.c src/sna/sna_damage.h

Chris Wilson ickle at kemper.freedesktop.org
Mon Nov 14 04:21:09 PST 2011


 src/sna/sna_accel.c  |   37 +++++++++++++++++--------------------
 src/sna/sna_damage.c |   34 +++++++++++++++++-----------------
 src/sna/sna_damage.h |   29 ++++++++++++++++++++++++-----
 3 files changed, 58 insertions(+), 42 deletions(-)

New commits:
commit 99338ebe61917a07611cbc81cfaf70c0ec905014
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Nov 14 12:04:49 2011 +0000

    sna: Check whether damage can be reduced to all-damage on moving to GPU
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 9fd5acc..ac76525 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -712,8 +712,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, BoxPtr box)
 	assert(priv->gpu);
 	assert(priv->gpu_bo);
 
-	sna_damage_reduce(&priv->cpu_damage,
-			  pixmap->drawable.width, pixmap->drawable.height);
+	sna_damage_reduce(&priv->cpu_damage);
 	DBG(("%s: CPU damage? %d\n", __FUNCTION__, priv->cpu_damage != NULL));
 
 	if (priv->cpu_damage == NULL)
@@ -1008,8 +1007,7 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap)
 	if (priv == NULL)
 		return NULL;
 
-	sna_damage_reduce(&priv->cpu_damage,
-			  pixmap->drawable.width, pixmap->drawable.height);
+	sna_damage_reduce(&priv->cpu_damage);
 	DBG(("%s: CPU damage? %d\n", __FUNCTION__, priv->cpu_damage != NULL));
 
 	if (priv->gpu_bo == NULL) {
@@ -1069,9 +1067,10 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap)
 	__sna_damage_destroy(priv->cpu_damage);
 	priv->cpu_damage = NULL;
 
-	sna_damage_reduce(&priv->gpu_damage,
-			  pixmap->drawable.width, pixmap->drawable.height);
+	sna_damage_reduce(&priv->gpu_damage);
 done:
+	sna_damage_reduce_all(&priv->gpu_damage,
+			      pixmap->drawable.width, pixmap->drawable.height);
 	list_del(&priv->list);
 	priv->gpu = true;
 	return priv;
diff --git a/src/sna/sna_damage.c b/src/sna/sna_damage.c
index 2d7d65d..95a92a5 100644
--- a/src/sna/sna_damage.c
+++ b/src/sna/sna_damage.c
@@ -1242,10 +1242,9 @@ static int _sna_damage_get_boxes(struct sna_damage *damage, BoxPtr *boxes)
 	return REGION_NUM_RECTS(&damage->region);
 }
 
-struct sna_damage *_sna_damage_reduce(struct sna_damage *damage,
-				      int width, int height)
+struct sna_damage *_sna_damage_reduce(struct sna_damage *damage)
 {
-	DBG(("%s(width=%d, height=%d)\n", __FUNCTION__, width, height));
+	DBG(("%s\n", __FUNCTION__));
 
 	if (damage->n)
 		__sna_damage_reduce(damage);
@@ -1253,13 +1252,6 @@ struct sna_damage *_sna_damage_reduce(struct sna_damage *damage,
 	if (!pixman_region_not_empty(&damage->region)) {
 		__sna_damage_destroy(damage);
 		damage = NULL;
-	} else {
-		if (damage->region.data == NULL &&
-		    damage->extents.x1 <= 0 &&
-		    damage->extents.y1 <= 0 &&
-		    damage->extents.x2 >= width &&
-		    damage->extents.y2 >= height)
-			damage = _sna_damage_all(damage, width, height);
 	}
 
 	return damage;
diff --git a/src/sna/sna_damage.h b/src/sna/sna_damage.h
index c62e831..7fc6d02 100644
--- a/src/sna/sna_damage.h
+++ b/src/sna/sna_damage.h
@@ -127,15 +127,34 @@ int sna_damage_contains_box(struct sna_damage *damage,
 
 int sna_damage_get_boxes(struct sna_damage *damage, BoxPtr *boxes);
 
-struct sna_damage *_sna_damage_reduce(struct sna_damage *damage,
-				     int width, int height);
-static inline void sna_damage_reduce(struct sna_damage **damage,
-				     int width, int height)
+struct sna_damage *_sna_damage_reduce(struct sna_damage *damage);
+static inline void sna_damage_reduce(struct sna_damage **damage)
 {
 	if (*damage == NULL)
 		return;
 
-	*damage = _sna_damage_reduce(*damage, width, height);
+	if ((*damage)->mode != DAMAGE_ALL)
+		*damage = _sna_damage_reduce(*damage);
+}
+
+static inline void sna_damage_reduce_all(struct sna_damage **damage,
+					 int width, int height)
+{
+	DBG(("%s(width=%d, height=%d)\n", __FUNCTION__, width, height));
+
+	if (*damage == NULL)
+		return;
+
+	if ((*damage)->mode == DAMAGE_ADD &&
+	    (*damage)->extents.x1 <= 0 &&
+	    (*damage)->extents.y1 <= 0 &&
+	    (*damage)->extents.x2 >= width &&
+	    (*damage)->extents.y2 >= height) {
+		if ((*damage)->n)
+			*damage = _sna_damage_reduce(*damage);
+		if ((*damage)->region.data == NULL)
+			*damage = _sna_damage_all(*damage, width, height);
+	}
 }
 
 void __sna_damage_destroy(struct sna_damage *damage);
commit 00d1c539e4b69636bfc35c0c47a6f1db3a33e731
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Nov 14 11:19:42 2011 +0000

    sna/damage: Add a little more verbosity to debugging
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 73fca8f..9fd5acc 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1370,6 +1370,7 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 		kgem_bo_sync(&sna->kgem, priv->cpu_bo, true);
 
 	if (region_subsumes_drawable(region, &pixmap->drawable)) {
+		DBG(("%s: replacing entire pixmap\n", __FUNCTION__));
 		sna_damage_all(&priv->cpu_damage,
 			       pixmap->drawable.width,
 			       pixmap->drawable.height);
@@ -1380,8 +1381,10 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 		sna_damage_add(&priv->cpu_damage, region);
 		if (sna_damage_is_all(&priv->cpu_damage,
 				      pixmap->drawable.width,
-				      pixmap->drawable.height))
+				      pixmap->drawable.height)) {
+			DBG(("%s: replaced entire pixmap\n", __FUNCTION__));
 			sna_pixmap_destroy_gpu_bo(sna, priv);
+		}
 	}
 	if (priv->flush)
 		list_move(&priv->list, &sna->dirty_pixmaps);
diff --git a/src/sna/sna_damage.c b/src/sna/sna_damage.c
index 03bb881..2d7d65d 100644
--- a/src/sna/sna_damage.c
+++ b/src/sna/sna_damage.c
@@ -121,13 +121,21 @@ static const char *_debug_describe_damage(char *buf, int max,
 	if (str_max > sizeof(damage_str))
 		str_max = sizeof(damage_str);
 
-	sprintf(damage_str, "[%d : ...]", damage->n);
-	snprintf(buf, max, "[[(%d, %d), (%d, %d)]:  %s + %s]",
-		 damage->extents.x1, damage->extents.y1,
-		 damage->extents.x2, damage->extents.y2,
-		 _debug_describe_region(region_str, str_max,
-					&damage->region),
-		 damage_str);
+	if (damage->mode == DAMAGE_ALL) {
+		snprintf(buf, max, "[[(%d, %d), (%d, %d)]: all]",
+			 damage->extents.x1, damage->extents.y1,
+			 damage->extents.x2, damage->extents.y2);
+		assert(damage->n == 0);
+	} else {
+		sprintf(damage_str, "[%d : ...]", damage->n);
+		snprintf(buf, max, "[[(%d, %d), (%d, %d)]:  %s %c %s]",
+			 damage->extents.x1, damage->extents.y1,
+			 damage->extents.x2, damage->extents.y2,
+			 _debug_describe_region(region_str, str_max,
+						&damage->region),
+			 damage->mode == DAMAGE_SUBTRACT ? '-' : '+',
+			 damage_str);
+	}
 
 	return buf;
 }
commit 60c0fc101adbc457a7c1927602175f8079175e10
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Nov 14 11:12:47 2011 +0000

    sna: Refactor some common code into the common destroy-gpu-bo function
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 4d4d408..73fca8f 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -164,8 +164,12 @@ sna_copy_init_blt(struct sna_copy_op *copy,
 
 static void sna_pixmap_destroy_gpu_bo(struct sna *sna, struct sna_pixmap *priv)
 {
-	kgem_bo_destroy(&sna->kgem, priv->gpu_bo);
-	priv->gpu_bo = NULL;
+	sna_damage_destroy(&priv->gpu_damage);
+
+	if (priv->gpu_bo && !priv->pinned) {
+		kgem_bo_destroy(&sna->kgem, priv->gpu_bo);
+		priv->gpu_bo = NULL;
+	}
 
 	/* and reset the upload counter */
 	priv->source_count = SOURCE_BIAS;
@@ -526,9 +530,7 @@ done:
 		sna_damage_all(&priv->cpu_damage,
 			       pixmap->drawable.width,
 			       pixmap->drawable.height);
-
-		if (priv->gpu_bo && !priv->pinned)
-			sna_pixmap_destroy_gpu_bo(sna, priv);
+		sna_pixmap_destroy_gpu_bo(sna, priv);
 
 		if (priv->flush)
 			list_move(&priv->list, &sna->dirty_pixmaps);
@@ -1368,23 +1370,18 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 		kgem_bo_sync(&sna->kgem, priv->cpu_bo, true);
 
 	if (region_subsumes_drawable(region, &pixmap->drawable)) {
-		sna_damage_destroy(&priv->gpu_damage);
 		sna_damage_all(&priv->cpu_damage,
 			       pixmap->drawable.width,
 			       pixmap->drawable.height);
-		if (priv->gpu_bo && !priv->pinned)
-			sna_pixmap_destroy_gpu_bo(sna, priv);
+		sna_pixmap_destroy_gpu_bo(sna, priv);
 	} else {
 		assert_pixmap_contains_box(pixmap, RegionExtents(region));
 		sna_damage_subtract(&priv->gpu_damage, region);
 		sna_damage_add(&priv->cpu_damage, region);
 		if (sna_damage_is_all(&priv->cpu_damage,
 				      pixmap->drawable.width,
-				      pixmap->drawable.height)) {
-			sna_damage_destroy(&priv->gpu_damage);
-			if (priv->gpu_bo && !priv->pinned)
-				sna_pixmap_destroy_gpu_bo(sna, priv);
-		}
+				      pixmap->drawable.height))
+			sna_pixmap_destroy_gpu_bo(sna, priv);
 	}
 	if (priv->flush)
 		list_move(&priv->list, &sna->dirty_pixmaps);
@@ -2130,12 +2127,10 @@ fallback:
 		if (dst_priv) {
 			if (alu == GXcopy) {
 				if (replaces) {
-					sna_damage_destroy(&dst_priv->gpu_damage);
 					sna_damage_all(&dst_priv->cpu_damage,
 						       dst_pixmap->drawable.width,
 						       dst_pixmap->drawable.height);
-					if (dst_priv->gpu_bo && !dst_priv->pinned)
-						sna_pixmap_destroy_gpu_bo(sna, dst_priv);
+					sna_pixmap_destroy_gpu_bo(sna, dst_priv);
 				} else {
 					assert_pixmap_contains_box(dst_pixmap,
 								   RegionExtents(&region));


More information about the xorg-commit mailing list