xf86-video-intel: src/sna/sna_accel.c

Chris Wilson ickle at kemper.freedesktop.org
Wed Jun 11 00:08:08 PDT 2014


 src/sna/sna_accel.c |   35 ++++++++++++++++++++++++++---------
 1 file changed, 26 insertions(+), 9 deletions(-)

New commits:
commit 53c1faa5093f8a0c969e3ebe9f27ee1ce5137e14
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jun 11 07:59:41 2014 +0100

    sna: Mark the GPU as all damaged when discarding CPU bo during uploads
    
    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 78f422d..e7b76d5 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -572,13 +572,16 @@ static void __sna_pixmap_free_cpu(struct sna *sna, struct sna_pixmap *priv)
 		free(priv->ptr);
 }
 
-static void sna_pixmap_free_cpu(struct sna *sna, struct sna_pixmap *priv, bool active)
+static bool sna_pixmap_free_cpu(struct sna *sna, struct sna_pixmap *priv, bool active)
 {
 	if (active)
-		return;
+		return false;
 
 	if (IS_STATIC_PTR(priv->ptr))
-		return;
+		return false;
+
+	if (priv->ptr == NULL)
+		return false;
 
 	__sna_pixmap_free_cpu(sna, priv);
 
@@ -587,6 +590,8 @@ static void sna_pixmap_free_cpu(struct sna *sna, struct sna_pixmap *priv, bool a
 
 	if (priv->mapped == MAPPED_NONE)
 		priv->pixmap->devPrivate.ptr = NULL;
+
+	return true;
 }
 
 static inline uint32_t default_tiling(PixmapPtr pixmap,
@@ -2084,6 +2089,7 @@ _sna_pixmap_move_to_cpu(PixmapPtr pixmap, unsigned int flags)
 	if (kgem_bo_discard_cache(priv->gpu_bo, flags & MOVE_WRITE)) {
 		DBG(("%s: discarding cached upload buffer\n", __FUNCTION__));
 		assert(DAMAGE_IS_ALL(priv->cpu_damage));
+		assert(priv->gpu_damage == NULL);
 		assert(!priv->pinned);
 		assert(!priv->mapped);
 		kgem_bo_destroy(&sna->kgem, priv->gpu_bo);
@@ -2099,7 +2105,7 @@ _sna_pixmap_move_to_cpu(PixmapPtr pixmap, unsigned int flags)
 
 	if (USE_INPLACE && (flags & MOVE_READ) == 0 && !(priv->cow || priv->move_to_gpu)) {
 		assert(flags & MOVE_WRITE);
-		DBG(("%s: no readbck, discarding gpu damage [%d], pending clear[%d]\n",
+		DBG(("%s: no readback, discarding gpu damage [%d], pending clear[%d]\n",
 		     __FUNCTION__, priv->gpu_damage != NULL, priv->clear));
 
 		if ((priv->gpu_bo || priv->create & KGEM_CAN_CREATE_GPU) &&
@@ -3206,6 +3212,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
 
 	if (kgem_bo_discard_cache(priv->gpu_bo, flags & (MOVE_WRITE | __MOVE_FORCE))) {
 		DBG(("%s: discarding cached upload buffer\n", __FUNCTION__));
+		assert(DAMAGE_IS_ALL(priv->cpu_damage));
 		assert(priv->gpu_damage == NULL);
 		assert(!priv->pinned);
 		assert(!priv->mapped);
@@ -3445,8 +3452,8 @@ sna_drawable_use_bo(DrawablePtr drawable, unsigned flags, const BoxRec *box,
 	}
 
 	if (kgem_bo_discard_cache(priv->gpu_bo, true)) {
-		DBG(("%s: cached upload proxy, discard and revert to GPU\n",
-		     __FUNCTION__));
+		DBG(("%s: cached upload proxy, discard and revert to GPU\n", __FUNCTION__));
+		assert(DAMAGE_IS_ALL(priv->cpu_damage));
 		assert(priv->gpu_damage == NULL);
 		assert(!priv->pinned);
 		assert(!priv->mapped);
@@ -3942,6 +3949,7 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
 
 	if (kgem_bo_discard_cache(priv->gpu_bo, flags & (MOVE_WRITE | __MOVE_FORCE))) {
 		DBG(("%s: discarding cached upload buffer\n", __FUNCTION__));
+		assert(DAMAGE_IS_ALL(priv->cpu_damage));
 		assert(priv->gpu_damage == NULL);
 		assert(!priv->pinned);
 		assert(!priv->mapped);
@@ -4491,11 +4499,12 @@ try_upload_blt(PixmapPtr pixmap, RegionRec *region,
 			sna_damage_subtract(&priv->cpu_damage, region);
 		if (priv->cpu_damage == NULL) {
 			list_del(&priv->flush_list);
-			sna_pixmap_free_cpu(sna, priv, priv->cpu);
+			if (sna_pixmap_free_cpu(sna, priv, priv->cpu))
+				sna_damage_all(&priv->gpu_damage, pixmap);
+			priv->cpu = false;
 		}
 	}
 	priv->clear = false;
-	priv->cpu = false;
 
 	return true;
 }
@@ -4523,6 +4532,11 @@ try_upload_tiled_x(PixmapPtr pixmap, RegionRec *region,
 	     replaces));
 
 	if (kgem_bo_discard_cache(priv->gpu_bo, true)) {
+		DBG(("%s: discarding cached upload buffer\n", __FUNCTION__));
+		assert(DAMAGE_IS_ALL(priv->cpu_damage));
+		assert(priv->gpu_damage == NULL);
+		assert(!priv->pinned);
+		assert(!priv->mapped);
 		kgem_bo_destroy(&sna->kgem, priv->gpu_bo);
 		priv->gpu_bo = NULL;
 	}
@@ -4686,7 +4700,8 @@ try_upload_tiled_x(PixmapPtr pixmap, RegionRec *region,
 			sna_damage_subtract(&priv->cpu_damage, region);
 		if (priv->cpu_damage == NULL) {
 			list_del(&priv->flush_list);
-			sna_pixmap_free_cpu(sna, priv, priv->cpu);
+			if (sna_pixmap_free_cpu(sna, priv, priv->cpu))
+				sna_damage_all(&priv->gpu_damage, pixmap);
 			priv->cpu = false;
 		}
 	}
@@ -5873,6 +5888,8 @@ static void discard_cpu_damage(struct sna *sna, struct sna_pixmap *priv)
 {
 	DBG(("%s: discarding existing CPU damage\n", __FUNCTION__));
 	if (kgem_bo_discard_cache(priv->gpu_bo, true)) {
+		DBG(("%s: discarding cached upload buffer\n", __FUNCTION__));
+		assert(DAMAGE_IS_ALL(priv->cpu_damage));
 		assert(priv->gpu_damage == NULL);
 		assert(!priv->pinned);
 		assert(!priv->mapped);


More information about the xorg-commit mailing list