xf86-video-intel: src/sna/sna_accel.c src/sna/sna_blt.c src/sna/sna.h

Chris Wilson ickle at kemper.freedesktop.org
Mon Oct 31 03:05:22 PDT 2011


 src/sna/sna.h       |    1 +
 src/sna/sna_accel.c |   11 ++++++-----
 src/sna/sna_blt.c   |   16 ++++++++++------
 3 files changed, 17 insertions(+), 11 deletions(-)

New commits:
commit 088728ad26c7efc2d65b97ff22d526c65a0fa442
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Oct 31 10:04:35 2011 +0000

    sna/blt: Don't idiotically override alu for pixel==0 and track alu
    
    Another classic and utterly stupid mistake. At least I was consistent in
    my error.
    
    Reported-by: Clemens Eisserer <linuxhippy at gmail.com>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=42414
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index 4ed3fb8..f045fa5 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -252,6 +252,7 @@ struct sna {
 	struct {
 		uint32_t fill_bo;
 		uint32_t fill_pixel;
+		uint32_t fill_alu;
 	} blt_state;
 	union {
 		struct gen2_render_state gen2;
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index f6095b5..4cbd194 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -3439,7 +3439,8 @@ sna_poly_segment_blt(DrawablePtr drawable,
 	struct sna_fill_op fill;
 	int16_t dx, dy;
 
-	DBG(("%s: alu=%d, fg=%08lx\n", __FUNCTION__, gc->alu, gc->fgPixel));
+	DBG(("%s: n=%d, alu=%d, fg=%08lx, clipped=%d\n",
+	     __FUNCTION__, n, gc->alu, gc->fgPixel, clipped));
 
 	if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, gc->fgPixel))
 		return FALSE;
@@ -3456,7 +3457,7 @@ sna_poly_segment_blt(DrawablePtr drawable,
 					nbox = ARRAY_SIZE(boxes);
 				n -= nbox;
 				do {
-					if (seg->x1 < seg->x2) {
+					if (seg->x1 <= seg->x2) {
 						b->x1 = seg->x1;
 						b->x2 = seg->x2;
 					} else {
@@ -3465,7 +3466,7 @@ sna_poly_segment_blt(DrawablePtr drawable,
 					}
 					b->x2++;
 
-					if (seg->y1 < seg->y2) {
+					if (seg->y1 <= seg->y2) {
 						b->y1 = seg->y1;
 						b->y2 = seg->y2;
 					} else {
@@ -3502,7 +3503,7 @@ sna_poly_segment_blt(DrawablePtr drawable,
 					nbox = ARRAY_SIZE(boxes);
 				n -= nbox;
 				do {
-					if (seg->x1 < seg->x2) {
+					if (seg->x1 <= seg->x2) {
 						b->x1 = seg->x1;
 						b->x2 = seg->x2;
 					} else {
@@ -3511,7 +3512,7 @@ sna_poly_segment_blt(DrawablePtr drawable,
 					}
 					b->x2++;
 
-					if (seg->y1 < seg->y2) {
+					if (seg->y1 <= seg->y2) {
 						b->y1 = seg->y1;
 						b->y2 = seg->y2;
 					} else {
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 1630b35..2ae4ac0 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -140,8 +140,8 @@ static bool sna_blt_fill_init(struct sna *sna,
 	if (pitch > MAXSHORT)
 		return FALSE;
 
-	if (pixel == 0)
-		alu = GXclear;
+	if (alu == GXclear)
+		pixel = 0;
 
 	blt->br13 = 1<<31 | (fill_ROP[alu] << 16) | pitch;
 	switch (bpp) {
@@ -162,7 +162,8 @@ static bool sna_blt_fill_init(struct sna *sna,
 	}
 
 	if (sna->blt_state.fill_bo != bo->handle ||
-	    sna->blt_state.fill_pixel != pixel)
+	    sna->blt_state.fill_pixel != pixel ||
+	    sna->blt_state.fill_alu != alu)
 	{
 		uint32_t *b;
 
@@ -191,6 +192,7 @@ static bool sna_blt_fill_init(struct sna *sna,
 
 		sna->blt_state.fill_bo = bo->handle;
 		sna->blt_state.fill_pixel = pixel;
+		sna->blt_state.fill_alu = alu;
 	}
 
 	return TRUE;
@@ -1608,8 +1610,8 @@ Bool sna_blt_fill_boxes(struct sna *sna, uint8_t alu,
 	if (br13 > MAXSHORT)
 		return FALSE;
 
-	if (pixel == 0)
-		alu = GXclear;
+	if (alu == GXclear)
+		pixel = 0;
 
 	br13 |= 1<<31 | fill_ROP[alu] << 16;
 	switch (bpp) {
@@ -1627,7 +1629,8 @@ Bool sna_blt_fill_boxes(struct sna *sna, uint8_t alu,
 	}
 
 	if (sna->blt_state.fill_bo != bo->handle ||
-	    sna->blt_state.fill_pixel != pixel)
+	    sna->blt_state.fill_pixel != pixel ||
+	    sna->blt_state.fill_alu != alu)
 	{
 		uint32_t *b;
 
@@ -1656,6 +1659,7 @@ Bool sna_blt_fill_boxes(struct sna *sna, uint8_t alu,
 
 		sna->blt_state.fill_bo = bo->handle;
 		sna->blt_state.fill_pixel = pixel;
+		sna->blt_state.fill_alu = alu;
 	}
 
 	do {


More information about the xorg-commit mailing list