Compute src, mask, dest flags and base fast path decisions on them.
authorSøren Sandmann Pedersen <sandmann@redhat.com>
Sun, 13 Sep 2009 07:43:16 +0000 (03:43 -0400)
committerSøren Sandmann Pedersen <ssp@redhat.com>
Thu, 28 Jan 2010 16:52:56 +0000 (11:52 -0500)
This makes sets the stage for caching the information by image instead
of computing it on each composite invocation.

This patch also computes format codes for images such as PIXMAN_solid,
so that we can no longer end up in the situation that a fast path is
selected for a 1x1 solid image, when that fast path doesn't actually
understand repeating.

pixman/pixman-fast-path.c
pixman/pixman-mmx.c
pixman/pixman-private.h
pixman/pixman-sse2.c
pixman/pixman-utils.c

index 49dcf79db78cb58e2efc6303ef5e5ba73dad9de8..54b74229746b2c4c96db9f82af36d19e07dab368 100644 (file)
@@ -1361,12 +1361,12 @@ static const pixman_fast_path_t c_fast_paths[] =
     PIXMAN_STD_FAST_PATH (OVER, solid, a1, x8b8g8r8, fast_composite_over_n_1_8888),
     PIXMAN_STD_FAST_PATH (OVER, solid, a1, r5g6b5,   fast_composite_over_n_1_0565),
     PIXMAN_STD_FAST_PATH (OVER, solid, a1, b5g6r5,   fast_composite_over_n_1_0565),
-    PIXMAN_STD_FAST_PATH (OVER, solid, a8r8g8b8_ca, a8r8g8b8, fast_composite_over_n_8888_8888_ca),
-    PIXMAN_STD_FAST_PATH (OVER, solid, a8r8g8b8_ca, x8r8g8b8, fast_composite_over_n_8888_8888_ca),
-    PIXMAN_STD_FAST_PATH (OVER, solid, a8r8g8b8_ca, r5g6b5, fast_composite_over_n_8888_0565_ca),
-    PIXMAN_STD_FAST_PATH (OVER, solid, a8b8g8r8_ca, a8b8g8r8, fast_composite_over_n_8888_8888_ca),
-    PIXMAN_STD_FAST_PATH (OVER, solid, a8b8g8r8_ca, x8b8g8r8, fast_composite_over_n_8888_8888_ca),
-    PIXMAN_STD_FAST_PATH (OVER, solid, a8b8g8r8_ca, b5g6r5, fast_composite_over_n_8888_0565_ca),
+    PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, a8r8g8b8, fast_composite_over_n_8888_8888_ca),
+    PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, x8r8g8b8, fast_composite_over_n_8888_8888_ca),
+    PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, r5g6b5, fast_composite_over_n_8888_0565_ca),
+    PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, a8b8g8r8, fast_composite_over_n_8888_8888_ca),
+    PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, x8b8g8r8, fast_composite_over_n_8888_8888_ca),
+    PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, b5g6r5, fast_composite_over_n_8888_0565_ca),
     PIXMAN_STD_FAST_PATH (OVER, x8r8g8b8, a8, x8r8g8b8, fast_composite_over_x888_8_8888),
     PIXMAN_STD_FAST_PATH (OVER, x8r8g8b8, a8, a8r8g8b8, fast_composite_over_x888_8_8888),
     PIXMAN_STD_FAST_PATH (OVER, x8b8g8r8, a8, x8b8g8r8, fast_composite_over_x888_8_8888),
@@ -1381,7 +1381,7 @@ static const pixman_fast_path_t c_fast_paths[] =
     PIXMAN_STD_FAST_PATH (ADD, a8b8g8r8, null, a8b8g8r8, fast_composite_add_8888_8888),
     PIXMAN_STD_FAST_PATH (ADD, a8, null, a8, fast_composite_add_8000_8000),
     PIXMAN_STD_FAST_PATH (ADD, a1, null, a1, fast_composite_add_1000_1000),
-    PIXMAN_STD_FAST_PATH (ADD, solid, a8r8g8b8_ca, a8r8g8b8, fast_composite_add_n_8888_8888_ca),
+    PIXMAN_STD_FAST_PATH_CA (ADD, solid, a8r8g8b8, a8r8g8b8, fast_composite_add_n_8888_8888_ca),
     PIXMAN_STD_FAST_PATH (ADD, solid, a8, a8, fast_composite_add_n_8_8),
     PIXMAN_STD_FAST_PATH (SRC, solid, null, a8r8g8b8, fast_composite_solid_fill),
     PIXMAN_STD_FAST_PATH (SRC, solid, null, x8r8g8b8, fast_composite_solid_fill),
