xf86-video-intel: 10 commits - src/sna/kgem.c src/sna/sna_accel.c src/sna/sna.h src/sna/sna_render.c

Chris Wilson ickle at kemper.freedesktop.org
Wed Aug 22 05:01:21 PDT 2012


 src/sna/kgem.c       |   22 ++++++++++
 src/sna/sna.h        |    4 +
 src/sna/sna_accel.c  |  105 ++++++++++++++++++++++++++++++++++-----------------
 src/sna/sna_render.c |    2 
 4 files changed, 98 insertions(+), 35 deletions(-)

New commits:
commit ac6cb667546a82b865c959a1be32f52b2da7bf7d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Aug 22 12:00:49 2012 +0100

    sna: Flush before adding any SHM pixmap into the batch
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index 157830b..d655da0 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -458,7 +458,9 @@ sna_drawable_move_to_gpu(DrawablePtr drawable, unsigned flags)
 	return sna_pixmap_move_to_gpu(get_drawable_pixmap(drawable), flags) != NULL;
 }
 
-void sna_add_flush_pixmap(struct sna *sna, struct sna_pixmap *priv);
+void sna_add_flush_pixmap(struct sna *sna,
+			  struct sna_pixmap *priv,
+			  struct kgem_bo *bo);
 
 struct kgem_bo *sna_pixmap_change_tiling(PixmapPtr pixmap, uint32_t tiling);
 
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index bba24e5..9bab91c 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1016,16 +1016,18 @@ fallback:
 	return create_pixmap(sna, screen, width, height, depth, usage);
 }
 
-void sna_add_flush_pixmap(struct sna *sna, struct sna_pixmap *priv)
+void sna_add_flush_pixmap(struct sna *sna,
+			  struct sna_pixmap *priv,
+			  struct kgem_bo *bo)
 {
 	DBG(("%s: marking pixmap=%ld for flushing\n",
 	     __FUNCTION__, priv->pixmap->drawable.serialNumber));
 	list_move(&priv->list, &sna->flush_pixmaps);
 
-	if (sna->kgem.need_retire)
+	if (bo->exec == NULL && sna->kgem.need_retire)
 		kgem_retire(&sna->kgem);
-	if (!sna->kgem.need_retire || !sna->kgem.flush) {
-		DBG(("%s: GPU idle, flushing\n", __FUNCTION__));
+	if (bo->exec == NULL || !sna->kgem.need_retire) {
+		DBG(("%s: flush bo idle, flushing\n", __FUNCTION__));
 		kgem_submit(&sna->kgem);
 	}
 
@@ -1078,8 +1080,8 @@ static Bool sna_destroy_pixmap(PixmapPtr pixmap)
 		kgem_bo_destroy(&sna->kgem, priv->gpu_bo);
 
 	if (priv->shm && kgem_bo_is_busy(priv->cpu_bo)) {
+		sna_add_flush_pixmap(sna, priv, priv->cpu_bo);
 		kgem_bo_submit(&sna->kgem, priv->cpu_bo); /* XXX ShmDetach */
-		sna_add_flush_pixmap(sna, priv);
 	} else
 		__sna_free_pixmap(sna, pixmap, priv);
 	return TRUE;
@@ -1419,7 +1421,7 @@ skip_inplace_map:
 
 		if (priv->flush) {
 			assert(!priv->shm);
-			sna_add_flush_pixmap(sna, priv);
+			sna_add_flush_pixmap(sna, priv, priv->gpu_bo);
 		}
 	}
 
@@ -2030,7 +2032,7 @@ done:
 		}
 		if (priv->flush) {
 			assert(!priv->shm);
-			sna_add_flush_pixmap(sna, priv);
+			sna_add_flush_pixmap(sna, priv, priv->gpu_bo);
 		}
 	}
 
