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