index b7961cfd60e3ceb53eabccdd8e93d604cf0b2778..a4affa57cc0c5f2b41d4f1bcaa1c5f5ec92f3eec 100644 (file)
@@ -3216,74 +3216,74 @@ mmx_composite_over_x888_8_8888 (pixman_implementation_t *imp,
 
 static const pixman_fast_path_t mmx_fast_paths[] =
 {
-    PIXMAN_STD_FAST_PATH (OVER, solid,   a8,          r5g6b5,   mmx_composite_over_n_8_0565       ),
-    PIXMAN_STD_FAST_PATH (OVER, solid,   a8,          b5g6r5,   mmx_composite_over_n_8_0565       ),
-    PIXMAN_STD_FAST_PATH (OVER, solid,    a8,          a8r8g8b8, mmx_composite_over_n_8_8888       ),
-    PIXMAN_STD_FAST_PATH (OVER, solid,    a8,          x8r8g8b8, mmx_composite_over_n_8_8888       ),
-    PIXMAN_STD_FAST_PATH (OVER, solid,    a8,          a8b8g8r8, mmx_composite_over_n_8_8888       ),
-    PIXMAN_STD_FAST_PATH (OVER, solid,    a8,          x8b8g8r8, mmx_composite_over_n_8_8888       ),
-    PIXMAN_STD_FAST_PATH (OVER, solid,    a8r8g8b8_ca, a8r8g8b8, mmx_composite_over_n_8888_8888_ca ),
-    PIXMAN_STD_FAST_PATH (OVER, solid,    a8r8g8b8_ca, x8r8g8b8, mmx_composite_over_n_8888_8888_ca ),
-    PIXMAN_STD_FAST_PATH (OVER, solid,    a8r8g8b8_ca, r5g6b5,   mmx_composite_over_n_8888_0565_ca ),
-    PIXMAN_STD_FAST_PATH (OVER, solid,    a8b8g8r8_ca, a8b8g8r8, mmx_composite_over_n_8888_8888_ca ),
-    PIXMAN_STD_FAST_PATH (OVER, solid,    a8b8g8r8_ca, x8b8g8r8, mmx_composite_over_n_8888_8888_ca ),
-    PIXMAN_STD_FAST_PATH (OVER, solid,    a8b8g8r8_ca, b5g6r5,   mmx_composite_over_n_8888_0565_ca ),
-    PIXMAN_STD_FAST_PATH (OVER, pixbuf,   pixbuf,      a8r8g8b8, mmx_composite_over_pixbuf_8888    ),
-    PIXMAN_STD_FAST_PATH (OVER, pixbuf,   pixbuf,      x8r8g8b8, mmx_composite_over_pixbuf_8888    ),
-    PIXMAN_STD_FAST_PATH (OVER, pixbuf,   pixbuf,      r5g6b5,   mmx_composite_over_pixbuf_0565    ),
-    PIXMAN_STD_FAST_PATH (OVER, rpixbuf,  rpixbuf,     a8b8g8r8, mmx_composite_over_pixbuf_8888    ),
-    PIXMAN_STD_FAST_PATH (OVER, rpixbuf,  rpixbuf,     x8b8g8r8, mmx_composite_over_pixbuf_8888    ),
-    PIXMAN_STD_FAST_PATH (OVER, rpixbuf,  rpixbuf,     b5g6r5,   mmx_composite_over_pixbuf_0565    ),
-    PIXMAN_STD_FAST_PATH (OVER, x8r8g8b8, solid,       a8r8g8b8, mmx_composite_over_x888_n_8888    ),
-    PIXMAN_STD_FAST_PATH (OVER, x8r8g8b8, solid,       x8r8g8b8, mmx_composite_over_x888_n_8888    ),
-    PIXMAN_STD_FAST_PATH (OVER, x8b8g8r8, solid,       a8b8g8r8, mmx_composite_over_x888_n_8888    ),
-    PIXMAN_STD_FAST_PATH (OVER, x8b8g8r8, solid,       x8b8g8r8, mmx_composite_over_x888_n_8888    ),
-    PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid,       a8r8g8b8, mmx_composite_over_8888_n_8888    ),
-    PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid,       x8r8g8b8, mmx_composite_over_8888_n_8888    ),
-    PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, solid,       a8b8g8r8, mmx_composite_over_8888_n_8888    ),
-    PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, solid,       x8b8g8r8, mmx_composite_over_8888_n_8888    ),
+    PIXMAN_STD_FAST_PATH    (OVER, solid,    a8,       r5g6b5,   mmx_composite_over_n_8_0565       ),
+    PIXMAN_STD_FAST_PATH    (OVER, solid,    a8,       b5g6r5,   mmx_composite_over_n_8_0565       ),
+    PIXMAN_STD_FAST_PATH    (OVER, solid,    a8,       a8r8g8b8, mmx_composite_over_n_8_8888       ),
+    PIXMAN_STD_FAST_PATH    (OVER, solid,    a8,       x8r8g8b8, mmx_composite_over_n_8_8888       ),
+    PIXMAN_STD_FAST_PATH    (OVER, solid,    a8,       a8b8g8r8, mmx_composite_over_n_8_8888       ),
+    PIXMAN_STD_FAST_PATH    (OVER, solid,    a8,       x8b8g8r8, mmx_composite_over_n_8_8888       ),
+    PIXMAN_STD_FAST_PATH_CA (OVER, solid,    a8r8g8b8, a8r8g8b8, mmx_composite_over_n_8888_8888_ca ),
+    PIXMAN_STD_FAST_PATH_CA (OVER, solid,    a8r8g8b8, x8r8g8b8, mmx_composite_over_n_8888_8888_ca ),
+    PIXMAN_STD_FAST_PATH_CA (OVER, solid,    a8r8g8b8, r5g6b5,   mmx_composite_over_n_8888_0565_ca ),
+    PIXMAN_STD_FAST_PATH_CA (OVER, solid,    a8b8g8r8, a8b8g8r8, mmx_composite_over_n_8888_8888_ca ),
+    PIXMAN_STD_FAST_PATH_CA (OVER, solid,    a8b8g8r8, x8b8g8r8, mmx_composite_over_n_8888_8888_ca ),
+    PIXMAN_STD_FAST_PATH_CA (OVER, solid,    a8b8g8r8, b5g6r5,   mmx_composite_over_n_8888_0565_ca ),
+    PIXMAN_STD_FAST_PATH    (OVER, pixbuf,   pixbuf,   a8r8g8b8, mmx_composite_over_pixbuf_8888    ),
+    PIXMAN_STD_FAST_PATH    (OVER, pixbuf,   pixbuf,   x8r8g8b8, mmx_composite_over_pixbuf_8888    ),
+    PIXMAN_STD_FAST_PATH    (OVER, pixbuf,   pixbuf,   r5g6b5,   mmx_composite_over_pixbuf_0565    ),
+    PIXMAN_STD_FAST_PATH    (OVER, rpixbuf,  rpixbuf,  a8b8g8r8, mmx_composite_over_pixbuf_8888    ),
+    PIXMAN_STD_FAST_PATH    (OVER, rpixbuf,  rpixbuf,  x8b8g8r8, mmx_composite_over_pixbuf_8888    ),
+    PIXMAN_STD_FAST_PATH    (OVER, rpixbuf,  rpixbuf,  b5g6r5,   mmx_composite_over_pixbuf_0565    ),
+    PIXMAN_STD_FAST_PATH    (OVER, x8r8g8b8, solid,    a8r8g8b8, mmx_composite_over_x888_n_8888    ),
+    PIXMAN_STD_FAST_PATH    (OVER, x8r8g8b8, solid,    x8r8g8b8, mmx_composite_over_x888_n_8888    ),
+    PIXMAN_STD_FAST_PATH    (OVER, x8b8g8r8, solid,    a8b8g8r8, mmx_composite_over_x888_n_8888    ),
+    PIXMAN_STD_FAST_PATH    (OVER, x8b8g8r8, solid,    x8b8g8r8, mmx_composite_over_x888_n_8888    ),
+    PIXMAN_STD_FAST_PATH    (OVER, a8r8g8b8, solid,    a8r8g8b8, mmx_composite_over_8888_n_8888    ),
+    PIXMAN_STD_FAST_PATH    (OVER, a8r8g8b8, solid,    x8r8g8b8, mmx_composite_over_8888_n_8888    ),
+    PIXMAN_STD_FAST_PATH    (OVER, a8b8g8r8, solid,    a8b8g8r8, mmx_composite_over_8888_n_8888    ),
+    PIXMAN_STD_FAST_PATH    (OVER, a8b8g8r8, solid,    x8b8g8r8, mmx_composite_over_8888_n_8888    ),
 #if 0
     /* FIXME: This code is commented out since it's apparently
      * not actually faster than the generic code.
      */
