xf86-video-intel: 2 commits - src/sna/sna_trapezoids.c

Chris Wilson ickle at kemper.freedesktop.org
Sat Mar 17 02:26:21 PDT 2012


 src/sna/sna_trapezoids.c |   74 +++++++++++++++++++++++++++++++----------------
 1 file changed, 50 insertions(+), 24 deletions(-)

New commits:
commit e31d9dacafe060dc86de801114b475fdd0142eb6
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Mar 17 09:21:00 2012 +0000

    sna/traps: Align indices for unrolled memset in row_inplace()
    
    The compiler presumes that the uint64_t write is naturally aligned and
    so may emit code that crashes with an unaligned moved. To workaround
    this, make sure the write is so aligned.
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=47418
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index 31a661e..3a93450 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -1499,6 +1499,21 @@ inplace_row(struct active_list *active, uint8_t *row, int width)
 				else
 					memset(row+lix, 0xff, rix);
 #else
+				if (lix & 1 && rix) {
+					row[lix] = 0xff;
+					lix++;
+					rix--;
+				}
+				if (lix & 2 && rix >= 2) {
+					*(uint16_t *)(row+lix) = 0xffff;
+					lix += 2;
+					rix -= 2;
+				}
+				if (lix & 4 && rix >= 4) {
+					*(uint32_t *)(row+lix) = 0xffffffff;
+					lix += 4;
+					rix -= 4;
+				}
 				while (rix >= 8) {
 					*(uint64_t *)(row+lix) = 0xffffffffffffffff;
 					lix += 8;
commit 2b4e11923d9f683f43acf8053bcec1701df25c1f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Mar 17 00:05:47 2012 +0000

    sna/traps: Tune inplace_end_subrows()
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index 52be00b..31a661e 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -1617,51 +1617,62 @@ inplace_end_subrows(struct active_list *active, uint8_t *row,
 {
 	int cover = 0;
 
-	while (width > 4) {
+	while (width >= 4) {
 		uint32_t dw;
 		int v;
 
 		dw = *(uint32_t *)buf;
 		buf += 4;
 
-		if (dw == 0){
+		if (dw == 0) {
 			v = cover * 256 / (FAST_SAMPLES_X * FAST_SAMPLES_Y);
 			v -= v >> 8;
 			v |= v << 8;
 			dw = v | v << 16;
-		} else if (dw) {
+		} else {
 			cover += (int8_t)(dw & 0xff);
-			assert(cover >= 0);
-			v = cover * 256 / (FAST_SAMPLES_X * FAST_SAMPLES_Y);
-			v -= v >> 8;
-			dw >>= 8;
-			dw |= v << 24;
+			if (cover) {
+				assert(cover > 0);
+				v = cover * 256 / (FAST_SAMPLES_X * FAST_SAMPLES_Y);
+				v -= v >> 8;
+				dw >>= 8;
+				dw |= v << 24;
+			} else
+				dw >>= 8;
 
 			cover += (int8_t)(dw & 0xff);
-			assert(cover >= 0);
-			v = cover * 256 / (FAST_SAMPLES_X * FAST_SAMPLES_Y);
-			v -= v >> 8;
-			dw >>= 8;
-			dw |= v << 24;
+			if (cover) {
+				assert(cover > 0);
+				v = cover * 256 / (FAST_SAMPLES_X * FAST_SAMPLES_Y);
+				v -= v >> 8;
+				dw >>= 8;
+				dw |= v << 24;
+			} else
+				dw >>= 8;
 
 			cover += (int8_t)(dw & 0xff);
-			assert(cover >= 0);
-			v = cover * 256 / (FAST_SAMPLES_X * FAST_SAMPLES_Y);
-			v -= v >> 8;
-			dw >>= 8;
-			dw |= v << 24;
+			if (cover) {
+				assert(cover > 0);
+				v = cover * 256 / (FAST_SAMPLES_X * FAST_SAMPLES_Y);
+				v -= v >> 8;
+				dw >>= 8;
+				dw |= v << 24;
+			} else
+				dw >>= 8;
 
 			cover += (int8_t)(dw & 0xff);
-			assert(cover >= 0);
-			v = cover * 256 / (FAST_SAMPLES_X * FAST_SAMPLES_Y);
-			v -= v >> 8;
-			dw >>= 8;
-			dw |= v << 24;
+			if (cover) {
+				assert(cover > 0);
+				v = cover * 256 / (FAST_SAMPLES_X * FAST_SAMPLES_Y);
+				v -= v >> 8;
+				dw >>= 8;
+				dw |= v << 24;
+			} else
+				dw >>= 8;
 		}
 
 		*(uint32_t *)row = dw;
 		row += 4;
-
 		width -= 4;
 	}
 


More information about the xorg-commit mailing list