@@ -2244,7 +2246,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
 							    box, n, 0);
 				if (ok && priv->shm) {
 					assert(!priv->flush);
-					sna_add_flush_pixmap(sna, priv);
+					sna_add_flush_pixmap(sna, priv, priv->cpu_bo);
 				}
 			}
 			if (!ok) {
@@ -2288,7 +2290,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
 						    box, 1, 0);
 			if (ok && priv->shm) {
 				assert(!priv->flush);
-				sna_add_flush_pixmap(sna, priv);
+				sna_add_flush_pixmap(sna, priv, priv->cpu_bo);
 			}
 		}
 		if (!ok) {
@@ -2323,7 +2325,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
 						    box, n, 0);
 			if (ok && priv->shm) {
 				assert(!priv->flush);
-				sna_add_flush_pixmap(sna, priv);
+				sna_add_flush_pixmap(sna, priv, priv->cpu_bo);
 			}
 		}
 		if (!ok) {
@@ -2349,7 +2351,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
 
 	if (priv->shm) {
 		assert(!priv->flush);
-		sna_add_flush_pixmap(sna, priv);
+		sna_add_flush_pixmap(sna, priv, priv->cpu_bo);
 	}
 
 done:
@@ -2623,7 +2625,7 @@ use_cpu_bo:
 
 	if (priv->shm) {
 		assert(!priv->flush);
-		sna_add_flush_pixmap(sna, priv);
+		sna_add_flush_pixmap(sna, priv, priv->cpu_bo);
 
 		/* As we may have flushed and retired,, recheck for busy bo */
 		if ((flags & FORCE_GPU) == 0 && !kgem_bo_is_busy(priv->cpu_bo))
@@ -2851,7 +2853,7 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
 						    box, n, 0);
 			if (ok && priv->shm) {
 				assert(!priv->flush);
-				sna_add_flush_pixmap(sna, priv);
+				sna_add_flush_pixmap(sna, priv, priv->cpu_bo);
 			}
 		}
 		if (!ok) {
@@ -2886,7 +2888,7 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
 
 	if (priv->shm) {
 		assert(!priv->flush);
-		sna_add_flush_pixmap(sna, priv);
+		sna_add_flush_pixmap(sna, priv, priv->cpu_bo);
 	}
 
 	/* For large bo, try to keep only a single copy around */
@@ -3441,7 +3443,7 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 		}
 		if (priv->flush) {
 			assert(!priv->shm);
-			sna_add_flush_pixmap(sna, priv);
+			sna_add_flush_pixmap(sna, priv, priv->gpu_bo);
 		}
 	}
 	priv->cpu = true;