-    PIXMAN_STD_FAST_PATH (OVER, x8r8g8b8, a8,          x8r8g8b8, mmx_composite_over_x888_8_8888    ),
-    PIXMAN_STD_FAST_PATH (OVER, x8r8g8b8, a8,          a8r8g8b8, mmx_composite_over_x888_8_8888    ),
-    PIXMAN_STD_FAST_PATH (OVER, x8b8r8g8, a8,          x8b8g8r8, mmx_composite_over_x888_8_8888    ),
-    PIXMAN_STD_FAST_PATH (OVER, x8b8r8g8, a8,          a8r8g8b8, mmx_composite_over_x888_8_8888    ),
+    PIXMAN_STD_FAST_PATH    (OVER, x8r8g8b8, a8,       x8r8g8b8, mmx_composite_over_x888_8_8888    ),
+    PIXMAN_STD_FAST_PATH    (OVER, x8r8g8b8, a8,       a8r8g8b8, mmx_composite_over_x888_8_8888    ),
+    PIXMAN_STD_FAST_PATH    (OVER, x8b8r8g8, a8,       x8b8g8r8, mmx_composite_over_x888_8_8888    ),
+    PIXMAN_STD_FAST_PATH    (OVER, x8b8r8g8, a8,       a8r8g8b8, mmx_composite_over_x888_8_8888    ),
 #endif
