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

Chris Wilson ickle at kemper.freedesktop.org
Tue Mar 5 05:37:46 PST 2013


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

New commits:
commit d31dc1343d59f8ef8876e1dc8ddfec9c6be1a602
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Mar 5 13:30:37 2013 +0000

    sna: Refactor the is-mappable test for inplace operations
    
    By moving the test into the common function for creating a mappable GPU
    bo, we can also consider recreating that bo when desirable.
    
    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 924a88f..a2e5be3 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1377,15 +1377,13 @@ static inline bool pixmap_inplace(struct sna *sna,
 	if (!write_only && priv->cpu_damage)
 		return false;
 
-	if (priv->gpu_bo && !kgem_bo_is_mappable(&sna->kgem, priv->gpu_bo))
-		return false;
-
 	return (pixmap->devKind * pixmap->drawable.height >> 12) >
 		sna->kgem.half_cpu_cache_pages;
 }
 
 static bool
-sna_pixmap_create_mappable_gpu(PixmapPtr pixmap)
+sna_pixmap_create_mappable_gpu(PixmapPtr pixmap,
+			       bool can_replace)
 {
 	struct sna *sna = to_sna_from_pixmap(pixmap);
 	struct sna_pixmap *priv = sna_pixmap(pixmap);
@@ -1399,6 +1397,22 @@ sna_pixmap_create_mappable_gpu(PixmapPtr pixmap)
 
 	assert_pixmap_damage(pixmap);
 
+	if (priv->gpu_bo) {
+		if (can_replace &&
+		    (!kgem_bo_is_mappable(&sna->kgem, priv->gpu_bo) ||
+		     __kgem_bo_is_busy(&sna->kgem, priv->gpu_bo))) {
+			if (priv->pinned)
+				return false;
+
+			DBG(("%s: discard busy GPU bo\n", __FUNCTION__));
+			sna_pixmap_free_gpu(sna, priv);
+		}
+
+		return kgem_bo_is_mappable(&sna->kgem, priv->gpu_bo);
+	}
+
+	assert_pixmap_damage(pixmap);
+
 	assert(priv->gpu_damage == NULL);
 	assert(priv->gpu_bo == NULL);
 
@@ -1538,22 +1552,11 @@ _sna_pixmap_move_to_cpu(PixmapPtr pixmap, unsigned int flags)
 		     __FUNCTION__, priv->gpu_damage != NULL, priv->clear));
 
 		if (priv->create & KGEM_CAN_CREATE_GPU &&
-		    pixmap_inplace(sna, pixmap, priv, true)) {
-			assert(!priv->shm);
+		    pixmap_inplace(sna, pixmap, priv, true) &&
+		    sna_pixmap_create_mappable_gpu(pixmap, true)) {
 			DBG(("%s: write inplace\n", __FUNCTION__));
-			if (priv->gpu_bo) {
-				if (__kgem_bo_is_busy(&sna->kgem,
-						      priv->gpu_bo)) {
-					if (priv->pinned)
-						goto skip_inplace_map;
-
-					DBG(("%s: discard busy GPU bo\n", __FUNCTION__));
-					sna_pixmap_free_gpu(sna, priv);
-				}
-			}
-			if (priv->gpu_bo == NULL &&
-			    !sna_pixmap_create_mappable_gpu(pixmap))
-				goto skip_inplace_map;
+			assert(!priv->shm);
+			assert(priv->gpu_bo->exec == NULL);
 
 			pixmap->devPrivate.ptr =
 				kgem_bo_map(&sna->kgem, priv->gpu_bo);
@@ -1609,11 +1612,10 @@ skip_inplace_map:
 
 	if (operate_inplace(priv, flags) &&
 	    pixmap_inplace(sna, pixmap, priv, (flags & MOVE_READ) == 0) &&
-	    (priv->gpu_bo || sna_pixmap_create_mappable_gpu(pixmap))) {
-		kgem_bo_submit(&sna->kgem, priv->gpu_bo);
-
+	     sna_pixmap_create_mappable_gpu(pixmap, (flags & MOVE_READ) == 0)) {
 		DBG(("%s: try to operate inplace (GTT)\n", __FUNCTION__));
 		assert((flags & MOVE_READ) == 0 || priv->cpu == false);
+		assert(priv->gpu_bo->exec == NULL);
 
 		pixmap->devPrivate.ptr = kgem_bo_map(&sna->kgem, priv->gpu_bo);
 		priv->mapped = pixmap->devPrivate.ptr != NULL;
@@ -1968,10 +1970,9 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 
 	if (operate_inplace(priv, flags) &&
 	    region_inplace(sna, pixmap, region, priv, (flags & MOVE_READ) == 0) &&
-	    (priv->gpu_bo || sna_pixmap_create_mappable_gpu(pixmap))) {
-		kgem_bo_submit(&sna->kgem, priv->gpu_bo);
-
+	     sna_pixmap_create_mappable_gpu(pixmap, false)) {
 		DBG(("%s: try to operate inplace\n", __FUNCTION__));
+		assert(priv->gpu_bo->exec == NULL);
 
 		pixmap->devPrivate.ptr = kgem_bo_map(&sna->kgem, priv->gpu_bo);
 		priv->mapped = pixmap->devPrivate.ptr != NULL;
commit 9fa9234c7061be3cff9a65aac0702f4c3caac40d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Mar 5 11:34:49 2013 +0000

    sna: Prefer GPU for self-copies when undamaged on the CPU
    
    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 3d17209..924a88f 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -4041,7 +4041,7 @@ sna_self_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
 	if (priv == NULL || DAMAGE_IS_ALL(priv->cpu_damage) || priv->shm)
 		goto fallback;
 
-	if (priv->gpu_damage) {
+	if (priv->gpu_damage || (priv->cpu_damage == NULL && priv->gpu_bo)) {
 		assert(priv->gpu_bo);
 
 		if (alu == GXcopy && priv->clear)


More information about the xorg-commit mailing list