@@ -4320,7 +4322,7 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
 
 			if (src_priv->shm) {
 				assert(!src_priv->flush);
-				sna_add_flush_pixmap(sna, src_priv);
+				sna_add_flush_pixmap(sna, src_priv, src_priv->cpu_bo);
 			}
 
 			if (damage)
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index 13822b8..8373890 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -378,7 +378,7 @@ use_cpu_bo(struct sna *sna, PixmapPtr pixmap, const BoxRec *box, bool blt)
 
 	if (priv->shm) {
 		assert(!priv->flush);
-		sna_add_flush_pixmap(sna, priv);
+		sna_add_flush_pixmap(sna, priv, priv->cpu_bo);
 	}
 
 	DBG(("%s for box=(%d, %d), (%d, %d)\n",
commit 785c1046b94fd9ca6f22b2a6d73639408a411cea
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Aug 22 10:56:12 2012 +0100

    sna: Only use the GPU for an active CPU bo unless forced
    
    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 110d9c5..bba24e5 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1339,7 +1339,8 @@ skip_inplace_map:
 	}
 
 	if (priv->clear) {
-		if (priv->cpu_bo && !priv->cpu_bo->flush && kgem_bo_is_busy(priv->cpu_bo)) {
+		if (priv->cpu_bo && !priv->cpu_bo->flush &&
+		    __kgem_bo_is_busy(&sna->kgem, priv->cpu_bo)) {
 			assert(!priv->shm);
 			sna_pixmap_free_cpu(sna, priv);
 		}
@@ -1439,8 +1440,11 @@ done:
 			DBG(("%s: syncing CPU bo\n", __FUNCTION__));
 			kgem_bo_sync__cpu(&sna->kgem, priv->cpu_bo);
 		}
-		if (flags & MOVE_WRITE)
+		if (flags & MOVE_WRITE) {
+			DBG(("%s: discarding GPU bo in favour of CPU bo\n", __FUNCTION__));
 			sna_pixmap_free_gpu(sna, priv);
+			priv->undamaged = false;
+		}
 	}
 	priv->cpu = (flags & MOVE_ASYNC_HINT) == 0;
 	assert(pixmap->devPrivate.ptr);
@@ -2371,6 +2375,7 @@ sna_drawable_use_bo(DrawablePtr drawable, unsigned flags, const BoxRec *box,
 {
 	PixmapPtr pixmap = get_drawable_pixmap(drawable);
 	struct sna_pixmap *priv = sna_pixmap(pixmap);
+	struct sna *sna;
 	RegionRec region;
 	int16_t dx, dy;
 	int ret;
@@ -2565,8 +2570,13 @@ use_cpu_bo:
 	if (priv->cpu_bo == NULL)
 		return NULL;
 
-	if ((flags & FORCE_GPU) == 0 && !kgem_bo_is_busy(priv->cpu_bo))
+	sna = to_sna_from_pixmap(pixmap);
+	if ((flags & FORCE_GPU) == 0 &&
+	    !__kgem_bo_is_busy(&sna->kgem, priv->cpu_bo)) {
+		DBG(("%s: has CPU bo, but is idle and acceleration not forced\n",
+		     __FUNCTION__));
 		return NULL;
+	}
 
 	get_drawable_deltas(drawable, pixmap, &dx, &dy);
 
@@ -2590,11 +2600,11 @@ use_cpu_bo:
 		if (priv->cpu_bo->pitch >= 4096)
 			goto move_to_gpu;
 
-		if (!to_sna_from_pixmap(pixmap)->kgem.can_blt_cpu)
+		if (!sna->kgem.can_blt_cpu)
 			goto move_to_gpu;
 	}
 
-	if (!to_sna_from_pixmap(pixmap)->kgem.can_blt_cpu)
+	if (!sna->kgem.can_blt_cpu)
 		return NULL;
 
 	if (!sna_drawable_move_region_to_cpu(&pixmap->drawable, &region,
@@ -2613,7 +2623,11 @@ use_cpu_bo:
 
 	if (priv->shm) {
 		assert(!priv->flush);
-		sna_add_flush_pixmap(to_sna_from_pixmap(pixmap), priv);
+		sna_add_flush_pixmap(sna, priv);
+
+		/* As we may have flushed and retired,, recheck for busy bo */
+		if ((flags & FORCE_GPU) == 0 && !kgem_bo_is_busy(priv->cpu_bo))
+			return NULL;
 	}
 
 	DBG(("%s: using CPU bo with damage? %d\n",
commit 8032f51859ce1928922edf6892f493a84d9c39f0
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Aug 22 10:40:53 2012 +0100

    sna: If we cannot use the CPU bo along a render pathway, promote 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 5521c83..110d9c5 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2589,6 +2589,9 @@ use_cpu_bo:
 
 		if (priv->cpu_bo->pitch >= 4096)
 			goto move_to_gpu;
+
+		if (!to_sna_from_pixmap(pixmap)->kgem.can_blt_cpu)
+			goto move_to_gpu;
 	}
 
 	if (!to_sna_from_pixmap(pixmap)->kgem.can_blt_cpu)
commit cc967507bbf357e1d5ec3cd0f3c0c5ecfa8b867a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Aug 22 10:36:04 2012 +0100

    sna: Convert to using IGNORE_CPU flag rather than complicating the CPU damage
    
    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 9731a0a..5521c83 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -4113,6 +4113,7 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
 	struct sna *sna = to_sna_from_pixmap(src_pixmap);
 	struct sna_damage **damage;
 	struct kgem_bo *bo;
+	unsigned hint;
 	int16_t src_dx, src_dy;
 	int16_t dst_dx, dst_dy;
 	BoxPtr box = RegionRects(region);
@@ -4171,20 +4172,20 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
 	if (dst_priv == NULL)
 		goto fallback;
 
+	hint = source_prefer_gpu(src_priv) ?:
+		region_inplace(sna, dst_pixmap, region,
+			       dst_priv, alu_overwrites(alu));
 	if (dst_priv->cpu_damage && alu_overwrites(alu)) {
 		DBG(("%s: overwritting CPU damage\n", __FUNCTION__));
-		sna_damage_subtract(&dst_priv->cpu_damage, region);
-		if (dst_priv->cpu_damage == NULL) {
+		if (region_subsumes_damage(region, dst_priv->cpu_damage)) {
+			DBG(("%s: discarding existing CPU damage\n", __FUNCTION__));
+			sna_damage_destroy(&dst_priv->cpu_damage);
 			list_del(&dst_priv->list);
-			dst_priv->undamaged = false;
-			dst_priv->cpu = false;
 		}
+		hint |= IGNORE_CPU;
 	}
 
-	bo = sna_drawable_use_bo(&dst_pixmap->drawable,
-				 source_prefer_gpu(src_priv) ?:
-				 region_inplace(sna, dst_pixmap, region,
-						dst_priv, alu_overwrites(alu)),
+	bo = sna_drawable_use_bo(&dst_pixmap->drawable, hint,
 				 &region->extents, &damage);
 	if (bo) {
 		if (src_priv && src_priv->clear) {
commit 5aa59ce7c012eb309c4f5a362ccf531c065bd7ff
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Aug 22 10:10:33 2012 +0100

    sna: Assert that the CPU bo is not used if the GPU is clear
    
    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 ba8c93d..9731a0a 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2561,6 +2561,7 @@ use_gpu_bo:
 	return priv->gpu_bo;
 
 use_cpu_bo:
+	assert(!priv->clear);
 	if (priv->cpu_bo == NULL)
 		return NULL;
 
commit 273765033223024ff6a662195e0e4b96f8960463
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Aug 22 00:48:08 2012 +0100

    sna: Make sure the opposite damage is destroyed after reducing to all
    
    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 ee23b43..ba8c93d 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2536,9 +2536,10 @@ done:
 	assert(priv->gpu_bo != NULL);
 	if (sna_damage_is_all(&priv->gpu_damage,
 			      pixmap->drawable.width,
-			      pixmap->drawable.height))
+			      pixmap->drawable.height)) {
+		sna_damage_destroy(&priv->cpu_damage);
 		*damage = NULL;
-	else
+	} else
 		*damage = &priv->gpu_damage;
 
 	DBG(("%s: using GPU bo with damage? %d\n",
@@ -2579,6 +2580,8 @@ use_cpu_bo:
 	if (priv->gpu_bo && kgem_bo_is_busy(priv->gpu_bo))
 		goto move_to_gpu;
 
+	assert(priv->gpu_bo == NULL || priv->gpu_bo->proxy == NULL);
+
 	if (flags & RENDER_GPU) {
 		if (priv->gpu_bo && priv->gpu_bo->tiling)
 			goto move_to_gpu;
@@ -2598,9 +2601,10 @@ use_cpu_bo:
 
 	if (sna_damage_is_all(&priv->cpu_damage,
 			      pixmap->drawable.width,
-			      pixmap->drawable.height))
+			      pixmap->drawable.height)) {
+		sna_damage_destroy(&priv->gpu_damage);
 		*damage = NULL;
-	else
+	} else
 		*damage = &priv->cpu_damage;
 
 	if (priv->shm) {
@@ -2726,6 +2730,8 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
 			      pixmap->drawable.width,
 			      pixmap->drawable.height)) {
 		DBG(("%s: already all-damaged\n", __FUNCTION__));
+		sna_damage_destroy(&priv->cpu_damage);
+		priv->undamaged = true;
 		goto active;
 	}
 
commit 31e398c9dbd8539e6fd2cc7398e97ee1df2f7f23
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Aug 22 00:38:17 2012 +0100

    sna: Discard a no-longer-used GPU bo after moving to the CPU domain
    
    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 59ed0d7..ee23b43 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1426,6 +1426,12 @@ done:
 	if (flags & MOVE_WRITE) {
 		priv->source_count = SOURCE_BIAS;
 		assert(priv->gpu_bo == NULL || priv->gpu_bo->proxy == NULL);
+		if (priv->gpu_bo && priv->gpu_bo->domain != DOMAIN_GPU) {
+			DBG(("%s: discarding inactive GPU bo\n", __FUNCTION__));
+			assert(DAMAGE_IS_ALL(priv->cpu_damage));
+			sna_pixmap_free_gpu(sna, priv);
+			priv->undamaged = false;
+		}
 	}
 
 	if (priv->cpu_bo) {
commit 8be15c37df9d9b34e0f21700673212bd19c772b2
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Aug 22 00:27:00 2012 +0100

    sna: Balance CPU bo accounting for SHM pixmaps
    
    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 1c77104..59ed0d7 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -473,8 +473,8 @@ static void sna_pixmap_free_cpu(struct sna *sna, struct sna_pixmap *priv)
 		sna->debug_memory.cpu_bo_bytes -= kgem_bo_size(priv->cpu_bo);
 #endif
 		if (priv->cpu_bo->flush) {
+			assert(priv->cpu_bo->reusable == false);
 			kgem_bo_sync__cpu(&sna->kgem, priv->cpu_bo);
-			priv->cpu_bo->reusable = false;
 			sna_accel_watch_flush(sna, -1);
 		}
 		kgem_bo_destroy(&sna->kgem, priv->cpu_bo);
@@ -819,6 +819,10 @@ fallback:
 	priv->cpu_bo->pitch = pitch;
 	priv->cpu_bo->reusable = false;
 	sna_accel_watch_flush(sna, 1);
+#ifdef DEBUG_MEMORY
+	sna->debug_memory.cpu_bo_allocs++;
+	sna->debug_memory.cpu_bo_bytes += kgem_bo_size(priv->cpu_bo);
+#endif
 
 	priv->cpu = true;
 	priv->shm = true;
commit 262d57a5aaac46508d8e29860c7a567bcd5bc4d8
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Aug 21 23:36:12 2012 +0100

    sna: Display still resident memory in inactive/snoop caches under DEBUG_MEMORY
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 0942917..077f3e1 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -2343,6 +2343,16 @@ bool kgem_expire_cache(struct kgem *kgem)
 			kgem_bo_free(kgem, bo);
 		}
 	}
+#ifdef DEBUG_MEMORY
+	{
+		long size = 0;
+		int count = 0;
+		list_for_each_entry(bo, &kgem->snoop, list)
+			count++, size += bytes(bo);
+		ErrorF("%s: still allocated %d bo, %ld bytes, in snoop cache\n",
+		       __FUNCTION__, count, size);
+	}
+#endif
 
 	kgem_retire(kgem);
 	if (kgem->wedged)
@@ -2408,6 +2418,18 @@ bool kgem_expire_cache(struct kgem *kgem)
 		}
 	}
 
+#ifdef DEBUG_MEMORY
+	{
+		long size = 0;
+		int count = 0;
+		for (i = 0; i < ARRAY_SIZE(kgem->inactive); i++)
+			list_for_each_entry(bo, &kgem->inactive[i], list)
+				count++, size += bytes(bo);
+		ErrorF("%s: still allocated %d bo, %ld bytes, in inactive cache\n",
+		       __FUNCTION__, count, size);
+	}
+#endif
+
 	DBG(("%s: expired %d objects, %d bytes, idle? %d\n",
 	     __FUNCTION__, count, size, idle));
 
commit 304581cc02adeb865a24edde934b5b9ceba68d96
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Aug 21 23:29:12 2012 +0100

    sna: Add a DBG to log pixmap destruction
    
    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 9fda8ca..1c77104 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1059,6 +1059,8 @@ static Bool sna_destroy_pixmap(PixmapPtr pixmap)
 		return TRUE;
 
 	priv = sna_pixmap(pixmap);
+	DBG(("%s: pixmap=%ld, attached?=%d\n",
+	     __FUNCTION__, pixmap->drawable.serialNumber, priv != NULL));
 	if (priv == NULL) {
 		FreePixmap(pixmap);
 		return TRUE;


More information about the xorg-commit mailing list