Make use of SSE2 blt/fill in more places
authorSøren Sandmann Pedersen <sandmann@daimi.au.dk>
Sun, 21 Sep 2008 15:00:33 +0000 (11:00 -0400)
committerSøren Sandmann Pedersen <sandmann@daimi.au.dk>
Sun, 21 Sep 2008 15:00:33 +0000 (11:00 -0400)
pixman/pixman-access.c
pixman/pixman-pict.c
pixman/pixman-utils.c

index d01f8bd..b47ba16 100644 (file)
@@ -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.
index f9b574e..070b190 100644 (file)
@@ -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 },
index 21d9a2f..22f522b 100644 (file)
@@ -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;