diff options
Diffstat (limited to 'pixman/pixman/pixman-sse2.c')
-rw-r--r-- | pixman/pixman/pixman-sse2.c | 146 |
1 files changed, 49 insertions, 97 deletions
diff --git a/pixman/pixman/pixman-sse2.c b/pixman/pixman/pixman-sse2.c index 665eeadbe..e273a951e 100644 --- a/pixman/pixman/pixman-sse2.c +++ b/pixman/pixman/pixman-sse2.c @@ -3309,18 +3309,22 @@ sse2_composite_over_n_8_8888 (pixman_implementation_t *imp, } +#if defined(__GNUC__) && !defined(__x86_64__) && !defined(__amd64__) +__attribute__((__force_align_arg_pointer__)) +#endif static pixman_bool_t -pixman_fill_sse2 (uint32_t *bits, - int stride, - int bpp, - int x, - int y, - int width, - int height, - uint32_t data) +sse2_fill (pixman_implementation_t *imp, + uint32_t * bits, + int stride, + int bpp, + int x, + int y, + int width, + int height, + uint32_t xor) { uint32_t byte_width; - uint8_t *byte_line; + uint8_t *byte_line; __m128i xmm_def; @@ -3334,9 +3338,9 @@ pixman_fill_sse2 (uint32_t *bits, byte_width = width; stride *= 1; - b = data & 0xff; + b = xor & 0xff; w = (b << 8) | b; - data = (w << 16) | w; + xor = (w << 16) | w; } else if (bpp == 16) { @@ -3345,7 +3349,7 @@ pixman_fill_sse2 (uint32_t *bits, byte_width = 2 * width; stride *= 2; - data = (data & 0xffff) * 0x00010001; + xor = (xor & 0xffff) * 0x00010001; } else if (bpp == 32) { @@ -3359,7 +3363,7 @@ pixman_fill_sse2 (uint32_t *bits, return FALSE; } - xmm_def = create_mask_2x32_128 (data, data); + xmm_def = create_mask_2x32_128 (xor, xor); while (height--) { @@ -3370,21 +3374,21 @@ pixman_fill_sse2 (uint32_t *bits, if (w >= 1 && ((unsigned long)d & 1)) { - *(uint8_t *)d = data; + *(uint8_t *)d = xor; w -= 1; d += 1; } while (w >= 2 && ((unsigned long)d & 3)) { - *(uint16_t *)d = data; + *(uint16_t *)d = xor; w -= 2; d += 2; } while (w >= 4 && ((unsigned long)d & 15)) { - *(uint32_t *)d = data; + *(uint32_t *)d = xor; w -= 4; d += 4; @@ -3435,7 +3439,7 @@ pixman_fill_sse2 (uint32_t *bits, while (w >= 4) { - *(uint32_t *)d = data; + *(uint32_t *)d = xor; w -= 4; d += 4; @@ -3443,14 +3447,14 @@ pixman_fill_sse2 (uint32_t *bits, if (w >= 2) { - *(uint16_t *)d = data; + *(uint16_t *)d = xor; w -= 2; d += 2; } if (w >= 1) { - *(uint8_t *)d = data; + *(uint8_t *)d = xor; w -= 1; d += 1; } @@ -3479,9 +3483,9 @@ sse2_composite_src_n_8_8888 (pixman_implementation_t *imp, srca = src >> 24; if (src == 0) { - pixman_fill_sse2 (dest_image->bits.bits, dest_image->bits.rowstride, - PIXMAN_FORMAT_BPP (dest_image->bits.format), - dest_x, dest_y, width, height, 0); + sse2_fill (imp, dest_image->bits.bits, dest_image->bits.rowstride, + PIXMAN_FORMAT_BPP (dest_image->bits.format), + dest_x, dest_y, width, height, 0); return; } @@ -4523,18 +4527,19 @@ sse2_composite_add_8888_8888 (pixman_implementation_t *imp, } static pixman_bool_t -pixman_blt_sse2 (uint32_t *src_bits, - uint32_t *dst_bits, - int src_stride, - int dst_stride, - int src_bpp, - int dst_bpp, - int src_x, - int src_y, - int dest_x, - int dest_y, - int width, - int height) +sse2_blt (pixman_implementation_t *imp, + uint32_t * src_bits, + uint32_t * dst_bits, + int src_stride, + int dst_stride, + int src_bpp, + int dst_bpp, + int src_x, + int src_y, + int dest_x, + int dest_y, + int width, + int height) { uint8_t * src_bytes; uint8_t * dst_bytes; @@ -4640,7 +4645,6 @@ pixman_blt_sse2 (uint32_t *src_bits, } } - return TRUE; } @@ -4649,13 +4653,13 @@ sse2_composite_copy_area (pixman_implementation_t *imp, pixman_composite_info_t *info) { PIXMAN_COMPOSITE_ARGS (info); - pixman_blt_sse2 (src_image->bits.bits, - dest_image->bits.bits, - src_image->bits.rowstride, - dest_image->bits.rowstride, - PIXMAN_FORMAT_BPP (src_image->bits.format), - PIXMAN_FORMAT_BPP (dest_image->bits.format), - src_x, src_y, dest_x, dest_y, width, height); + sse2_blt (imp, src_image->bits.bits, + dest_image->bits.bits, + src_image->bits.rowstride, + dest_image->bits.rowstride, + PIXMAN_FORMAT_BPP (src_image->bits.format), + PIXMAN_FORMAT_BPP (dest_image->bits.format), + src_x, src_y, dest_x, dest_y, width, height); } static void @@ -5878,58 +5882,6 @@ static const pixman_fast_path_t sse2_fast_paths[] = { PIXMAN_OP_NONE }, }; -static pixman_bool_t -sse2_blt (pixman_implementation_t *imp, - uint32_t * src_bits, - uint32_t * dst_bits, - int src_stride, - int dst_stride, - int src_bpp, - int dst_bpp, - int src_x, - int src_y, - int dest_x, - int dest_y, - int width, - int height) -{ - if (!pixman_blt_sse2 ( - src_bits, dst_bits, src_stride, dst_stride, src_bpp, dst_bpp, - src_x, src_y, dest_x, dest_y, width, height)) - - { - return _pixman_implementation_blt ( - imp->delegate, - src_bits, dst_bits, src_stride, dst_stride, src_bpp, dst_bpp, - src_x, src_y, dest_x, dest_y, width, height); - } - - return TRUE; -} - -#if defined(__GNUC__) && !defined(__x86_64__) && !defined(__amd64__) -__attribute__((__force_align_arg_pointer__)) -#endif -static pixman_bool_t -sse2_fill (pixman_implementation_t *imp, - uint32_t * bits, - int stride, - int bpp, - int x, - int y, - int width, - int height, - uint32_t xor) -{ - if (!pixman_fill_sse2 (bits, stride, bpp, x, y, width, height, xor)) - { - return _pixman_implementation_fill ( - imp->delegate, bits, stride, bpp, x, y, width, height, xor); - } - - return TRUE; -} - static uint32_t * sse2_fetch_x8r8g8b8 (pixman_iter_t *iter, const uint32_t *mask) { @@ -6072,7 +6024,7 @@ static const fetcher_info_t fetchers[] = { PIXMAN_null } }; -static void +static pixman_bool_t sse2_src_iter_init (pixman_implementation_t *imp, pixman_iter_t *iter) { pixman_image_t *image = iter->image; @@ -6097,12 +6049,12 @@ sse2_src_iter_init (pixman_implementation_t *imp, pixman_iter_t *iter) iter->stride = s; iter->get_scanline = f->get_scanline; - return; + return TRUE; } } } - imp->delegate->src_iter_init (imp->delegate, iter); + return FALSE; } #if defined(__GNUC__) && !defined(__x86_64__) && !defined(__amd64__) |