xf86-video-intel: 3 commits - src/sna/gen6_render.c src/sna/gen7_render.c src/sna/sna_accel.c

Chris Wilson ickle at kemper.freedesktop.org
Mon Dec 12 01:44:35 PST 2011


 src/sna/gen6_render.c |   54 ++++++++++++++++++++++++++++----------------------
 src/sna/gen7_render.c |    2 -
 src/sna/sna_accel.c   |   29 --------------------------
 3 files changed, 32 insertions(+), 53 deletions(-)

New commits:
commit 2682308c10c9622247409dee9c6bb6a862b73c3f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Dec 12 09:24:11 2011 +0000

    sna: Remove bo transference for whole XCopyArea
    
    In benchmarking firefox this performs whose - it would appear the
    sources are indeed used more often than not.
    
    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 861cbe7..a71d5e1 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2012,35 +2012,6 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
 	     src_priv ? src_priv->cpu_bo : NULL,
 	     replaces));
 
-	if (replaces) {
-		if (src_pixmap->drawable.width == dst_pixmap->drawable.width &&
-		    src_pixmap->drawable.height == dst_pixmap->drawable.height &&
-		    dst_priv && !dst_priv->pinned && 0 &&
-		    src_priv && !src_priv->pinned &&
-		    src_priv->gpu_damage == NULL) {
-			if (sna_pixmap_move_to_gpu(src_pixmap)) {
-				DBG(("%s: transferring src GPU bo to dst\n", __FUNCTION__));
-				if (dst_priv->gpu_bo)
-					kgem_bo_destroy(&sna->kgem, dst_priv->gpu_bo);
-				sna_damage_destroy(&dst_priv->cpu_damage);
-				sna_damage_all(&dst_priv->gpu_damage,
-					       dst_pixmap->drawable.width,
-					       dst_pixmap->drawable.height);
-
-				dst_priv->gpu_bo = src_priv->gpu_bo;
-				src_priv->gpu_bo = NULL;
-
-				sna_damage_all(&src_priv->cpu_damage,
-					       src_pixmap->drawable.width,
-					       src_pixmap->drawable.height);
-				return;
-			}
-		}
-
-		if (!src_priv || src_priv->gpu_bo == NULL || src_priv->cpu_damage)
-			goto fallback;
-	}
-
 	/* Try to maintain the data on the GPU */
 	if (dst_priv && dst_priv->gpu_bo == NULL &&
 	    src_priv && src_priv->gpu_bo != NULL) {
commit 7703424222f8bd08450c1b109ea64c6b0ee901d8
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Dec 12 00:15:10 2011 +0000

    sna/gen6: Only use CPU bo for a render target if untiled
    
    For large render targets, we prefer to use tiled bo in order to avoid
    severe performance degradation. However, if we don't have a GPU bo but
    do have a CPU bo and the operation would be untiled, then simply use the
    CPU bo.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 6320dda..3ef1c42 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2027,16 +2027,12 @@ static void gen6_render_composite_done(struct sna *sna,
 }
 
 static Bool
-gen6_composite_set_target(struct sna_composite_op *op, PicturePtr dst)
+gen6_composite_set_target(struct sna *sna,
+			  struct sna_composite_op *op,
+			  PicturePtr dst)
 {
 	struct sna_pixmap *priv;
 
-	if (!gen6_check_dst_format(dst->format)) {
-		DBG(("%s: unsupported target format %08x\n",
-		     __FUNCTION__, dst->format));
-		return FALSE;
-	}
-
 	op->dst.pixmap = get_drawable_pixmap(dst->pDrawable);
 	op->dst.width  = op->dst.pixmap->drawable.width;
 	op->dst.height = op->dst.pixmap->drawable.height;
@@ -2044,10 +2040,17 @@ gen6_composite_set_target(struct sna_composite_op *op, PicturePtr dst)
 	priv = sna_pixmap(op->dst.pixmap);
 
 	op->dst.bo = NULL;
-	if (priv && priv->gpu_bo == NULL) {
+#if USE_VMAP
+	if (priv && priv->gpu_bo == NULL &&
+	    I915_TILING_NONE == kgem_choose_tiling(&sna->kgem,
+						   I915_TILING_X,
+						   op->dst.width,
+						   op->dst.height,
+						   op->dst.pixmap->drawable.bitsPerPixel)) {
 		op->dst.bo = priv->cpu_bo;
 		op->damage = &priv->cpu_damage;
 	}
+#endif
 	if (op->dst.bo == NULL) {
 		priv = sna_pixmap_force_to_gpu(op->dst.pixmap);
 		if (priv == NULL)
@@ -2241,7 +2244,7 @@ gen6_render_composite(struct sna *sna,
 					    tmp);
 
 	tmp->op = op;
-	if (!gen6_composite_set_target(tmp, dst))
+	if (!gen6_composite_set_target(sna, tmp, dst))
 		return FALSE;
 	sna_render_reduce_damage(tmp, dst_x, dst_y, width, height);
 
@@ -2599,7 +2602,7 @@ gen6_render_composite_spans(struct sna *sna,
 		return FALSE;
 
 	tmp->base.op = op;
-	if (!gen6_composite_set_target(&tmp->base, dst))
+	if (!gen6_composite_set_target(sna, &tmp->base, dst))
 		return FALSE;
 	sna_render_reduce_damage(&tmp->base, dst_x, dst_y, width, height);
 
commit a92a41ba3291a4304948ed1961d1242ca7d3981e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Dec 11 19:03:54 2011 +0000

    sna/gen6: Tidy the usage of the max pipeline size
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index cb62463..6320dda 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -56,6 +56,8 @@
 #define NO_FILL 0
 #define NO_FILL_BOXES 0
 
+#define GEN6_MAX_SIZE 8192
+
 static const uint32_t ps_kernel_nomask_affine[][4] = {
 #include "exa_wm_src_affine.g6b"
 #include "exa_wm_src_sample_argb.g6b"
@@ -1926,6 +1928,11 @@ gen6_composite_solid_init(struct sna *sna,
 	return channel->bo != NULL;
 }
 
+static inline bool too_large(int width, int height)
+{
+	return (width | height) > GEN6_MAX_SIZE;
+}
+
 static int
 gen6_composite_picture(struct sna *sna,
 		       PicturePtr picture,
@@ -1984,7 +1991,7 @@ gen6_composite_picture(struct sna *sna,
 		return sna_render_picture_convert(sna, picture, channel, pixmap,
 						  x, y, w, h, dst_x, dst_y);
 
-	if (pixmap->drawable.width > 8192 || pixmap->drawable.height > 8192) {
+	if (too_large(pixmap->drawable.width, pixmap->drawable.height)) {
 		DBG(("%s: extracting from pixmap %dx%d\n", __FUNCTION__,
 		     pixmap->drawable.width, pixmap->drawable.height));
 		return sna_render_picture_extract(sna, picture, channel,
@@ -2072,7 +2079,7 @@ try_blt(struct sna *sna, int width, int height)
 		return TRUE;
 	}
 
-	if (width > 8192 || height > 8192) {
+	if (too_large(width, height)) {
 		DBG(("%s: operation too large for 3D pipe (%d, %d)\n",
 		     __FUNCTION__, width, height));
 		return TRUE;
@@ -2238,7 +2245,7 @@ gen6_render_composite(struct sna *sna,
 		return FALSE;
 	sna_render_reduce_damage(tmp, dst_x, dst_y, width, height);
 
-	if (tmp->dst.width > 8192 || tmp->dst.height > 8192) {
+	if (too_large(tmp->dst.width, tmp->dst.height)) {
 		if (!sna_render_composite_redirect(sna, tmp,
 						   dst_x, dst_y, width, height))
 			return FALSE;
@@ -2739,8 +2746,8 @@ gen6_render_copy_boxes(struct sna *sna, uint8_t alu,
 		return TRUE;
 
 	if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
-	    src->drawable.width > 8192 || src->drawable.height > 8192 ||
-	    dst->drawable.width > 8192 || dst->drawable.height > 8192) {
+	    too_large(src->drawable.width, src->drawable.height) ||
+	    too_large(dst->drawable.width, dst->drawable.height)) {
 		if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
 			return FALSE;
 
@@ -2895,8 +2902,8 @@ gen6_render_copy(struct sna *sna, uint8_t alu,
 		return TRUE;
 
 	if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
-	    src->drawable.width > 8192 || src->drawable.height > 8192 ||
-	    dst->drawable.width > 8192 || dst->drawable.height > 8192) {
+	    too_large(src->drawable.width, src->drawable.height) ||
+	    too_large(dst->drawable.width, dst->drawable.height)) {
 		if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
 			return FALSE;
 
@@ -3000,8 +3007,7 @@ gen6_render_fill_boxes(struct sna *sna,
 	}
 
 	if (sna->kgem.ring != KGEM_RENDER ||
-	    dst->drawable.width > 8192 ||
-	    dst->drawable.height > 8192 ||
+	    too_large(dst->drawable.width, dst->drawable.height) ||
 	    !gen6_check_dst_format(format)) {
 		uint8_t alu = -1;
 
@@ -3028,8 +3034,7 @@ gen6_render_fill_boxes(struct sna *sna,
 				       pixel, box, n))
 			return TRUE;
 
-		if (dst->drawable.width > 8192 ||
-		    dst->drawable.height > 8192 ||
+		if (too_large(dst->drawable.width, dst->drawable.height) ||
 		    !gen6_check_dst_format(format))
 			return FALSE;
 	}
@@ -3229,7 +3234,7 @@ gen6_render_fill(struct sna *sna, uint8_t alu,
 		return TRUE;
 
 	if (!(alu == GXcopy || alu == GXclear) ||
-	    dst->drawable.width > 8192 || dst->drawable.height > 8192)
+	    too_large(dst->drawable.width, dst->drawable.height))
 		return sna_blt_fill(sna, alu,
 				    dst_bo, dst->drawable.bitsPerPixel,
 				    color,
@@ -3501,6 +3506,6 @@ Bool gen6_render_init(struct sna *sna)
 	sna->render.reset = gen6_render_reset;
 	sna->render.fini = gen6_render_fini;
 
-	sna->render.max_3d_size = 8192;
+	sna->render.max_3d_size = GEN6_MAX_SIZE;
 	return TRUE;
 }
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 68ec221..a45814e 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -3163,7 +3163,7 @@ gen7_render_fill_boxes(struct sna *sna,
 	return FALSE;
 #endif
 
-	if (op ==PictOpClear)
+	if (op == PictOpClear)
 		pixel = 0;
 	else if (!sna_get_pixel_from_rgba(&pixel,
 				     color->red,


More information about the xorg-commit mailing list