xf86-video-intel: 2 commits - src/sna/gen5_render.c src/sna/sna_blt.c src/sna/sna_io.c src/sna/sna_tiling.c

Chris Wilson ickle at kemper.freedesktop.org
Fri Jul 12 15:26:15 PDT 2013


 src/sna/gen5_render.c |   12 +++++++++++-
 src/sna/sna_blt.c     |    2 +-
 src/sna/sna_io.c      |   42 ++++++++++++++++++++++++------------------
 src/sna/sna_tiling.c  |   45 ++++++++++++++++++++++++---------------------
 4 files changed, 60 insertions(+), 41 deletions(-)

New commits:
commit 2b16eaefb38b4a6efe50a397e68793ab9a1cb2ef
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jul 12 23:22:59 2013 +0100

    sna: Avoid integer overflow when computing the tiled extents
    
    When stepping over the tiles, beware that the step may overflow the
    int16_t region extents, so use an int for the calculation.
    
    Reported-by: Andrew Woodward
    Bugzilla: https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-intel/+bug/1200766
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_io.c b/src/sna/sna_io.c
index 0a38aa8..406fa63 100644
--- a/src/sna/sna_io.c
+++ b/src/sna/sna_io.c
@@ -309,14 +309,16 @@ fallback:
 			     __FUNCTION__, step, step));
 
 			for (tile.y1 = extents.y1; tile.y1 < extents.y2; tile.y1 = tile.y2) {
-				tile.y2 = tile.y1 + step;
-				if (tile.y2 > extents.y2)
-					tile.y2 = extents.y2;
+				int y2 = tile.y1 + step;
+				if (y2 > extents.y2)
+					y2 = extents.y2;
+				tile.y2 = y2;
 
 				for (tile.x1 = extents.x1; tile.x1 < extents.x2; tile.x1 = tile.x2) {
-					tile.x2 = tile.x1 + step;
-					if (tile.x2 > extents.x2)
-						tile.x2 = extents.x2;
+					int x2 = tile.x1 + step;
+					if (x2 > extents.x2)
+						x2 = extents.x2;
+					tile.x2 = x2;
 
 					tmp.drawable.width  = tile.x2 - tile.x1;
 					tmp.drawable.height = tile.y2 - tile.y1;
@@ -767,14 +769,16 @@ tile:
 				clipped = stack;
 
 			for (tile.y1 = extents.y1; tile.y1 < extents.y2; tile.y1 = tile.y2) {
-				tile.y2 = tile.y1 + step;
-				if (tile.y2 > extents.y2)
-					tile.y2 = extents.y2;
+				int y2 = tile.y1 + step;
+				if (y2 > extents.y2)
+					y2 = extents.y2;
+				tile.y2 = y2;
 
 				for (tile.x1 = extents.x1; tile.x1 < extents.x2; tile.x1 = tile.x2) {
-					tile.x2 = tile.x1 + step;
-					if (tile.x2 > extents.x2)
-						tile.x2 = extents.x2;
+					int x2 = tile.x1 + step;
+					if (x2 > extents.x2)
+						x2 = extents.x2;
+					tile.x2 = x2;
 
 					tmp.drawable.width  = tile.x2 - tile.x1;
 					tmp.drawable.height = tile.y2 - tile.y1;
@@ -1136,14 +1140,16 @@ tile:
 				clipped = stack;
 
 			for (tile.y1 = extents.y1; tile.y1 < extents.y2; tile.y1 = tile.y2) {
-				tile.y2 = tile.y1 + step;
-				if (tile.y2 > extents.y2)
-					tile.y2 = extents.y2;
+				int y2 = tile.y1 + step;
+				if (y2 > extents.y2)
+					y2 = extents.y2;
+				tile.y2 = y2;
 
 				for (tile.x1 = extents.x1; tile.x1 < extents.x2; tile.x1 = tile.x2) {
-					tile.x2 = tile.x1 + step;
-					if (tile.x2 > extents.x2)
-						tile.x2 = extents.x2;
+					int x2 = tile.x1 + step;
+					if (x2 > extents.x2)
+						x2 = extents.x2;
+					tile.x2 = x2;
 
 					tmp.drawable.width  = tile.x2 - tile.x1;
 					tmp.drawable.height = tile.y2 - tile.y1;
diff --git a/src/sna/sna_tiling.c b/src/sna/sna_tiling.c
index e6cc193..aa5fe8f 100644
--- a/src/sna/sna_tiling.c
+++ b/src/sna/sna_tiling.c
@@ -607,18 +607,19 @@ sna_tiling_fill_boxes(struct sna *sna,
 	for (tile.extents.y1 = tile.extents.y2 = region.extents.y1;
 	     tile.extents.y2 < region.extents.y2;
 	     tile.extents.y1 = tile.extents.y2) {
-		tile.extents.y2 = tile.extents.y1 + step;
-		if (tile.extents.y2 > region.extents.y2)
-			tile.extents.y2 = region.extents.y2;
+		int y2 = tile.extents.y1 + step;
+		if (y2 > region.extents.y2)
+			y2 = region.extents.y2;
+		tile.extents.y2 = y2;
 
 		for (tile.extents.x1 = tile.extents.x2 = region.extents.x1;
 		     tile.extents.x2 < region.extents.x2;
 		     tile.extents.x1 = tile.extents.x2) {
 			PixmapRec tmp;
-
-			tile.extents.x2 = tile.extents.x1 + step;
-			if (tile.extents.x2 > region.extents.x2)
-				tile.extents.x2 = region.extents.x2;
+			int x2 = tile.extents.x1 + step;
+			if (x2 > region.extents.x2)
+				x2 = region.extents.x2;
+			tile.extents.x2 = x2;
 
 			tile.data = NULL;
 
@@ -733,18 +734,19 @@ bool sna_tiling_blt_copy_boxes(struct sna *sna, uint8_t alu,
 	for (tile.extents.y1 = tile.extents.y2 = region.extents.y1;
 	     tile.extents.y2 < region.extents.y2;
 	     tile.extents.y1 = tile.extents.y2) {
-		tile.extents.y2 = tile.extents.y1 + step;
-		if (tile.extents.y2 > region.extents.y2)
-			tile.extents.y2 = region.extents.y2;
+		int y2 = tile.extents.y1 + step;
+		if (y2 > region.extents.y2)
+			y2 = region.extents.y2;
+		tile.extents.y2 = y2;
 
 		for (tile.extents.x1 = tile.extents.x2 = region.extents.x1;
 		     tile.extents.x2 < region.extents.x2;
 		     tile.extents.x1 = tile.extents.x2) {
 			int w, h;
-
-			tile.extents.x2 = tile.extents.x1 + step;
-			if (tile.extents.x2 > region.extents.x2)
-				tile.extents.x2 = region.extents.x2;
+			int x2 = tile.extents.x1 + step;
+			if (x2 > region.extents.x2)
+				x2 = region.extents.x2;
+			tile.extents.x2 = x2;
 
 			tile.data = NULL;
 
@@ -851,16 +853,17 @@ sna_tiling_copy_boxes(struct sna *sna, uint8_t alu,
 	p.devPrivate.ptr = NULL;
 
 	for (tile.y1 = extents.y1; tile.y1 < extents.y2; tile.y1 = tile.y2) {
-		tile.y2 = tile.y1 + step;
-		if (tile.y2 > extents.y2)
-			tile.y2 = extents.y2;
+		int y2 = tile.y1 + step;
+		if (y2 > extents.y2)
+			y2 = extents.y2;
+		tile.y2 = y2;
 
 		for (tile.x1 = extents.x1; tile.x1 < extents.x2; tile.x1 = tile.x2) {
 			struct kgem_bo *tmp_bo;
-
-			tile.x2 = tile.x1 + step;
-			if (tile.x2 > extents.x2)
-				tile.x2 = extents.x2;
+			int x2 = tile.x1 + step;
+			if (x2 > extents.x2)
+				x2 = extents.x2;
+			tile.x2 = x2;
 
 			c = clipped;
 			for (i = 0; i < n; i++) {
commit 835ceccb27afa18704c34dc3283476340f999317
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Jul 12 23:20:56 2013 +0100

    sna/gen5: Add some more DBG
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index b31ac1e..2b75ff6 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2247,6 +2247,13 @@ gen5_render_copy_boxes(struct sna *sna, uint8_t alu,
 {
 	struct sna_composite_op tmp;
 
+	DBG(("%s alu=%d, src=%d:handle=%d, dst=%d:handle=%d boxes=%d x [((%d, %d), (%d, %d))...], flags=%x\n",
+	     __FUNCTION__, alu,
+	     src->drawable.serialNumber, src_bo->handle,
+	     dst->drawable.serialNumber, dst_bo->handle,
+	     n, box->x1, box->y1, box->x2, box->y2,
+	     flags));
+
 	if (sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
 	    sna_blt_copy_boxes(sna, alu,
 			       src_bo, src_dx, src_dy,
@@ -2359,8 +2366,10 @@ fallback_blt:
 
 	if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) {
 		kgem_submit(&sna->kgem);
-		if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL))
+		if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) {
+			DBG(("%s: aperture check failed\n", __FUNCTION__));
 			goto fallback_tiled_src;
+		}
 	}
 
 	dst_dx += tmp.dst.x;
@@ -2420,6 +2429,7 @@ fallback_tiled:
 			       box, n))
 		return true;
 
+	DBG(("%s: tiled fallback\n", __FUNCTION__));
 	return sna_tiling_copy_boxes(sna, alu,
 				     src, src_bo, src_dx, src_dy,
 				     dst, dst_bo, dst_dx, dst_dy,
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index ec3278b..1df23de 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -2667,7 +2667,7 @@ bool sna_blt_fill_boxes(struct sna *sna, uint8_t alu,
 	     __FUNCTION__, bpp, pixel, alu, nbox));
 
 	if (!kgem_bo_can_blt(kgem, bo)) {
-		DBG(("%s: fallback -- dst uses Y-tiling\n", __FUNCTION__));
+		DBG(("%s: fallback -- cannot blt to dst\n", __FUNCTION__));
 		return false;
 	}
 


More information about the xorg-commit mailing list