-    PIXMAN_STD_FAST_PATH (OVER, solid,    null,        a8r8g8b8, mmx_composite_over_n_8888         ),
-    PIXMAN_STD_FAST_PATH (OVER, solid,    null,        x8r8g8b8, mmx_composite_over_n_8888         ),
-    PIXMAN_STD_FAST_PATH (OVER, solid,    null,        r5g6b5,   mmx_composite_over_n_0565         ),
-    PIXMAN_STD_FAST_PATH (OVER, x8r8g8b8, null,        x8r8g8b8, mmx_composite_copy_area           ),
-    PIXMAN_STD_FAST_PATH (OVER, x8b8g8r8, null,        x8b8g8r8, mmx_composite_copy_area           ),
-
-    PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null,        a8r8g8b8, mmx_composite_over_8888_8888      ),
-    PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null,        x8r8g8b8, mmx_composite_over_8888_8888      ),
-    PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null,        r5g6b5,   mmx_composite_over_8888_0565      ),
-    PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null,        a8b8g8r8, mmx_composite_over_8888_8888      ),
-    PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null,        x8b8g8r8, mmx_composite_over_8888_8888      ),
-    PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null,        b5g6r5,   mmx_composite_over_8888_0565      ),
-
-    PIXMAN_STD_FAST_PATH (ADD,  a8r8g8b8, null,        a8r8g8b8, mmx_composite_add_8888_8888       ),
-    PIXMAN_STD_FAST_PATH (ADD,  a8b8g8r8, null,        a8b8g8r8, mmx_composite_add_8888_8888       ),
-    PIXMAN_STD_FAST_PATH (ADD,  a8,       null,        a8,       mmx_composite_add_8000_8000       ),
-    PIXMAN_STD_FAST_PATH (ADD,  solid,    a8,          a8,       mmx_composite_add_n_8_8           ),
-
-    PIXMAN_STD_FAST_PATH (SRC,  solid,    a8,          a8r8g8b8, mmx_composite_src_n_8_8888        ),
-    PIXMAN_STD_FAST_PATH (SRC,  solid,    a8,          x8r8g8b8, mmx_composite_src_n_8_8888        ),
-    PIXMAN_STD_FAST_PATH (SRC,  solid,    a8,          a8b8g8r8, mmx_composite_src_n_8_8888        ),
-    PIXMAN_STD_FAST_PATH (SRC,  solid,    a8,          x8b8g8r8, mmx_composite_src_n_8_8888        ),
-    PIXMAN_STD_FAST_PATH (SRC,  a8r8g8b8, null,        a8r8g8b8, mmx_composite_copy_area           ),
-    PIXMAN_STD_FAST_PATH (SRC,  a8b8g8r8, null,        a8b8g8r8, mmx_composite_copy_area           ),
-    PIXMAN_STD_FAST_PATH (SRC,  a8r8g8b8, null,        x8r8g8b8, mmx_composite_copy_area           ),
-    PIXMAN_STD_FAST_PATH (SRC,  a8b8g8r8, null,        x8b8g8r8, mmx_composite_copy_area           ),
-    PIXMAN_STD_FAST_PATH (SRC,  x8r8g8b8, null,        x8r8g8b8, mmx_composite_copy_area           ),
-    PIXMAN_STD_FAST_PATH (SRC,  x8b8g8r8, null,        x8b8g8r8, mmx_composite_copy_area           ),
-    PIXMAN_STD_FAST_PATH (SRC,  r5g6b5,   null,        r5g6b5,   mmx_composite_copy_area           ),
-    PIXMAN_STD_FAST_PATH (SRC,  b5g6r5,   null,        b5g6r5,   mmx_composite_copy_area           ),
-
-    PIXMAN_STD_FAST_PATH (IN,   a8,       null,        a8,       mmx_composite_in_8_8              ),
-    PIXMAN_STD_FAST_PATH (IN,   solid,    a8,          a8,       mmx_composite_in_n_8_8            ),
+    PIXMAN_STD_FAST_PATH    (OVER, solid,    null,     a8r8g8b8, mmx_composite_over_n_8888         ),
+    PIXMAN_STD_FAST_PATH    (OVER, solid,    null,     x8r8g8b8, mmx_composite_over_n_8888         ),
+    PIXMAN_STD_FAST_PATH    (OVER, solid,    null,     r5g6b5,   mmx_composite_over_n_0565         ),
+    PIXMAN_STD_FAST_PATH    (OVER, x8r8g8b8, null,     x8r8g8b8, mmx_composite_copy_area           ),
+    PIXMAN_STD_FAST_PATH    (OVER, x8b8g8r8, null,     x8b8g8r8, mmx_composite_copy_area           ),
+
+    PIXMAN_STD_FAST_PATH    (OVER, a8r8g8b8, null,     a8r8g8b8, mmx_composite_over_8888_8888      ),
+    PIXMAN_STD_FAST_PATH    (OVER, a8r8g8b8, null,     x8r8g8b8, mmx_composite_over_8888_8888      ),
+    PIXMAN_STD_FAST_PATH    (OVER, a8r8g8b8, null,     r5g6b5,   mmx_composite_over_8888_0565      ),
+    PIXMAN_STD_FAST_PATH    (OVER, a8b8g8r8, null,     a8b8g8r8, mmx_composite_over_8888_8888      ),
+    PIXMAN_STD_FAST_PATH    (OVER, a8b8g8r8, null,     x8b8g8r8, mmx_composite_over_8888_8888      ),
+    PIXMAN_STD_FAST_PATH    (OVER, a8b8g8r8, null,     b5g6r5,   mmx_composite_over_8888_0565      ),
+
+    PIXMAN_STD_FAST_PATH    (ADD,  a8r8g8b8, null,     a8r8g8b8, mmx_composite_add_8888_8888       ),
+    PIXMAN_STD_FAST_PATH    (ADD,  a8b8g8r8, null,     a8b8g8r8, mmx_composite_add_8888_8888       ),
+    PIXMAN_STD_FAST_PATH    (ADD,  a8,       null,     a8,       mmx_composite_add_8000_8000       ),
+    PIXMAN_STD_FAST_PATH    (ADD,  solid,    a8,       a8,       mmx_composite_add_n_8_8           ),
+
+    PIXMAN_STD_FAST_PATH    (SRC,  solid,    a8,       a8r8g8b8, mmx_composite_src_n_8_8888        ),
+    PIXMAN_STD_FAST_PATH    (SRC,  solid,    a8,       x8r8g8b8, mmx_composite_src_n_8_8888        ),
+    PIXMAN_STD_FAST_PATH    (SRC,  solid,    a8,       a8b8g8r8, mmx_composite_src_n_8_8888        ),
+    PIXMAN_STD_FAST_PATH    (SRC,  solid,    a8,       x8b8g8r8, mmx_composite_src_n_8_8888        ),
+    PIXMAN_STD_FAST_PATH    (SRC,  a8r8g8b8, null,     a8r8g8b8, mmx_composite_copy_area           ),
+    PIXMAN_STD_FAST_PATH    (SRC,  a8b8g8r8, null,     a8b8g8r8, mmx_composite_copy_area           ),
+    PIXMAN_STD_FAST_PATH    (SRC,  a8r8g8b8, null,     x8r8g8b8, mmx_composite_copy_area           ),
+    PIXMAN_STD_FAST_PATH    (SRC,  a8b8g8r8, null,     x8b8g8r8, mmx_composite_copy_area           ),
+    PIXMAN_STD_FAST_PATH    (SRC,  x8r8g8b8, null,     x8r8g8b8, mmx_composite_copy_area           ),
+    PIXMAN_STD_FAST_PATH    (SRC,  x8b8g8r8, null,     x8b8g8r8, mmx_composite_copy_area           ),
+    PIXMAN_STD_FAST_PATH    (SRC,  r5g6b5,   null,     r5g6b5,   mmx_composite_copy_area           ),
+    PIXMAN_STD_FAST_PATH    (SRC,  b5g6r5,   null,     b5g6r5,   mmx_composite_copy_area           ),
+
+    PIXMAN_STD_FAST_PATH    (IN,   a8,       null,     a8,       mmx_composite_in_8_8              ),
+    PIXMAN_STD_FAST_PATH    (IN,   solid,    a8,       a8,       mmx_composite_in_n_8_8            ),
 
     { PIXMAN_OP_NONE },
 };
