xf86-video-intel: 3 commits - src/sna/kgem.c src/sna/kgem.h src/sna/sna_accel.c src/sna/sna_blt.c src/sna/sna_glyphs.c src/sna/sna_tiling.c

Chris Wilson ickle at kemper.freedesktop.org
Tue Nov 5 10:23:59 CET 2013


 src/sna/kgem.c       |   82 ++++++++++++++++++++++++++++++++++++---------------
 src/sna/kgem.h       |    2 +
 src/sna/sna_accel.c  |   14 ++++++++
 src/sna/sna_blt.c    |    1 
 src/sna/sna_glyphs.c |   20 +-----------
 src/sna/sna_tiling.c |    2 +
 6 files changed, 80 insertions(+), 41 deletions(-)

New commits:
commit dc61705a6e425952de4c81c2320382af07cf948a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Nov 5 08:49:28 2013 +0000

    sna: Use an inplace exchange for large untiled BO
    
    On older architectures, large BO have to be untiled and so we can reuse
    an existing CPU bo by adjusting its caching mode.
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=70924
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 00d0723..3a74616 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -6541,3 +6541,13 @@ kgem_replace_bo(struct kgem *kgem,
 
 	return dst;
 }
+
+bool kgem_bo_convert_to_gpu(struct kgem *kgem, struct kgem_bo *bo)
+{
+	assert(bo->tiling == I915_TILING_NONE);
+
+	if (kgem->has_llc)
+		return true;
+
+	return gem_set_caching(kgem->fd, bo->handle, UNCACHED);
+}
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index f2abb04..6abab08 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -299,6 +299,8 @@ struct kgem_bo *kgem_create_cpu_2d(struct kgem *kgem,
 				   int bpp,
 				   uint32_t flags);
 
+bool kgem_bo_convert_to_gpu(struct kgem *kgem, struct kgem_bo *bo);
+
 uint32_t kgem_bo_get_binding(struct kgem_bo *bo, uint32_t format);
 void kgem_bo_set_binding(struct kgem_bo *bo, uint32_t format, uint16_t offset);
 
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 28cdd74..2aae0e2 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -3772,6 +3772,20 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
 			tiling = (flags & MOVE_SOURCE_HINT) ? I915_TILING_Y : DEFAULT_TILING;
 			tiling = sna_pixmap_choose_tiling(pixmap, tiling);
 
+			if (tiling == I915_TILING_NONE &&
+			    priv->cpu_bo && !priv->shm &&
+			    kgem_bo_convert_to_gpu(&sna->kgem, priv->cpu_bo)) {
+				assert(!priv->mapped);
+				priv->gpu_bo = priv->cpu_bo;
+				priv->cpu_bo = NULL;
+				priv->ptr = NULL;
+				sna_damage_all(&priv->gpu_damage,
+					       pixmap->drawable.width,
+					       pixmap->drawable.height);
+				sna_damage_destroy(&priv->cpu_damage);
+				goto done;
+			}
+
 			create = 0;
 			if (flags & MOVE_INPLACE_HINT || (priv->cpu_damage && priv->cpu_bo == NULL))
 				create = CREATE_GTT_MAP | CREATE_INACTIVE;
commit f3225fcb38686f3b9701725bf3a11ecf1c100c3f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Nov 5 08:38:22 2013 +0000

    sna: Be move conservative with tiling sizes for older fenced gen
    
    The older generations have stricter requirements for alignment of fenced
    GPU surfaces, so accommodate this by reducing our estimate available
    space for the temporary tile.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 21f958c..00d0723 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -4830,20 +4830,28 @@ bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo)
 			if (kgem->nfence >= kgem->fence_max)
 				return false;
 
