From 9cb60e142bad01fd54cb7e6f3fa2504ddc87a7da Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=B8ren=20Sandmann=20Pedersen?= Date: Sun, 21 Sep 2008 11:00:33 -0400 Subject: [PATCH] Make use of SSE2 blt/fill in more places --- pixman/pixman-access.c | 2 +- pixman/pixman-pict.c | 4 +++- pixman/pixman-utils.c | 52 ++++++++++++++++++++++++++++++++------------------ 3 files changed, 37 insertions(+), 21 deletions(-) diff --git a/pixman/pixman-access.c b/pixman/pixman-access.c index d01f8bd..b47ba16 100644 --- a/pixman/pixman-access.c +++ b/pixman/pixman-access.c @@ -51,7 +51,7 @@ int offset1 = stride < 0 ? \ offset0 + ((-stride) >> 1) * ((pict->height) >> 1) : \ offset0 + (offset0 >> 2) -/* Note n trailing semicolon on the above macro; if it's there, then +/* Note no trailing semicolon on the above macro; if it's there, then * the typical usage of YV12_SETUP(pict); will have an extra trailing ; * that some compilers will interpret as a statement -- and then any further * variable declarations will cause an error. diff --git a/pixman/pixman-pict.c b/pixman/pixman-pict.c index f9b574e..070b190 100644 --- a/pixman/pixman-pict.c +++ b/pixman/pixman-pict.c @@ -1428,7 +1428,7 @@ static const FastPathInfo mmx_fast_paths[] = { PIXMAN_OP_SRC, PIXMAN_x8r8g8b8, PIXMAN_null, PIXMAN_x8r8g8b8, fbCompositeCopyAreammx, 0 }, { PIXMAN_OP_SRC, PIXMAN_x8b8g8r8, PIXMAN_null, PIXMAN_x8b8g8r8, fbCompositeCopyAreammx, 0 }, { PIXMAN_OP_SRC, PIXMAN_r5g6b5, PIXMAN_null, PIXMAN_r5g6b5, fbCompositeCopyAreammx, 0 }, - { PIXMAN_OP_SRC, PIXMAN_b5g6r5, PIXMAN_null, PIXMAN_b5g6r5, fbCompositeCopyAreammx, 0 }, + { PIXMAN_OP_SRC, PIXMAN_b5g6r5, PIXMAN_null, PIXMAN_b5g6r5, fbCompositeCopyAreammx, 0 }, { PIXMAN_OP_IN, PIXMAN_a8, PIXMAN_null, PIXMAN_a8, fbCompositeIn_8x8mmx, 0 }, { PIXMAN_OP_IN, PIXMAN_solid, PIXMAN_a8, PIXMAN_a8, fbCompositeIn_nx8x8mmx, 0 }, { PIXMAN_OP_NONE }, @@ -1501,6 +1501,8 @@ static const FastPathInfo sse2_fast_paths[] = { PIXMAN_OP_SRC, PIXMAN_a8r8g8b8, PIXMAN_null, PIXMAN_a8r8g8b8, fbCompositeCopyAreasse2, 0 }, { PIXMAN_OP_SRC, PIXMAN_a8b8g8r8, PIXMAN_null, PIXMAN_a8b8g8r8, fbCompositeCopyAreasse2, 0 }, + { PIXMAN_OP_SRC, PIXMAN_a8r8g8b8, PIXMAN_null, PIXMAN_x8r8g8b8, fbCompositeCopyAreasse2, 0 }, + { PIXMAN_OP_SRC, PIXMAN_a8b8g8r8, PIXMAN_null, PIXMAN_x8b8g8r8, fbCompositeCopyAreasse2, 0 }, { PIXMAN_OP_SRC, PIXMAN_x8r8g8b8, PIXMAN_null, PIXMAN_x8r8g8b8, fbCompositeCopyAreasse2, 0 }, { PIXMAN_OP_SRC, PIXMAN_x8b8g8r8, PIXMAN_null, PIXMAN_x8b8g8r8, fbCompositeCopyAreasse2, 0 }, { PIXMAN_OP_SRC, PIXMAN_r5g6b5, PIXMAN_null, PIXMAN_r5g6b5, fbCompositeCopyAreasse2, 0 }, diff --git a/pixman/pixman-utils.c b/pixman/pixman-utils.c index 21d9a2f..22f522b 100644 --- a/pixman/pixman-utils.c +++ b/pixman/pixman-utils.c @@ -29,6 +29,7 @@ #include "pixman-private.h" #include "pixman-mmx.h" +#include "pixman-sse2.h" PIXMAN_EXPORT pixman_bool_t pixman_transform_point_3d (pixman_transform_t *transform, @@ -73,6 +74,14 @@ pixman_blt (uint32_t *src_bits, int dst_x, int dst_y, int width, int height) { +#ifdef USE_SSE2 + if (pixman_have_sse2()) + { + return pixmanBltsse2 (src_bits, dst_bits, src_stride, dst_stride, src_bpp, dst_bpp, + src_x, src_y, dst_x, dst_y, width, height); + } + else +#endif #ifdef USE_MMX if (pixman_have_mmx()) { @@ -171,28 +180,33 @@ pixman_fill (uint32_t *bits, x, y, width, height, stride, bpp, xor); #endif +#ifdef USE_SSE2 + if (pixman_have_sse2() && pixmanFillsse2 (bits, stride, bpp, x, y, width, height, xor)) + return TRUE; +#endif + #ifdef USE_MMX - if (!pixman_have_mmx() || !pixman_fill_mmx (bits, stride, bpp, x, y, width, height, xor)) + if (pixman_have_mmx() && pixman_fill_mmx (bits, stride, bpp, x, y, width, height, xor)) + return TRUE; #endif + + switch (bpp) { - switch (bpp) - { - case 8: - pixman_fill8 (bits, stride, x, y, width, height, xor); - break; - - case 16: - pixman_fill16 (bits, stride, x, y, width, height, xor); - break; - - case 32: - pixman_fill32 (bits, stride, x, y, width, height, xor); - break; - - default: - return FALSE; - break; - } + case 8: + pixman_fill8 (bits, stride, x, y, width, height, xor); + break; + + case 16: + pixman_fill16 (bits, stride, x, y, width, height, xor); + break; + + case 32: + pixman_fill32 (bits, stride, x, y, width, height, xor); + break; + + default: + return FALSE; + break; } return TRUE; -- 2.7.4