index 2055f9ac87c67da59fa94b9bcd84a181b9b04c1b..c99b10179a9ef9ce72986653a968c44fe3323a7a 100644 (file)
@@ -561,15 +561,41 @@ _pixman_choose_implementation (void);
  */
 #define PIXMAN_null             PIXMAN_FORMAT (0, 0, 0, 0, 0, 0)
 #define PIXMAN_solid            PIXMAN_FORMAT (0, 1, 0, 0, 0, 0)
-#define PIXMAN_a8r8g8b8_ca     PIXMAN_FORMAT (0, 2, 0, 0, 0, 0)
-#define PIXMAN_a8b8g8r8_ca     PIXMAN_FORMAT (0, 3, 0, 0, 0, 0)
-#define PIXMAN_pixbuf          PIXMAN_FORMAT (0, 4, 0, 0, 0, 0)
-#define PIXMAN_rpixbuf         PIXMAN_FORMAT (0, 5, 0, 0, 0, 0)
-
-#define FAST_PATH_STD_SRC_FLAGS                0
-#define FAST_PATH_STD_MASK_U_FLAGS     0
-#define FAST_PATH_STD_MASK_CA_FLAGS    0
-#define FAST_PATH_STD_DEST_FLAGS       0
+#define PIXMAN_pixbuf          PIXMAN_FORMAT (0, 2, 0, 0, 0, 0)
+#define PIXMAN_rpixbuf         PIXMAN_FORMAT (0, 3, 0, 0, 0, 0)
+#define PIXMAN_unknown         PIXMAN_FORMAT (0, 4, 0, 0, 0, 0)
+
+#define FAST_PATH_ID_TRANSFORM                 (1 << 0)
+#define FAST_PATH_NO_ALPHA_MAP                 (1 << 1)
+#define FAST_PATH_NO_CONVOLUTION_FILTER                (1 << 2)
+#define FAST_PATH_NO_PAD_REPEAT                        (1 << 3)
+#define FAST_PATH_NO_REFLECT_REPEAT            (1 << 4)
+#define FAST_PATH_NO_ACCESSORS                 (1 << 5)
+#define FAST_PATH_NO_WIDE_FORMAT               (1 << 6)
+#define FAST_PATH_reserved                     (1 << 7)
+#define FAST_PATH_COMPONENT_ALPHA              (1 << 8)
+#define FAST_PATH_UNIFIED_ALPHA                        (1 << 9)
+
+#define _FAST_PATH_STANDARD_FLAGS                                      \
+    (FAST_PATH_ID_TRANSFORM            |                               \
+     FAST_PATH_NO_ALPHA_MAP            |                               \
+     FAST_PATH_NO_CONVOLUTION_FILTER   |                               \
+     FAST_PATH_NO_PAD_REPEAT           |                               \
+     FAST_PATH_NO_REFLECT_REPEAT       |                               \
+     FAST_PATH_NO_ACCESSORS            |                               \
+     FAST_PATH_NO_WIDE_FORMAT)
+
+#define FAST_PATH_STD_SRC_FLAGS                                                \
+    _FAST_PATH_STANDARD_FLAGS
+#define FAST_PATH_STD_MASK_U_FLAGS                                     \
+    (_FAST_PATH_STANDARD_FLAGS         |                               \
+     FAST_PATH_UNIFIED_ALPHA)
+#define FAST_PATH_STD_MASK_CA_FLAGS                                    \
+    (_FAST_PATH_STANDARD_FLAGS         |                               \
+     FAST_PATH_COMPONENT_ALPHA)
+#define FAST_PATH_STD_DEST_FLAGS                                       \
+    (FAST_PATH_NO_ACCESSORS            |                               \
+     FAST_PATH_NO_WIDE_FORMAT)
 
 typedef struct
 {
@@ -583,16 +609,31 @@ typedef struct
     pixman_composite_func_t func;
 } pixman_fast_path_t;
 