-			size = 3*kgem->aperture_fenced;
-			if (kgem->aperture_total == kgem->aperture_mappable)
-				size += kgem->aperture;
-			if (size > kgem->aperture_mappable &&
-			    kgem_ring_is_idle(kgem, kgem->ring))
-				return false;
+			if (kgem->aperture_fenced) {
+				size = 3*kgem->aperture_fenced;
+				if (kgem->aperture_total == kgem->aperture_mappable)
+					size += kgem->aperture;
+				if (size > kgem->aperture_mappable &&
+				    kgem_ring_is_idle(kgem, kgem->ring)) {
+					DBG(("%s: opportunistic fence flush\n", __FUNCTION__));
+					return false;
+				}
+			}
 
 			size = kgem->aperture_fenced;
 			size += kgem_bo_fenced_size(kgem, bo);
-			size *= 2;
+			if (kgem->gen < 033)
+				size *= 2;
 			if (kgem->aperture_total == kgem->aperture_mappable)
 				size += kgem->aperture;
-			if (size > kgem->aperture_mappable)
+			if (size > kgem->aperture_mappable) {
+				DBG(("%s: estimated fence space required [%d] exceed aperture [%d]\n",
+				     __FUNCTION__, size, kgem->aperture_mappable));
 				return false;
+			}
 		}
 
 		return true;
@@ -4866,20 +4874,28 @@ bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo)
 		if (kgem->nfence >= kgem->fence_max)
 			return false;
 
-		size = 3*kgem->aperture_fenced;
-		if (kgem->aperture_total == kgem->aperture_mappable)
-			size += kgem->aperture;
-		if (size > kgem->aperture_mappable &&
-		    kgem_ring_is_idle(kgem, kgem->ring))
-			return false;
+		if (kgem->aperture_fenced) {
+			size = 3*kgem->aperture_fenced;
+			if (kgem->aperture_total == kgem->aperture_mappable)
+				size += kgem->aperture;
+			if (size > kgem->aperture_mappable &&
+			    kgem_ring_is_idle(kgem, kgem->ring)) {
+				DBG(("%s: opportunistic fence flush\n", __FUNCTION__));
+				return false;
+			}
+		}
 
 		size = kgem->aperture_fenced;
 		size += kgem_bo_fenced_size(kgem, bo);
-		size *= 2;
+		if (kgem->gen < 033)
+			size *= 2;
 		if (kgem->aperture_total == kgem->aperture_mappable)
 			size += kgem->aperture;
-		if (size > kgem->aperture_mappable)
+		if (size > kgem->aperture_mappable) {
+			DBG(("%s: estimated fence space required [%d] exceed aperture [%d]\n",
+			     __FUNCTION__, size, kgem->aperture_mappable));
 			return false;
+		}
 	}
 
 	if (kgem->aperture + kgem->aperture_fenced + num_pages(bo) > kgem->aperture_high) {
@@ -4948,20 +4964,28 @@ bool kgem_check_many_bo_fenced(struct kgem *kgem, ...)
 		if (kgem->nfence + num_fence > kgem->fence_max)
 			return false;
 
-		size = 3*kgem->aperture_fenced;
-		if (kgem->aperture_total == kgem->aperture_mappable)
-			size += kgem->aperture;
-		if (size > kgem->aperture_mappable &&
-		    kgem_ring_is_idle(kgem, kgem->ring))
-			return false;
+		if (kgem->aperture_fenced) {
+			size = 3*kgem->aperture_fenced;
+			if (kgem->aperture_total == kgem->aperture_mappable)
+				size += kgem->aperture;
+			if (size > kgem->aperture_mappable &&
+			    kgem_ring_is_idle(kgem, kgem->ring)) {
+				DBG(("%s: opportunistic fence flush\n", __FUNCTION__));
+				return false;
+			}
+		}
 
 		size = kgem->aperture_fenced;
 		size += fenced_size;
-		size *= 2;
+		if (kgem->gen < 033)
+			size *= 2;
 		if (kgem->aperture_total == kgem->aperture_mappable)
 			size += kgem->aperture;
-		if (size > kgem->aperture_mappable)
+		if (size > kgem->aperture_mappable) {
+			DBG(("%s: estimated fence space required [%d] exceed aperture [%d]\n",
+			     __FUNCTION__, size, kgem->aperture_mappable));
 			return false;
+		}
 	}
 
 	if (num_pages == 0)
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 576b785..39ff0f6 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -3282,6 +3282,7 @@ bool sna_blt_copy_boxes(struct sna *sna, uint8_t alu,
 	    !kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL)) {
 		kgem_submit(kgem);
 		if (!kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL))
