xf86-video-intel: 2 commits - src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/gen7_render.c src/sna/sna_render.c src/sna/sna_tiling.c

Chris Wilson ickle at kemper.freedesktop.org
Wed Jun 26 04:08:50 PDT 2013


 src/sna/gen4_render.c |    8 ++---
 src/sna/gen5_render.c |    8 ++---
 src/sna/gen6_render.c |    8 ++---
 src/sna/gen7_render.c |    8 ++---
 src/sna/sna_render.c  |    5 ++-
 src/sna/sna_tiling.c  |   71 ++++++++++++++++++++++++++++++--------------------
 6 files changed, 62 insertions(+), 46 deletions(-)

New commits:
commit 362b0dc6a3b1692b752d8f250075ccc81debfca3
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jun 26 12:04:46 2013 +0100

    sna/gen4+: Fix determination of intermediate extents
    
    Complete logic fail for finding the bounding box of the boxes to be
    copied.
    
    Reported-by: Clemens Eisserer <linuxhippy at gmail.com>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=66168
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index e6b6d44..b27e531 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2377,14 +2377,14 @@ fallback_blt:
 		int i;
 
 		for (i = 1; i < n; i++) {
-			if (extents.x1 < box[i].x1)
+			if (box[i].x1 < extents.x1)
 				extents.x1 = box[i].x1;
-			if (extents.y1 < box[i].y1)
+			if (box[i].y1 < extents.y1)
 				extents.y1 = box[i].y1;
 
-			if (extents.x2 > box[i].x2)
+			if (box[i].x2 > extents.x2)
 				extents.x2 = box[i].x2;
-			if (extents.y2 > box[i].y2)
+			if (box[i].y2 > extents.y2)
 				extents.y2 = box[i].y2;
 		}
 
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index f7f7e6f..689332c 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2323,14 +2323,14 @@ fallback_blt:
 		int i;
 
 		for (i = 1; i < n; i++) {
-			if (extents.x1 < box[i].x1)
+			if (box[i].x1 < extents.x1)
 				extents.x1 = box[i].x1;
-			if (extents.y1 < box[i].y1)
+			if (box[i].y1 < extents.y1)
 				extents.y1 = box[i].y1;
 
-			if (extents.x2 > box[i].x2)
+			if (box[i].x2 > extents.x2)
 				extents.x2 = box[i].x2;
-			if (extents.y2 > box[i].y2)
+			if (box[i].y2 > extents.y2)
 				extents.y2 = box[i].y2;
 		}
 
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 5cdfec7..e9136d7 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2758,14 +2758,14 @@ fallback_blt:
 
 		extents = box[0];
 		for (i = 1; i < n; i++) {
-			if (extents.x1 < box[i].x1)
+			if (box[i].x1 < extents.x1)
 				extents.x1 = box[i].x1;
-			if (extents.y1 < box[i].y1)
+			if (box[i].y1 < extents.y1)
 				extents.y1 = box[i].y1;
 
-			if (extents.x2 > box[i].x2)
+			if (box[i].x2 > extents.x2)
 				extents.x2 = box[i].x2;
-			if (extents.y2 > box[i].y2)
+			if (box[i].y2 > extents.y2)
 				extents.y2 = box[i].y2;
 		}
 
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 49a82e1..665d515 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2941,14 +2941,14 @@ fallback_blt:
 
 		extents = box[0];
 		for (i = 1; i < n; i++) {
-			if (extents.x1 < box[i].x1)
+			if (box[i].x1 < extents.x1)
 				extents.x1 = box[i].x1;
-			if (extents.y1 < box[i].y1)
+			if (box[i].y1 < extents.y1)
 				extents.y1 = box[i].y1;
 
-			if (extents.x2 > box[i].x2)
+			if (box[i].x2 > extents.x2)
 				extents.x2 = box[i].x2;
-			if (extents.y2 > box[i].y2)
+			if (box[i].y2 > extents.y2)
 				extents.y2 = box[i].y2;
 		}
 
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index 330bfad..f27d1d8 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -1890,11 +1890,12 @@ sna_render_composite_redirect(struct sna *sna,
 	return false;
 #endif
 
-	DBG(("%s: target too large (%dx%d), copying to temporary %dx%d, max %d\n",
+	DBG(("%s: target too large (%dx%d), copying to temporary %dx%d, max %d / %d\n",
 	     __FUNCTION__,
 	     op->dst.width, op->dst.height,
 	     width, height,
-	     sna->render.max_3d_size));
+	     sna->render.max_3d_size,
+	     sna->render.max_3d_pitch));
 
 	if (!width || !height)
 		return false;
commit 2212468315f383d09ea17c2edac8666bdb862bc7
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jun 26 11:26:29 2013 +0100

    sna: Avoid allocating a temporary if using rendercpy tiles
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_tiling.c b/src/sna/sna_tiling.c
index 02ab59d..e6cc193 100644
--- a/src/sna/sna_tiling.c
+++ b/src/sna/sna_tiling.c
@@ -804,32 +804,40 @@ sna_tiling_copy_boxes(struct sna *sna, uint8_t alu,
 	BoxRec extents, tile, stack[64], *clipped, *c;
 	PixmapRec p;
 	int i, step, tiling;
+	bool create = true;
 	bool ret = false;
 
 	extents = box[0];
 	for (i = 1; i < n; i++) {
-		if (extents.x1 < box[i].x1)
+		if (box[i].x1 < extents.x1)
 			extents.x1 = box[i].x1;
-		if (extents.y1 < box[i].y1)
+		if (box[i].y1 < extents.y1)
 			extents.y1 = box[i].y1;
 
-		if (extents.x2 > box[i].x2)
+		if (box[i].x2 > extents.x2)
 			extents.x2 = box[i].x2;
-		if (extents.y2 > box[i].y2)
+		if (box[i].y2 > extents.y2)
 			extents.y2 = box[i].y2;
 	}
 
-	step = sna->render.max_3d_size - 4096 / dst->drawable.bitsPerPixel;
-	while (step * step * 4 > sna->kgem.max_upload_tile_size)
-		step /= 2;
-
 	tiling = I915_TILING_X;
 	if (!kgem_bo_can_blt(&sna->kgem, src_bo) ||
 	    !kgem_bo_can_blt(&sna->kgem, dst_bo))
 		tiling = I915_TILING_Y;
 
-	DBG(("%s: tiling copy, using %dx%d %c tiles\n",
-	     __FUNCTION__, step, step, tiling == I915_TILING_X ? 'X' : 'Y'));
+	create = (src_bo->pitch > sna->render.max_3d_pitch ||
+		  dst_bo->pitch > sna->render.max_3d_pitch);
+
+	step = sna->render.max_3d_size / 2;
+	if (create) {
+		while (step * step * 4 > sna->kgem.max_upload_tile_size)
+			step /= 2;
+	}
+
+	DBG(("%s: tiling copy %dx%d, %s %dx%d %c tiles\n", __FUNCTION__,
+	     extents.x2-extents.x1, extents.y2-extents.y1,
+	     create ? "creating" : "using",
+	     step, step, tiling == I915_TILING_X ? 'X' : 'Y'));
 
 	if (n > ARRAY_SIZE(stack)) {
 		clipped = malloc(sizeof(BoxRec) * n);
@@ -878,24 +886,31 @@ sna_tiling_copy_boxes(struct sna *sna, uint8_t alu,
 			DBG(("%s: tile (%d, %d), (%d, %d)\n",
 			     __FUNCTION__, tile.x1, tile.y1, tile.x2, tile.y2));
 
-			tmp_bo = kgem_create_2d(&sna->kgem,
-						p.drawable.width,
-						p.drawable.height,
-						p.drawable.bitsPerPixel,
-						tiling, CREATE_TEMPORARY);
-			if (!tmp_bo)
-				goto tiled_error;
-
-			i = (sna->render.copy_boxes(sna, GXcopy,
-						    src, src_bo, src_dx, src_dy,
-						    &p, tmp_bo, -tile.x1, -tile.y1,
-						    clipped, c - clipped, 0) &&
-			     sna->render.copy_boxes(sna, alu,
-						    &p, tmp_bo, -tile.x1, -tile.y1,
-						    dst, dst_bo, dst_dx, dst_dy,
-						    clipped, c - clipped, 0));
-
-			kgem_bo_destroy(&sna->kgem, tmp_bo);
+			if (create) {
+				tmp_bo = kgem_create_2d(&sna->kgem,
+							p.drawable.width,
+							p.drawable.height,
+							p.drawable.bitsPerPixel,
+							tiling, CREATE_TEMPORARY);
+				if (!tmp_bo)
+					goto tiled_error;
+
+				i = (sna->render.copy_boxes(sna, GXcopy,
+							    src, src_bo, src_dx, src_dy,
+							    &p, tmp_bo, -tile.x1, -tile.y1,
+							    clipped, c - clipped, 0) &&
+				     sna->render.copy_boxes(sna, alu,
+							    &p, tmp_bo, -tile.x1, -tile.y1,
+							    dst, dst_bo, dst_dx, dst_dy,
+							    clipped, c - clipped, 0));
+
+				kgem_bo_destroy(&sna->kgem, tmp_bo);
+			} else {
+				i = sna->render.copy_boxes(sna, GXcopy,
+							   src, src_bo, src_dx, src_dy,
+							   dst, dst_bo, dst_dx, dst_dy,
+							   clipped, c - clipped, 0);
+			}
 
 			if (!i)
 				goto tiled_error;


More information about the xorg-commit mailing list