+#define FAST_PATH(op, src, src_flags, mask, mask_flags, dest, dest_flags, func) \
+    PIXMAN_OP_ ## op,                                                  \
+    PIXMAN_ ## src,                                                    \
+    src_flags,                                                         \
+    PIXMAN_ ## mask,                                                   \
+    mask_flags,                                                                \
+    PIXMAN_ ## dest,                                                   \
+    dest_flags,                                                                \
+    func
+
 #define PIXMAN_STD_FAST_PATH(op, src, mask, dest, func)                        \
-    {      PIXMAN_OP_ ## op,                                           \
-           PIXMAN_ ## src, FAST_PATH_STD_SRC_FLAGS,                    \
-           PIXMAN_ ## mask,                                            \
-           ((PIXMAN_ ## mask == PIXMAN_a8r8g8b8_ca ||                  \
-             PIXMAN_ ## mask == PIXMAN_a8b8g8r8_ca) ?                  \
-            FAST_PATH_STD_MASK_CA_FLAGS : FAST_PATH_STD_MASK_U_FLAGS), \
-           PIXMAN_ ## dest, FAST_PATH_STD_DEST_FLAGS,                  \
-           func                                                        \
-    }
+    { FAST_PATH (                                                      \
+         op,                                                           \
+         src, FAST_PATH_STD_SRC_FLAGS,                                 \
+         mask, (PIXMAN_ ## mask) ? FAST_PATH_STD_MASK_U_FLAGS : 0,     \
+         dest, FAST_PATH_STD_DEST_FLAGS,                               \
+         func) }
+
+#define PIXMAN_STD_FAST_PATH_CA(op, src, mask, dest, func)             \
+    { FAST_PATH (                                                      \
+         op,                                                           \
+         src, FAST_PATH_STD_SRC_FLAGS,                                 \
+         mask, FAST_PATH_STD_MASK_CA_FLAGS,                            \
+         dest, FAST_PATH_STD_DEST_FLAGS,                               \
+         func) }
 
 /* Memory allocation helpers */
 void *
index df3fee085b21819de364922e71a05e386656e3c3..2bade7476a4207a13956df2585820d5bd6cb1c44 100644 (file)
@@ -5799,12 +5799,12 @@ static const pixman_fast_path_t sse2_fast_paths[] =
     PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, x8r8g8b8, sse2_composite_over_8888_n_8888),
     PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, solid, a8b8g8r8, sse2_composite_over_8888_n_8888),
     PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, solid, x8b8g8r8, sse2_composite_over_8888_n_8888),