+			DBG(("%s: not enough room in aperture, fallback to tiling copy\n", __FUNCTION__));
 			return sna_tiling_blt_copy_boxes(sna, alu,
 							 src_bo, src_dx, src_dy,
 							 dst_bo, dst_dx, dst_dy,
diff --git a/src/sna/sna_tiling.c b/src/sna/sna_tiling.c
index 3bbcec7..b0a48dd 100644
--- a/src/sna/sna_tiling.c
+++ b/src/sna/sna_tiling.c
@@ -718,6 +718,8 @@ bool sna_tiling_blt_copy_boxes(struct sna *sna, uint8_t alu,
 	}
 	if (max_size > sna->kgem.max_copy_tile_size)
 		max_size = sna->kgem.max_copy_tile_size;
+	if (sna->kgem.gen < 033)
+		max_size /= 2; /* accommodate fence alignment */
 
 	pixman_region_init_rects(&region, box, nbox);
 
commit 93193aaf7d0fc4e3a3b9be1632bfd36331b47d2e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Nov 4 22:14:05 2013 +0000

    test

diff --git a/src/sna/sna_glyphs.c b/src/sna/sna_glyphs.c
index 5830d9b..f2c1788 100644
--- a/src/sna/sna_glyphs.c
+++ b/src/sna/sna_glyphs.c
@@ -519,21 +519,8 @@ static void apply_damage_clipped_to_dst(struct sna_composite_op *op,
 
 static inline bool clipped_glyphs(PicturePtr dst, int nlist, GlyphListPtr list, GlyphPtr *glyphs)
 {
-	PixmapPtr pixmap;
 	BoxRec box;
 
-	if (dst->pCompositeClip->data) {
-		DBG(("%s: yes, has complex region\n", __FUNCTION__));
-		return true;
-	}
-
-	pixmap = get_drawable_pixmap(dst->pDrawable);
-	if (dst->pCompositeClip->extents.x2 - dst->pCompositeClip->extents.x1 >= pixmap->drawable.width &&
-	    dst->pCompositeClip->extents.y2 - dst->pCompositeClip->extents.y1 >= pixmap->drawable.height) {
-		DBG(("%s: no, region matches drawable\n", __FUNCTION__));
-		return false;
-	}
-
 	glyph_extents(nlist, list, glyphs, &box);
 	DBG(("%s? glyph extents (%d, %d), (%d, %d), region (%d, %d), (%d, %d): %s\n",
 	     __FUNCTION__, box.x1, box.y1, box.x2, box.y2,
@@ -542,10 +529,9 @@ static inline bool clipped_glyphs(PicturePtr dst, int nlist, GlyphListPtr list,
 	      box.y1 < dst->pCompositeClip->extents.y1 ||
 	      box.x2 > dst->pCompositeClip->extents.x2 ||
 	      box.y2 > dst->pCompositeClip->extents.y2) ? "yes" : "no"));
-	return (box.x1 < dst->pCompositeClip->extents.x1 ||
-		box.y1 < dst->pCompositeClip->extents.y1 ||
-		box.x2 > dst->pCompositeClip->extents.x2 ||
-		box.y2 > dst->pCompositeClip->extents.y2);
+
+	return pixman_region_contains_rectangle(dst->pCompositeClip,
+						&box) != PIXMAN_REGION_IN;
 }
 
 flatten static bool


More information about the xorg-commit mailing list