summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@redhat.com>2010-03-28 23:02:43 -0400
committerSøren Sandmann Pedersen <ssp@redhat.com>2010-03-28 23:03:31 -0400
commit7df9dfc5b3033032c288e809355b40ac2f139f70 (patch)
treeed315ef2141c20d67ce8787f445578ed7bdb145c
parentefd41c62875d97c5127233cb6a4c353b4d495531 (diff)
Add support for 8bpp to pixman_fill_sse2()fill8
-rw-r--r--pixman/pixman-sse2.c38
1 files changed, 33 insertions, 5 deletions
diff --git a/pixman/pixman-sse2.c b/pixman/pixman-sse2.c
index 946e7ba3..dce6bf2e 100644
--- a/pixman/pixman-sse2.c
+++ b/pixman/pixman-sse2.c
@@ -3981,24 +3981,39 @@ pixman_fill_sse2 (uint32_t *bits,
__m128i xmm_def;
- if (bpp != 16 && bpp != 32)
- return FALSE;
+ if (bpp == 8)
+ {
+ uint8_t b, w;
+
+ stride = stride * (int) sizeof (uint32_t) / 1;
+ byte_line = (uint8_t *)(((uint8_t *)bits) + stride * y + x);
+ byte_width = width;
+ stride *= 1;
- if (bpp == 16)
+ b = data & 0xff;
+ w = (b << 8) | b;
+ data = (w << 16) | w;
+ }
+ else if (bpp == 16)
{
stride = stride * (int) sizeof (uint32_t) / 2;
byte_line = (uint8_t *)(((uint16_t *)bits) + stride * y + x);
byte_width = 2 * width;
stride *= 2;
+
data = (data & 0xffff) * 0x00010001;
}
- else
+ else if (bpp == 32)
{
stride = stride * (int) sizeof (uint32_t) / 4;
byte_line = (uint8_t *)(((uint32_t *)bits) + stride * y + x);
byte_width = 4 * width;
stride *= 4;
}
+ else
+ {
+ return FALSE;
+ }
cache_prefetch ((__m128i*)byte_line);
xmm_def = create_mask_2x32_128 (data, data);
@@ -4010,9 +4025,15 @@ pixman_fill_sse2 (uint32_t *bits,
byte_line += stride;
w = byte_width;
-
cache_prefetch_next ((__m128i*)d);
+ while (w >= 1 && ((unsigned long)d & 1))
+ {
+ *(uint8_t *)d = data;
+ w -= 1;
+ d += 1;
+ }
+
while (w >= 2 && ((unsigned long)d & 3))
{
*(uint16_t *)d = data;
@@ -4095,6 +4116,13 @@ pixman_fill_sse2 (uint32_t *bits,
w -= 2;
d += 2;
}
+
+ if (w >= 1)
+ {
+ *(uint8_t *)d = data;
+ w -= 1;
+ d += 1;
+ }
}
_mm_empty ();