-    PIXMAN_STD_FAST_PATH (OVER, solid, a8r8g8b8_ca, a8r8g8b8, sse2_composite_over_n_8888_8888_ca),
-    PIXMAN_STD_FAST_PATH (OVER, solid, a8r8g8b8_ca, x8r8g8b8, sse2_composite_over_n_8888_8888_ca),
-    PIXMAN_STD_FAST_PATH (OVER, solid, a8b8g8r8_ca, a8b8g8r8, sse2_composite_over_n_8888_8888_ca),
-    PIXMAN_STD_FAST_PATH (OVER, solid, a8b8g8r8_ca, x8b8g8r8, sse2_composite_over_n_8888_8888_ca),
-    PIXMAN_STD_FAST_PATH (OVER, solid, a8r8g8b8_ca, r5g6b5, sse2_composite_over_n_8888_0565_ca),
-    PIXMAN_STD_FAST_PATH (OVER, solid, a8b8g8r8_ca, b5g6r5, sse2_composite_over_n_8888_0565_ca),
+    PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, a8r8g8b8, sse2_composite_over_n_8888_8888_ca),
+    PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, x8r8g8b8, sse2_composite_over_n_8888_8888_ca),
+    PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, a8b8g8r8, sse2_composite_over_n_8888_8888_ca),
+    PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, x8b8g8r8, sse2_composite_over_n_8888_8888_ca),
+    PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, r5g6b5, sse2_composite_over_n_8888_0565_ca),
+    PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, b5g6r5, sse2_composite_over_n_8888_0565_ca),
     PIXMAN_STD_FAST_PATH (OVER, pixbuf, pixbuf, a8r8g8b8, sse2_composite_over_pixbuf_8888),
     PIXMAN_STD_FAST_PATH (OVER, pixbuf, pixbuf, x8r8g8b8, sse2_composite_over_pixbuf_8888),
     PIXMAN_STD_FAST_PATH (OVER, rpixbuf, rpixbuf, a8b8g8r8, sse2_composite_over_pixbuf_8888),
@@ -5815,7 +5815,7 @@ static const pixman_fast_path_t sse2_fast_paths[] =
     PIXMAN_STD_FAST_PATH (OVER, x8b8g8r8, null, x8b8g8r8, sse2_composite_copy_area),
 
     /* PIXMAN_OP_ADD */
-    PIXMAN_STD_FAST_PATH (ADD, solid, a8r8g8b8_ca, a8r8g8b8, sse2_composite_add_n_8888_8888_ca),
+    PIXMAN_STD_FAST_PATH_CA (ADD, solid, a8r8g8b8, a8r8g8b8, sse2_composite_add_n_8888_8888_ca),
     PIXMAN_STD_FAST_PATH (ADD, a8, null, a8, sse2_composite_add_8000_8000),
     PIXMAN_STD_FAST_PATH (ADD, a8r8g8b8, null, a8r8g8b8, sse2_composite_add_8888_8888),
     PIXMAN_STD_FAST_PATH (ADD, a8b8g8r8, null, a8b8g8r8, sse2_composite_add_8888_8888),
index cc3e6bae866e43864d1235b65bc95c1f750d6366..c30f09ccab26c6aeeece535c15c3ed2bf5cfb257 100644 (file)
@@ -498,76 +498,55 @@ _pixman_walk_composite_region (pixman_implementation_t *imp,
     }
 }
 
-static pixman_bool_t
-source_is_fastpathable (pixman_image_t *image)
-{
-    if (image->common.transform                                        ||
-       image->common.alpha_map                                 ||
-       image->common.filter == PIXMAN_FILTER_CONVOLUTION       ||
-       image->common.repeat == PIXMAN_REPEAT_PAD               ||
-       image->common.repeat == PIXMAN_REPEAT_REFLECT)
-    {
-       return FALSE;
-    }
-
-    if (image->type == BITS                                    &&
-       (image->bits.read_func                                  ||
-        image->bits.write_func                                 ||
-        PIXMAN_FORMAT_IS_WIDE (image->bits.format)))
-    {
-       return FALSE;
-    }
-
-    return TRUE;
-}
-
-static pixman_bool_t
-get_source_format_code (pixman_image_t *image, pixman_format_code_t *code)
+static void
+get_image_info (pixman_image_t       *image,
+               pixman_format_code_t *code,
+               uint32_t             *flags)
 {
+    *flags = 0;
+    
     if (!image)
     {
        *code = PIXMAN_null;
-       
-       return TRUE;
     }
     else
     {
-       if (!source_is_fastpathable (image))
-           return FALSE;
-       
-       if (image->common.component_alpha)
+       if (!image->common.transform)
+           *flags |= FAST_PATH_ID_TRANSFORM;
+
+       if (!image->common.alpha_map)
+           *flags |= FAST_PATH_NO_ALPHA_MAP;
+
+       if (image->common.filter != PIXMAN_FILTER_CONVOLUTION)
+           *flags |= FAST_PATH_NO_CONVOLUTION_FILTER;
+
+       if (image->common.repeat != PIXMAN_REPEAT_PAD)
+           *flags |= FAST_PATH_NO_PAD_REPEAT;
+
+       if (image->common.repeat != PIXMAN_REPEAT_REFLECT)
+           *flags |= FAST_PATH_NO_REFLECT_REPEAT;
+
+       *flags |= (FAST_PATH_NO_ACCESSORS | FAST_PATH_NO_WIDE_FORMAT);
+       if (image->type == BITS)
        {
-           if (image->type == BITS)
-           {
-               /* These are the *only* component_alpha formats
-                * we support for fast paths
-                */
-               if (image->bits.format == PIXMAN_a8r8g8b8)
-                   *code = PIXMAN_a8r8g8b8_ca;
-               else if (image->bits.format == PIXMAN_a8b8g8r8)
-                   *code = PIXMAN_a8b8g8r8_ca;
-               else
-                   return FALSE;
-           }
-           else
-           {
-               return FALSE;
-           }
+           if (image->bits.read_func || image->bits.write_func)
+               *flags &= ~FAST_PATH_NO_ACCESSORS;
+
+           if (PIXMAN_FORMAT_IS_WIDE (image->bits.format))
+               *flags &= ~FAST_PATH_NO_WIDE_FORMAT;
        }
-       else if (_pixman_image_is_solid (image))
-       {
+
+       if (image->common.component_alpha)
+           *flags |= FAST_PATH_COMPONENT_ALPHA;
+       else
+           *flags |= FAST_PATH_UNIFIED_ALPHA;
+
+       if (_pixman_image_is_solid (image))
            *code = PIXMAN_solid;
-       }
        else if (image->common.type == BITS)
-       {
            *code = image->bits.format;
-       }
        else
-       {
-           return FALSE;
-       }
-       
-       return TRUE;
+           *code = PIXMAN_unknown;
     }
 }
 
