xf86-video-intel: src/sna/gen3_render.c src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/gen7_render.c

Chris Wilson ickle at kemper.freedesktop.org
Sat Oct 29 10:59:22 PDT 2011


 src/sna/gen3_render.c |   26 +++++++++++++-------------
 src/sna/gen4_render.c |   30 ++++++++++++++++--------------
 src/sna/gen5_render.c |   30 ++++++++++++++++--------------
 src/sna/gen6_render.c |   21 +++++++++++++--------
 src/sna/gen7_render.c |   30 ++++++++++++++++--------------
 5 files changed, 74 insertions(+), 63 deletions(-)

New commits:
commit 4835fe5b2e19ac456773565399f334845f7442c0
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Oct 29 18:56:29 2011 +0100

    sna/genX: Improve reduction of Render operator to BLT alu
    
    This appeared to introduce a visual gitch into the xfce4 selection box
    on gen6 at least.
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=42367
    Reported-by: Paul Neumann <paul104x at yahoo.de>
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 118b906..a581c8a 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -3634,14 +3634,6 @@ gen3_render_fill_boxes_try_blt(struct sna *sna,
 	if (dst_bo->tiling == I915_TILING_Y)
 		return FALSE;
 
-	if (!sna_get_pixel_from_rgba(&pixel,
-				     color->red,
-				     color->green,
-				     color->blue,
-				     color->alpha,
-				     format))
-		return FALSE;
-
 	if (color->alpha >= 0xff00) {
 		if (op == PictOpOver)
 			op = PictOpSrc;
@@ -3652,15 +3644,23 @@ gen3_render_fill_boxes_try_blt(struct sna *sna,
 			op = PictOpSrc;
 	}
 
+	pixel = 0;
 	if (op == PictOpClear) {
 		alu = GXclear;
-		pixel = 0;
-		op = PictOpSrc;
-	}
-
-	if (op != PictOpSrc)
+	} else if (op == PictOpSrc) {
+		if (color->alpha <= 0x00ff)
+			alu = GXclear;
+		else if (!sna_get_pixel_from_rgba(&pixel,
+						    color->red,
+						    color->green,
+						    color->blue,
+						    color->alpha,
+						    format))
+			return FALSE;
+	} else
 		return FALSE;
 
+
 	return sna_blt_fill_boxes(sna, alu,
 				  dst_bo, dst->drawable.bitsPerPixel,
 				  pixel, box, n);
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 425967b..18171c4 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2416,24 +2416,26 @@ gen4_render_fill_boxes(struct sna *sna,
 	    dst->drawable.width > 8192 ||
 	    dst->drawable.height > 8192 ||
 	    !gen4_check_dst_format(format)) {
-		uint8_t alu = GXcopy;
+		uint8_t alu = -1;
 
-		if (op == PictOpClear) {
+		if (op == PictOpClear || (op == PictOpOutReverse && color->alpha >= 0xff00))
 			alu = GXclear;
-			pixel = 0;
-			op = PictOpSrc;
-		}
 
-		if (op == PictOpOver && color->alpha >= 0xff00)
-			op = PictOpSrc;
+		if (op == PictOpSrc || (op == PictOpOver && color->alpha >= 0xff00)) {
+			alu = GXcopy;
+			if (color->alpha <= 0x00ff)
+				alu = GXclear;
+		}
 
-		if (op == PictOpSrc &&
-		    sna_get_pixel_from_rgba(&pixel,
-					    color->red,
-					    color->green,
-					    color->blue,
-					    color->alpha,
-					    format) &&
+		pixel = 0;
+		if ((alu == GXclear ||
+		     (alu == GXcopy &&
+		      sna_get_pixel_from_rgba(&pixel,
+					      color->red,
+					      color->green,
+					      color->blue,
+					      color->alpha,
+					      format))) &&
 		    sna_blt_fill_boxes(sna, alu,
 				       dst_bo, dst->drawable.bitsPerPixel,
 				       pixel, box, n))
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 6d4fbd9..b9512c7 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2389,24 +2389,26 @@ gen5_render_fill_boxes(struct sna *sna,
 	    dst->drawable.width > 8192 ||
 	    dst->drawable.height > 8192 ||
 	    !gen5_check_dst_format(format)) {
-		uint8_t alu = GXcopy;
-		uint8_t _op = op;
+		uint8_t alu = -1;
 
-		if (_op == PictOpClear) {
+		if (op == PictOpClear || (op == PictOpOutReverse && color->alpha >= 0xff00))
 			alu = GXclear;
-			_op = PictOpSrc;
-		}
 
-		if (_op == PictOpOver && color->alpha >= 0xff00)
-			_op = PictOpSrc;
+		if (op == PictOpSrc || (op == PictOpOver && color->alpha >= 0xff00)) {
+			alu = GXcopy;
+			if (color->alpha <= 0x00ff)
+				alu = GXclear;
+		}
 
-		if (_op == PictOpSrc &&
-		    sna_get_pixel_from_rgba(&pixel,
-					    color->red,
-					    color->green,
-					    color->blue,
-					    color->alpha,
-					    format) &&
+		pixel = 0;
+		if ((alu == GXclear ||
+		     (alu == GXcopy &&
+		      sna_get_pixel_from_rgba(&pixel,
+					      color->red,
+					      color->green,
+					      color->blue,
+					      color->alpha,
+					      format))) &&
 		    sna_blt_fill_boxes(sna, alu,
 				       dst_bo, dst->drawable.bitsPerPixel,
 				       pixel, box, n))
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 1abb54f..1fc971f 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2598,16 +2598,21 @@ gen6_render_fill_boxes(struct sna *sna,
 		if (op == PictOpClear || (op == PictOpOutReverse && color->alpha >= 0xff00))
 			alu = GXclear;
 
-		if (op == PictOpSrc || (op == PictOpOver && color->alpha >= 0xff00))
+		if (op == PictOpSrc || (op == PictOpOver && color->alpha >= 0xff00)) {
 			alu = GXcopy;
+			if (color->alpha <= 0x00ff)
+				alu = GXclear;
+		}
 
-		if (alu != -1 &&
-		    sna_get_pixel_from_rgba(&pixel,
-					    color->red,
-					    color->green,
-					    color->blue,
-					    color->alpha,
-					    format) &&
+		pixel = 0;
+		if ((alu == GXclear ||
+		     (alu == GXcopy &&
+		      sna_get_pixel_from_rgba(&pixel,
+					      color->red,
+					      color->green,
+					      color->blue,
+					      color->alpha,
+					      format))) &&
 		    sna_blt_fill_boxes(sna, alu,
 				       dst_bo, dst->drawable.bitsPerPixel,
 				       pixel, box, n))
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 7eb323f..ecdab6e 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2741,24 +2741,26 @@ gen7_render_fill_boxes(struct sna *sna,
 	    dst->drawable.width > GEN7_MAX_SIZE ||
 	    dst->drawable.height > GEN7_MAX_SIZE ||
 	    !gen7_check_dst_format(format)) {
-		uint8_t alu = GXcopy;
+		uint8_t alu = -1;
 
-		if (op == PictOpClear) {
+		if (op == PictOpClear || (op == PictOpOutReverse && color->alpha >= 0xff00))
 			alu = GXclear;
-			pixel = 0;
-			op = PictOpSrc;
-		}
 
-		if (op == PictOpOver && color->alpha >= 0xff00)
-			op = PictOpSrc;
+		if (op == PictOpSrc || (op == PictOpOver && color->alpha >= 0xff00)) {
+			alu = GXcopy;
+			if (color->alpha <= 0x00ff)
+				alu = GXclear;
+		}
 
-		if (op == PictOpSrc &&
-		    sna_get_pixel_from_rgba(&pixel,
-					    color->red,
-					    color->green,
-					    color->blue,
-					    color->alpha,
-					    format) &&
+		pixel = 0;
+		if ((alu == GXclear ||
+		     (alu == GXcopy &&
+		      sna_get_pixel_from_rgba(&pixel,
+					      color->red,
+					      color->green,
+					      color->blue,
+					      color->alpha,
+					      format))) &&
 		    sna_blt_fill_boxes(sna, alu,
 				       dst_bo, dst->drawable.bitsPerPixel,
 				       pixel, box, n))


More information about the xorg-commit mailing list