@@ -630,28 +609,20 @@ _pixman_run_fast_path (const pixman_fast_path_t *paths,
                        int32_t                   width,
                        int32_t                   height)
 {
-    pixman_bool_t src_repeat = src->common.repeat == PIXMAN_REPEAT_NORMAL;
-    pixman_bool_t mask_repeat = mask && mask->common.repeat == PIXMAN_REPEAT_NORMAL;
+    pixman_bool_t src_repeat
+       = src->common.repeat == PIXMAN_REPEAT_NORMAL;
+    pixman_bool_t mask_repeat
+       = mask && mask->common.repeat == PIXMAN_REPEAT_NORMAL;
     pixman_format_code_t src_format, mask_format, dest_format;
+    uint32_t src_flags, mask_flags, dest_flags;
     pixman_composite_func_t func = NULL;
     const pixman_fast_path_t *info;
     pixman_bool_t result;
 
-    if (!get_source_format_code (src, &src_format))
-       return FALSE;
-
-    if (!get_source_format_code (mask, &mask_format))
-       return FALSE;
-
-    if (dest->common.alpha_map ||
-       dest->bits.read_func    ||
-       dest->bits.write_func)
-    {
-       return FALSE;
-    }
-
-    dest_format = dest->bits.format;
-
+    get_image_info (src, &src_format, &src_flags);
+    get_image_info (mask, &mask_format, &mask_flags);
+    get_image_info (dest, &dest_format, &dest_flags);
+    
     /* Check for pixbufs */
     if ((mask_format == PIXMAN_a8r8g8b8 || mask_format == PIXMAN_a8b8g8r8) &&
        (src->type == BITS && src->bits.bits == mask->bits.bits)           &&
@@ -666,10 +637,13 @@ _pixman_run_fast_path (const pixman_fast_path_t *paths,
 
     for (info = paths; info->op != PIXMAN_OP_NONE; ++info)
     {
-       if (info->op == op                      &&
-           info->src_format == src_format      &&
-           info->mask_format == mask_format    &&
-           info->dest_format == dest_format)
+       if (info->op == op                                      &&
+           (info->src_format == src_format)                    &&
+           (info->src_flags & src_flags) == info->src_flags    &&
+           (info->mask_format == mask_format)                  &&
+           (info->mask_flags & mask_flags) == info->mask_flags &&
+           (info->dest_format == dest_format)                  &&
+           (info->dest_flags & dest_flags) == info->dest_flags)
        {
            func = info->func;
            
@@ -678,24 +652,7 @@ _pixman_run_fast_path (const pixman_fast_path_t *paths,
            
            if (info->mask_format == PIXMAN_solid)
                mask_repeat = FALSE;
-           
-           if ((src_repeat                             &&
-                src->bits.width == 1           &&
-                src->bits.height == 1)         ||
-               (mask_repeat                    &&
-                mask->bits.width == 1          &&
-                mask->bits.height == 1))
-           {
-               /* If src or mask are repeating 1x1 images and src_repeat or
-                * mask_repeat are still TRUE, it means the fast path we
-                * selected does not actually handle repeating images.
-                *
-                * So rather than calling the "fast path" with a zillion
-                * 1x1 requests, we just fall back to the general code (which
-                * does do something sensible with 1x1 repeating images).
-                */
-               func = NULL;
-           }
+
            break;
        }
     }