pixman: Branch 'master' - 16 commits

Chris Wilson ickle at kemper.freedesktop.org
Sun Sep 13 08:40:09 PDT 2009


 configure.ac            |    3 
 pixman/Makefile.am      |    3 
 pixman/pixman-general.c |    6 
 pixman/pixman-sse2.c    |   11 
 pixman/pixman.h         |    2 
 test/Makefile.am        |    2 
 test/composite.c        |  798 ++++++++++++++++++++++++++++++++++++++++++++++++
 7 files changed, 815 insertions(+), 10 deletions(-)

New commits:
commit c28e39f17a87cdaa7ce43ec99f2f764cc935f484
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Sep 13 15:04:30 2009 +0100

    [build] Add rule to generate asm for inspection.

diff --git a/pixman/Makefile.am b/pixman/Makefile.am
index e19fa6e..6959041 100644
--- a/pixman/Makefile.am
+++ b/pixman/Makefile.am
@@ -108,4 +108,5 @@ libpixman_arm_neon_la_LIBADD = $(DEP_LIBS)
 libpixman_1_la_LIBADD += libpixman-arm-neon.la
 endif
 
-
+.c.s : $(libpixmaninclude_HEADERS)
+	$(CC) $(CFLAGS) -DHAVE_CONFIG_H -I$(srcdir) -I$(builddir) -I$(top_builddir) -S -o $@ $<
commit 823bb1a9430bc0c4735ffefbbe19efe45887e32c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Sep 13 15:04:54 2009 +0100

    [sse2] Don't emit prefetch 0 for an absent mask

diff --git a/pixman/pixman-sse2.c b/pixman/pixman-sse2.c
index 9104e8d..fc78765 100644
--- a/pixman/pixman-sse2.c
+++ b/pixman/pixman-sse2.c
@@ -629,7 +629,8 @@ core_combine_over_u_sse2 (uint32_t*       pd,
     /* call prefetch hint to optimize cache load*/
     cache_prefetch ((__m128i*)ps);
     cache_prefetch ((__m128i*)pd);
-    cache_prefetch ((__m128i*)pm);
+    if (pm)
+	cache_prefetch ((__m128i*)pm);
 
     /* Align dst on a 16-byte boundary */
     while (w && ((unsigned long)pd & 15))
@@ -647,14 +648,16 @@ core_combine_over_u_sse2 (uint32_t*       pd,
     /* call prefetch hint to optimize cache load*/
     cache_prefetch ((__m128i*)ps);
     cache_prefetch ((__m128i*)pd);
-    cache_prefetch ((__m128i*)pm);
+    if (pm)
+	cache_prefetch ((__m128i*)pm);
 
     while (w >= 4)
     {
 	/* fill cache line with next memory */
 	cache_prefetch_next ((__m128i*)ps);
 	cache_prefetch_next ((__m128i*)pd);
-	cache_prefetch_next ((__m128i*)pm);
+	if (pm)
+	    cache_prefetch_next ((__m128i*)pm);
 
 	/* I'm loading unaligned because I'm not sure about
 	 * the address alignment.
commit 8f2daa7ca25de754522abfb9ed1158d090f00780
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Sep 13 15:07:08 2009 +0100

    [test] Add composite test from rendercheck
    
    Iterate over all destination formats for dst, src and composite and
    compare the result of all oprators with a selection of colours.

diff --git a/test/Makefile.am b/test/Makefile.am
index c56f62d..784abe8 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -5,6 +5,7 @@ TESTPROGRAMS =			\
 	region-test		\
 	scaling-test		\
 	blitters-test		\
+	composite		\
 	fetch-test		\
 	oob-test		\
 	window-test		\
@@ -14,6 +15,7 @@ fetch_test_LDADD = $(TEST_LDADD)
 region_test_LDADD = $(TEST_LDADD)
 scaling_test_LDADD = $(TEST_LDADD)
 blitters_test_LDADD = $(TEST_LDADD)
+composite_LDADD = $(TEST_LDADD)
 trap_crasher_LDADD = $(TEST_LDADD)
 oob_test_LDADD = $(TEST_LDADD)
 window_test_LDADD = $(TEST_LDADD)
diff --git a/test/composite.c b/test/composite.c
new file mode 100644
index 0000000..f1df0c8
--- /dev/null
+++ b/test/composite.c
@@ -0,0 +1,798 @@
+/*
+ * Copyright © 2005 Eric Anholt
+ * Copyright © 2009 Chris Wilson
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Eric Anholt not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission.  Eric Anholt makes no
+ * representations about the suitability of this software for any purpose.  It
+ * is provided "as is" without express or implied warranty.
+ *
+ * ERIC ANHOLT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL ERIC ANHOLT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <pixman.h>
+#include <stdio.h>
+#include <stdlib.h> /* abort() */
+#include <math.h>
+
+#define FALSE 0
+#define TRUE !FALSE
+
+#define ARRAY_LENGTH(A) ((int) (sizeof (A) / sizeof ((A) [0])))
+#define min(a,b) ((a) <= (b) ? (a) : (b))
+#define max(a,b) ((a) >= (b) ? (a) : (b))
+
+static struct color {
+    double r,g,b,a;
+} colors[] = {
+    /* these are premultiplied in main() */
+    {1.0, 1.0, 1.0, 1.0},
+    {1.0, 0.0, 0.0, 1.0},
+    {0.0, 1.0, 0.0, 1.0},
+    {0.0, 0.0, 1.0, 1.0},
+    {0.0, 0.0, 0.0, 1.0},
+    {0.5, 0.0, 0.0, 0.5},
+};
+
+static uint16_t
+_color_double_to_short (double d)
+{
+    uint32_t i;
+
+    i = (uint32_t) (d * 65536);
+    i -= (i >> 16);
+
+    return i;
+}
+
+static void
+compute_pixman_color (const struct color *color,
+		      pixman_color_t *out)
+{
+    out->red   = _color_double_to_short (color->r);
+    out->green = _color_double_to_short (color->g);
+    out->blue  = _color_double_to_short (color->b);
+    out->alpha = _color_double_to_short (color->a);
+}
+
+static const struct format {
+    pixman_format_code_t format;
+    const char *name;
+} formats[] = {
+#define P(x) { PIXMAN_##x, #x }
+    P(a8),
+
+    /* 32bpp formats */
+    P(a8r8g8b8),
+    P(x8r8g8b8),
+    P(a8b8g8r8),
+    P(x8b8g8r8),
+    P(b8g8r8a8),
+    P(b8g8r8x8),
+
+    /* XXX: and here the errors begin! */
+#if 0
+    P(x2r10g10b10),
+    P(a2r10g10b10),
+    P(x2b10g10r10),
+    P(a2b10g10r10),
+
+    /* 24bpp formats */
+    P(r8g8b8),
+    P(b8g8r8),
+
+    /* 16bpp formats */
+    P(r5g6b5),
+    P(b5g6r5),
+
+    P(a1r5g5b5),
+    P(x1r5g5b5),
+    P(a1b5g5r5),
+    P(x1b5g5r5),
+    P(a4r4g4b4),
+    P(x4r4g4b4),
+    P(a4b4g4r4),
+    P(x4b4g4r4),
+
+    /* 8bpp formats */
+    P(a8),
+    P(r3g3b2),
+    P(b2g3r3),
+    P(a2r2g2b2),
+    P(a2b2g2r2),
+
+    P(x4a4),
+
+    /* 4bpp formats */
+    P(a4),
+    P(r1g2b1),
+    P(b1g2r1),
+    P(a1r1g1b1),
+    P(a1b1g1r1),
+
+    /* 1bpp formats */
+    P(a1)
+#endif
+#undef P
+};
+
+struct image {
+    pixman_image_t *image;
+    const struct format *format;
+    const struct color *color;
+    int size;
+};
+
+static const struct operator {
+    pixman_op_t op;
+    const char *name;
+} operators[] = {
+#define P(x) { PIXMAN_OP_##x, #x }
+    P(CLEAR),
+    P(SRC),
+    P(DST),
+    P(OVER),
+    P(OVER_REVERSE),
+    P(IN),
+    P(IN_REVERSE),
+    P(OUT),
+    P(OUT_REVERSE),
+    P(ATOP),
+    P(ATOP_REVERSE),
+    P(XOR),
+    P(ADD),
+    P(SATURATE),
+
+    P(DISJOINT_CLEAR),
+    P(DISJOINT_SRC),
+    P(DISJOINT_DST),
+    P(DISJOINT_OVER),
+    P(DISJOINT_OVER_REVERSE),
+    P(DISJOINT_IN),
+    P(DISJOINT_IN_REVERSE),
+    P(DISJOINT_OUT),
+    P(DISJOINT_OUT_REVERSE),
+    P(DISJOINT_ATOP),
+    P(DISJOINT_ATOP_REVERSE),
+    P(DISJOINT_XOR),
+
+    P(CONJOINT_CLEAR),
+    P(CONJOINT_SRC),
+    P(CONJOINT_DST),
+    P(CONJOINT_OVER),
+    P(CONJOINT_OVER_REVERSE),
+    P(CONJOINT_IN),
+    P(CONJOINT_IN_REVERSE),
+    P(CONJOINT_OUT),
+    P(CONJOINT_OUT_REVERSE),
+    P(CONJOINT_ATOP),
+    P(CONJOINT_ATOP_REVERSE),
+    P(CONJOINT_XOR),
+#undef P
+};
+
+static double
+calc_op (pixman_op_t op, double src, double dst, double srca, double dsta)
+{
+#define mult_chan(src, dst, Fa, Fb) min ((src) * (Fa) + (dst) * (Fb), 1.0)
+
+    double Fa, Fb;
+
+    switch (op) {
+    case PIXMAN_OP_CLEAR:
+    case PIXMAN_OP_DISJOINT_CLEAR:
+    case PIXMAN_OP_CONJOINT_CLEAR:
+	return mult_chan (src, dst, 0.0, 0.0);
+
+    case PIXMAN_OP_SRC:
+    case PIXMAN_OP_DISJOINT_SRC:
+    case PIXMAN_OP_CONJOINT_SRC:
+	return mult_chan (src, dst, 1.0, 0.0);
+
+    case PIXMAN_OP_DST:
+    case PIXMAN_OP_DISJOINT_DST:
+    case PIXMAN_OP_CONJOINT_DST:
+	return mult_chan (src, dst, 0.0, 1.0);
+
+    case PIXMAN_OP_OVER:
+	return mult_chan (src, dst, 1.0, 1.0 - srca);
+
+    case PIXMAN_OP_OVER_REVERSE:
+	return mult_chan (src, dst, 1.0 - dsta, 1.0);
+
+    case PIXMAN_OP_IN:
+	return mult_chan (src, dst, dsta, 0.0);
+
+    case PIXMAN_OP_IN_REVERSE:
+	return mult_chan (src, dst, 0.0, srca);
+
+    case PIXMAN_OP_OUT:
+	return mult_chan (src, dst, 1.0 - dsta, 0.0);
+
+    case PIXMAN_OP_OUT_REVERSE:
+	return mult_chan (src, dst, 0.0, 1.0 - srca);
+
+    case PIXMAN_OP_ATOP:
+	return mult_chan (src, dst, dsta, 1.0 - srca);
+
+    case PIXMAN_OP_ATOP_REVERSE:
+	return mult_chan (src, dst, 1.0 - dsta,  srca);
+
+    case PIXMAN_OP_XOR:
+	return mult_chan (src, dst, 1.0 - dsta, 1.0 - srca);
+
+    case PIXMAN_OP_ADD:
+	return mult_chan (src, dst, 1.0, 1.0);
+
+    case PIXMAN_OP_SATURATE:
+    case PIXMAN_OP_DISJOINT_OVER_REVERSE:
+	if (srca == 0.0)
+	    Fa = 1.0;
+	else
+	    Fa = min (1.0, (1.0 - dsta) / srca);
+	return mult_chan (src, dst, Fa, 1.0);
+
+    case PIXMAN_OP_DISJOINT_OVER:
+	if (dsta == 0.0)
+	    Fb = 1.0;
+	else
+	    Fb = min (1.0, (1.0 - srca) / dsta);
+	return mult_chan (src, dst, 1.0, Fb);
+
+    case PIXMAN_OP_DISJOINT_IN:
+	if (srca == 0.0)
+	    Fa = 0.0;
+	else
+	    Fa = max (0.0, 1.0 - (1.0 - dsta) / srca);
+	return mult_chan (src, dst, Fa, 0.0);
+
+    case PIXMAN_OP_DISJOINT_IN_REVERSE:
+	if (dsta == 0.0)
+	    Fb = 0.0;
+	else
+	    Fb = max (0.0, 1.0 - (1.0 - srca) / dsta);
+	return mult_chan (src, dst, 0.0, Fb);
+
+    case PIXMAN_OP_DISJOINT_OUT:
+	if (srca == 0.0)
+	    Fa = 1.0;
+	else
+	    Fa = min (1.0, (1.0 - dsta) / srca);
+	return mult_chan (src, dst, Fa, 0.0);
+
+    case PIXMAN_OP_DISJOINT_OUT_REVERSE:
+	if (dsta == 0.0)
+	    Fb = 1.0;
+	else
+	    Fb = min (1.0, (1.0 - srca) / dsta);
+	return mult_chan (src, dst, 0.0, Fb);
+
+    case PIXMAN_OP_DISJOINT_ATOP:
+	if (srca == 0.0)
+	    Fa = 0.0;
+	else
+	    Fa = max (0.0, 1.0 - (1.0 - dsta) / srca);
+	if (dsta == 0.0)
+	    Fb = 1.0;
+	else
+	    Fb = min (1.0, (1.0 - srca) / dsta);
+	return mult_chan (src, dst, Fa, Fb);
+
+    case PIXMAN_OP_DISJOINT_ATOP_REVERSE:
+	if (srca == 0.0)
+	    Fa = 1.0;
+	else
+	    Fa = min (1.0, (1.0 - dsta) / srca);
+	if (dsta == 0.0)
+	    Fb = 0.0;
+	else
+	    Fb = max (0.0, 1.0 - (1.0 - srca) / dsta);
+	return mult_chan (src, dst, Fa, Fb);
+
+    case PIXMAN_OP_DISJOINT_XOR:
+	if (srca == 0.0)
+	    Fa = 1.0;
+	else
+	    Fa = min (1.0, (1.0 - dsta) / srca);
+	if (dsta == 0.0)
+	    Fb = 1.0;
+	else
+	    Fb = min (1.0, (1.0 - srca) / dsta);
+	return mult_chan (src, dst, Fa, Fb);
+
+    case PIXMAN_OP_CONJOINT_OVER:
+	if (dsta == 0.0)
+	    Fb = 0.0;
+	else
+	    Fb = max (0.0, 1.0 - srca / dsta);
+	return mult_chan (src, dst, 1.0, Fb);
+
+    case PIXMAN_OP_CONJOINT_OVER_REVERSE:
+	if (srca == 0.0)
+	    Fa = 0.0;
+	else
+	    Fa = max (0.0, 1.0 - dsta / srca);
+	return mult_chan (src, dst, Fa, 1.0);
+
+    case PIXMAN_OP_CONJOINT_IN:
+	if (srca == 0.0)
+	    Fa = 1.0;
+	else
+	    Fa = min (1.0, dsta / srca);
+	return mult_chan (src, dst, Fa, 0.0);
+
+    case PIXMAN_OP_CONJOINT_IN_REVERSE:
+	if (dsta == 0.0)
+	    Fb = 1.0;
+	else
+	    Fb = min (1.0, srca / dsta);
+	return mult_chan (src, dst, 0.0, Fb);
+
+    case PIXMAN_OP_CONJOINT_OUT:
+	if (srca == 0.0)
+	    Fa = 0.0;
+	else
+	    Fa = max (0.0, 1.0 - dsta / srca);
+	return mult_chan (src, dst, Fa, 0.0);
+
+    case PIXMAN_OP_CONJOINT_OUT_REVERSE:
+	if (dsta == 0.0)
+	    Fb = 0.0;
+	else
+	    Fb = max (0.0, 1.0 - srca / dsta);
+	return mult_chan (src, dst, 0.0, Fb);
+
+    case PIXMAN_OP_CONJOINT_ATOP:
+	if (srca == 0.0)
+	    Fa = 1.0;
+	else
+	    Fa = min (1.0, dsta / srca);
+	if (dsta == 0.0)
+	    Fb = 0.0;
+	else
+	    Fb = max (0.0, 1.0 - srca / dsta);
+	return mult_chan (src, dst, Fa, Fb);
+
+    case PIXMAN_OP_CONJOINT_ATOP_REVERSE:
+	if (srca == 0.0)
+	    Fa = 0.0;
+	else
+	    Fa = max (0.0, 1.0 - dsta / srca);
+	if (dsta == 0.0)
+	    Fb = 1.0;
+	else
+	    Fb = min (1.0, srca / dsta);
+	return mult_chan (src, dst, Fa, Fb);
+
+    case PIXMAN_OP_CONJOINT_XOR:
+	if (srca == 0.0)
+	    Fa = 0.0;
+	else
+	    Fa = max (0.0, 1.0 - dsta / srca);
+	if (dsta == 0.0)
+	    Fb = 0.0;
+	else
+	    Fb = max (0.0, 1.0 - srca / dsta);
+	return mult_chan (src, dst, Fa, Fb);
+
+    default:
+	abort();
+    }
+#undef mult_chan
+}
+
+static void
+do_composite (pixman_op_t op,
+	      const struct color *src,
+	      const struct color *mask,
+	      const struct color *dst,
+	      struct color *result,
+	      pixman_bool_t componentAlpha)
+{
+    struct color srcval, srcalpha;
+
+    if (mask == NULL) {
+	srcval = *src;
+
+	srcalpha.r = src->a;
+	srcalpha.g = src->a;
+	srcalpha.b = src->a;
+	srcalpha.a = src->a;
+    } else if (componentAlpha) {
+	srcval.r = src->r * mask->r;
+	srcval.g = src->g * mask->g;
+	srcval.b = src->b * mask->b;
+	srcval.a = src->a * mask->a;
+
+	srcalpha.r = src->a * mask->r;
+	srcalpha.g = src->a * mask->g;
+	srcalpha.b = src->a * mask->b;
+	srcalpha.a = src->a * mask->a;
+    } else {
+	srcval.r = src->r * mask->a;
+	srcval.g = src->g * mask->a;
+	srcval.b = src->b * mask->a;
+	srcval.a = src->a * mask->a;
+
+	srcalpha.r = src->a * mask->a;
+	srcalpha.g = src->a * mask->a;
+	srcalpha.b = src->a * mask->a;
+	srcalpha.a = src->a * mask->a;
+    }
+
+    result->r = calc_op (op, srcval.r, dst->r, srcalpha.r, dst->a);
+    result->g = calc_op (op, srcval.g, dst->g, srcalpha.g, dst->a);
+    result->b = calc_op (op, srcval.b, dst->b, srcalpha.b, dst->a);
+    result->a = calc_op (op, srcval.a, dst->a, srcalpha.a, dst->a);
+}
+
+static void
+color_correct (pixman_format_code_t format,
+	       struct color *color)
+{
+#define round_pix(pix, mask) \
+    ((int)((pix) * (mask) + .5) / (double) (mask))
+
+    if (PIXMAN_FORMAT_R (format) == 0) {
+	color->r = 0.0;
+	color->g = 0.0;
+	color->b = 0.0;
+    } else {
+	color->r = round_pix (color->r, PIXMAN_FORMAT_R (format));
+	color->g = round_pix (color->g, PIXMAN_FORMAT_G (format));
+	color->b = round_pix (color->b, PIXMAN_FORMAT_B (format));
+    }
+
+    if (PIXMAN_FORMAT_A (format) == 0)
+	color->a = 1.0;
+    else
+	color->a = round_pix (color->a, PIXMAN_FORMAT_A (format));
+
+#undef round_pix
+}
+
+static void
+get_pixel (pixman_image_t *image,
+	   pixman_format_code_t format,
+	   struct color *color)
+{
+#define MASK(N) ((1UL << (N))-1)
+
+    unsigned long rs, gs, bs, as;
+    int a, r, g, b;
+    unsigned long val;
+
+    val = *(unsigned long *) pixman_image_get_data (image);
+
+    /* Number of bits in each channel */
+    a = PIXMAN_FORMAT_A (format);
+    r = PIXMAN_FORMAT_R (format);
+    g = PIXMAN_FORMAT_G (format);
+    b = PIXMAN_FORMAT_B (format);
+
+    switch (PIXMAN_FORMAT_TYPE (format)) {
+    case PIXMAN_TYPE_ARGB:
+        bs = 0;
+        gs = b + bs;
+        rs = g + gs;
+        as = r + rs;
+	break;
+
+    case PIXMAN_TYPE_ABGR:
+        rs = 0;
+        gs = r + rs;
+        bs = g + gs;
+        as = b + bs;
+	break;
+
+    case PIXMAN_TYPE_BGRA:
+        as = 0;
+	rs = PIXMAN_FORMAT_BPP (format) - (b + g + r);
+        gs = r + rs;
+        bs = g + gs;
+	break;
+
+    case PIXMAN_TYPE_A:
+        as = 0;
+        rs = 0;
+        gs = 0;
+        bs = 0;
+	break;
+
+    case PIXMAN_TYPE_OTHER:
+    case PIXMAN_TYPE_COLOR:
+    case PIXMAN_TYPE_GRAY:
+    case PIXMAN_TYPE_YUY2:
+    case PIXMAN_TYPE_YV12:
+    default:
+	abort ();
+        as = 0;
+        rs = 0;
+        gs = 0;
+        bs = 0;
+	break;
+    }
+
+    if (MASK (a) != 0)
+	color->a = ((val >> as) & MASK (a)) / (double) MASK (a);
+    else
+	color->a = 1.0;
+
+    if (MASK (r) != 0) {
+	color->r = ((val >> rs) & MASK (r)) / (double) MASK (r);
+	color->g = ((val >> gs) & MASK (g)) / (double) MASK (g);
+	color->b = ((val >> bs) & MASK (b)) / (double) MASK (b);
+    } else {
+	color->r = 0.0;
+	color->g = 0.0;
+	color->b = 0.0;
+    }
+
+#undef MASK
+}
+
+static double
+eval_diff (struct color *expected, struct color *test)
+{
+    double rscale, gscale, bscale, ascale;
+    double rdiff, gdiff, bdiff, adiff;
+
+    /* XXX: Need to be provided mask shifts so we can produce useful error
+     * values.
+     */
+    rscale = 1.0 * (1 << 5);
+    gscale = 1.0 * (1 << 6);
+    bscale = 1.0 * (1 << 5);
+    ascale = 1.0 * 32;
+
+    rdiff = fabs (test->r - expected->r) * rscale;
+    bdiff = fabs (test->g - expected->g) * gscale;
+    gdiff = fabs (test->b - expected->b) * bscale;
+    adiff = fabs (test->a - expected->a) * ascale;
+
+    return max (max (max (rdiff, gdiff), bdiff), adiff);
+}
+
+static char *
+describe_image (struct image *info, char *buf, int buflen)
+{
+    if (info->size) {
+	snprintf (buf, buflen, "%s %dx%d",
+		  info->format->name,
+		  info->size, info->size);
+    } else {
+	snprintf (buf, buflen, "solid");
+    }
+
+    return buf;
+}
+
+/* Test a composite of a given operation, source, mask, and destination picture.
+ * Fills the window, and samples from the 0,0 pixel corner.
+ */
+static pixman_bool_t
+composite_test (struct image *dst,
+		const struct operator *op,
+		struct image *src,
+		struct image *mask,
+		pixman_bool_t componentAlpha)
+{
+    pixman_color_t fill;
+    pixman_rectangle16_t rect;
+    struct color expected, result, tdst, tsrc, tmsk;
+    double diff;
+    pixman_bool_t success = TRUE;
+
+    compute_pixman_color (dst->color, &fill);
+    rect.x = rect.y = 0;
+    rect.width = rect.height = dst->size;
+    pixman_image_fill_rectangles (PIXMAN_OP_SRC, dst->image,
+				  &fill, 1, &rect);
+
+    if (mask != NULL) {
+	pixman_image_set_component_alpha (mask->image, componentAlpha);
+	pixman_image_composite (op->op, src->image, mask->image, dst->image,
+				0, 0,
+				0, 0,
+				0, 0,
+				dst->size, dst->size);
+
+	tmsk = *mask->color;
+	if (mask->size) {
+	    color_correct (mask->format->format, &tmsk);
+	    if (componentAlpha &&
+		PIXMAN_FORMAT_R (mask->format->format) == 0)
+	    {
+		/* Ax component-alpha masks expand alpha into all color channels. */
+		tmsk.r = tmsk.g = tmsk.b = tmsk.a;
+	    }
+	}
+    } else {
+	pixman_image_composite (op->op, src->image, NULL, dst->image,
+				0, 0,
+				0, 0,
+				0, 0,
+				dst->size, dst->size);
+    }
+    get_pixel (dst->image, dst->format->format, &result);
+
+    tdst = *dst->color;
+    color_correct (dst->format->format, &tdst);
+    tsrc = *src->color;
+    if (src->size)
+	color_correct (src->format->format, &tsrc);
+    do_composite (op->op, &tsrc, mask ? &tmsk : NULL, &tdst,
+		  &expected, componentAlpha);
+    color_correct (dst->format->format, &expected);
+
+    diff = eval_diff (&expected, &result);
+    if (diff > 3.0) {
+	char buf[40];
+
+	snprintf (buf, sizeof (buf),
+		  "%s %scomposite",
+		  op->name,
+		  componentAlpha ? "CA " : "");
+
+	printf("%s test error of %.4f --\n"
+	       "           R    G    B    A\n"
+	       "got:       %.2f %.2f %.2f %.2f [%08lx]\n"
+	       "expected:  %.2f %.2f %.2f %.2f\n",
+	       buf, diff,
+	       result.r, result.g, result.b, result.a,
+	       *(unsigned long *) pixman_image_get_data (dst->image),
+	       expected.r, expected.g, expected.b, expected.a);
+
+	if (mask != NULL) {
+	    printf("src color: %.2f %.2f %.2f %.2f\n"
+		   "msk color: %.2f %.2f %.2f %.2f\n"
+		   "dst color: %.2f %.2f %.2f %.2f\n",
+		   src->color->r, src->color->g,
+		   src->color->b, src->color->a,
+		   mask->color->r, mask->color->g,
+		   mask->color->b, mask->color->a,
+		   dst->color->r, dst->color->g,
+		   dst->color->b, dst->color->a);
+	    printf ("src: %s, ", describe_image (src, buf, sizeof (buf)));
+	    printf ("mask: %s, ", describe_image (mask, buf, sizeof (buf)));
+	    printf ("dst: %s\n\n", describe_image (dst, buf, sizeof (buf)));
+	} else {
+	    printf("src color: %.2f %.2f %.2f %.2f\n"
+		   "dst color: %.2f %.2f %.2f %.2f\n",
+		   src->color->r, src->color->g,
+		   src->color->b, src->color->a,
+		   dst->color->r, dst->color->g,
+		   dst->color->b, dst->color->a);
+	    printf ("src: %s, ", describe_image (src, buf, sizeof (buf)));
+	    printf ("dst: %s\n\n", describe_image (dst, buf, sizeof (buf)));
+	}
+
+	success = FALSE;
+    }
+
+    return success;
+}
+
+static void
+image_init (struct image *info,
+	    int color,
+	    int format,
+	    int size)
+{
+    pixman_color_t fill;
+
+    info->color = &colors[color];
+    compute_pixman_color (info->color, &fill);
+
+    info->format = &formats[format];
+    if (size) {
+	pixman_rectangle16_t rect;
+
+	info->image = pixman_image_create_bits (info->format->format,
+						size, size, NULL, 0);
+
+	rect.x = rect.y = 0;
+	rect.width = rect.height = size;
+	pixman_image_fill_rectangles (PIXMAN_OP_SRC, info->image, &fill,
+				      1, &rect);
+    } else {
+	info->image = pixman_image_create_solid_fill (&fill);
+    }
+
+    info->size = size;
+}
+
+static void
+image_fini (struct image *info)
+{
+    pixman_image_unref (info->image);
+}
+
+int
+main (void)
+{
+    pixman_bool_t ok, group_ok = TRUE, ca;
+    int i, d, m, s;
+    int tests_passed = 0, tests_total = 0;
+    int sizes[] = { 1, 10 };
+    int num_tests;
+
+    for (i = 0; i < ARRAY_LENGTH (colors); i++) {
+	colors[i].r *= colors[i].a;
+	colors[i].g *= colors[i].a;
+	colors[i].b *= colors[i].a;
+    }
+
+    num_tests = ARRAY_LENGTH (colors) * ARRAY_LENGTH (formats);
+
+    for (d = 0; d < num_tests; d++) {
+	struct image dst;
+
+	image_init (&dst,
+		    d / ARRAY_LENGTH (formats),
+		    d % ARRAY_LENGTH (formats),
+		    1);
+
+
+	for (s = -ARRAY_LENGTH (colors); s < ARRAY_LENGTH (sizes) * num_tests; s++) {
+	    struct image src;
+
+	    if (s < 0) {
+		image_init (&src, -s - 1, 0, 0);
+	    } else {
+		image_init (&src,
+			    s / ARRAY_LENGTH (sizes) / ARRAY_LENGTH (formats),
+			    s / ARRAY_LENGTH (sizes) % ARRAY_LENGTH (formats),
+			    sizes[s % ARRAY_LENGTH (sizes)]);
+	    }
+
+	    for (m = -ARRAY_LENGTH (colors); m < ARRAY_LENGTH (sizes) * num_tests; m++) {
+		struct image mask;
+
+		if (m < 0) {
+		    image_init (&mask, -m - 1, 0, 0);
+		} else {
+		    image_init (&mask,
+				m / ARRAY_LENGTH (sizes) / ARRAY_LENGTH (formats),
+				m / ARRAY_LENGTH (sizes) % ARRAY_LENGTH (formats),
+				sizes[m % ARRAY_LENGTH (sizes)]);
+		}
+
+		for (ca = -1; ca <= 1; ca++) {
+		    for (i = 0; i < ARRAY_LENGTH (operators); i++) {
+			const struct operator *op = &operators[i];
+
+			switch (ca) {
+			case -1:
+			    ok = composite_test (&dst, op, &src, NULL, ca);
+			    break;
+			default:
+			    ok = composite_test (&dst, op, &src, &mask, ca);
+			    break;
+			}
+			group_ok = group_ok && ok;
+			tests_passed += ok;
+			tests_total++;
+		    }
+		}
+
+		image_fini (&mask);
+	    }
+	    image_fini (&src);
+	}
+	image_fini (&dst);
+    }
+
+    return group_ok == FALSE;
+}
commit cda0ee5165812b86a052ceb01830a1d42d02a03b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Aug 27 09:19:14 2009 +0100

    build: Suppress verbose compile lines
    
    Compile warnings are being lost in the sea of noise. Automake-1.11 finally
    introduced AM_SILENT_RULES to suppress the echoing of the compile line for
    every object. Enable this to bring sanity to the pixman build.

diff --git a/configure.ac b/configure.ac
index 65dea52..f09006f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -61,6 +61,9 @@ m4_define([pixman_version],[pixman_major.pixman_minor.pixman_micro])
 AC_INIT(pixman, pixman_version, "sandmann at daimi.au.dk", pixman)
 AM_INIT_AUTOMAKE([dist-bzip2])
 
+# Suppress verbose compile lines
+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
+
 AM_CONFIG_HEADER(config.h)
 
 AC_CANONICAL_HOST
commit 56cc06f89b7db733e5036a00df7aea27cf8d0951
Merge: 8aff99e... 8035df8...
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Sep 13 16:32:27 2009 +0100

    Merge branch '0.16'
    
    Conflicts:
    	configure.ac
    	pixman/pixman-sse2.c

diff --cc pixman/pixman-sse2.c
index e9cdf9e,bb74882..9104e8d
--- a/pixman/pixman-sse2.c
+++ b/pixman/pixman-sse2.c
@@@ -5595,7 -5604,10 +5595,7 @@@ static const pixman_fast_path_t sse2_fa
 -#if 0
 -    /* FIXME: This code are buggy in MMX version, now the bug was translated to SSE2 version */
      { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8,       PIXMAN_x8r8g8b8, sse2_composite_over_x888_8_8888,    0 },
      { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8,       PIXMAN_a8r8g8b8, sse2_composite_over_x888_8_8888,    0 },
      { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8,       PIXMAN_x8b8g8r8, sse2_composite_over_x888_8_8888,    0 },
-     { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8,       PIXMAN_a8r8g8b8, sse2_composite_over_x888_8_8888,    0 },
+     { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8,       PIXMAN_a8b8g8r8, sse2_composite_over_x888_8_8888,    0 },
 -#endif
      { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8,       PIXMAN_a8r8g8b8, sse2_composite_over_x888_n_8888,    NEED_SOLID_MASK },
      { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8,       PIXMAN_x8r8g8b8, sse2_composite_over_x888_n_8888,    NEED_SOLID_MASK },
      { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8,       PIXMAN_a8b8g8r8, sse2_composite_over_x888_n_8888,    NEED_SOLID_MASK },
commit 8035df8bcb01c2df42b8adf8b96c7ac796f384cc
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Aug 16 12:16:46 2009 +0100

    Remove duplicated declaration
    
    The pixman_tranform_pixman_f_transform() declaration is repeated 4 lines
    down.

diff --git a/pixman/pixman.h b/pixman/pixman.h
index 969d427..5b90a0c 100644
--- a/pixman/pixman.h
+++ b/pixman/pixman.h
@@ -222,8 +222,6 @@ pixman_bool_t pixman_transform_from_pixman_f_transform (struct pixman_transform
 							const struct pixman_f_transform *ft);
 void          pixman_f_transform_from_pixman_transform (struct pixman_f_transform       *ft,
 							const struct pixman_transform   *t);
-pixman_bool_t pixman_transform_from_pixman_f_transform (struct pixman_transform         *t,
-							const struct pixman_f_transform *ft);
 pixman_bool_t pixman_f_transform_invert                (struct pixman_f_transform       *dst,
 							const struct pixman_f_transform *src);
 pixman_bool_t pixman_f_transform_point                 (const struct pixman_f_transform *t,
commit 29e22cf38e8abc54b9dddbdeb3909d02866a82a0
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Sep 13 16:26:29 2009 +0100

    Enable component alpha on solid masks.

diff --git a/pixman/pixman-general.c b/pixman/pixman-general.c
index 3ead3da..5c40103 100644
--- a/pixman/pixman-general.c
+++ b/pixman/pixman-general.c
@@ -159,9 +159,9 @@ general_composite_rect  (pixman_implementation_t *imp,
         fetch_src                       &&
         fetch_mask                      &&
         mask                            &&
-        mask->common.type == BITS       &&
-        mask->common.component_alpha    &&
-        PIXMAN_FORMAT_RGB (mask->bits.format);
+        mask->common.component_alpha	&&
+        (mask->common.type == SOLID ||
+	 (mask->common.type == BITS && PIXMAN_FORMAT_RGB (mask->bits.format)));
 
     if (wide)
     {
commit 9fe2628702785e8db45593709c0aec54043a50e7
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Sep 13 16:26:52 2009 +0100

    [sse2] Bit-reversing typo: src != dst

diff --git a/pixman/pixman-sse2.c b/pixman/pixman-sse2.c
index a5fcf21..bb74882 100644
--- a/pixman/pixman-sse2.c
+++ b/pixman/pixman-sse2.c
@@ -5606,7 +5606,7 @@ static const pixman_fast_path_t sse2_fast_paths[] =
     { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8,       PIXMAN_x8r8g8b8, sse2_composite_over_x888_8_8888,    0 },
     { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8,       PIXMAN_a8r8g8b8, sse2_composite_over_x888_8_8888,    0 },
     { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8,       PIXMAN_x8b8g8r8, sse2_composite_over_x888_8_8888,    0 },
-    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8,       PIXMAN_a8r8g8b8, sse2_composite_over_x888_8_8888,    0 },
+    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8,       PIXMAN_a8b8g8r8, sse2_composite_over_x888_8_8888,    0 },
 #endif
     { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8,       PIXMAN_a8r8g8b8, sse2_composite_over_x888_n_8888,    NEED_SOLID_MASK },
     { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8,       PIXMAN_x8r8g8b8, sse2_composite_over_x888_n_8888,    NEED_SOLID_MASK },
commit 2186bc89486f9f11161b0db280a869c6849c867e
Author: Siarhei Siamashka <siarhei.siamashka at nokia.com>
Date:   Fri Sep 4 14:14:00 2009 +0300

    Change CFLAGS order for PPC and ARM configure tests
    
    CFLAGS are always appended to the end of gcc options when compiling
    sources in autotools based projects. Configure tests should do the
    same. Otherwise build fails on PPC when using CFLAGS="-O2 -mno-altivec"
    for example. Similar problem affects ARM.

diff --git a/configure.ac b/configure.ac
index 061a380..fbc73f6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -318,7 +318,7 @@ fi
 have_vmx_intrinsics=no
 AC_MSG_CHECKING(whether to use VMX/Altivec intrinsics)
 xserver_save_CFLAGS=$CFLAGS
-CFLAGS="$CFLAGS $VMX_CFLAGS"
+CFLAGS="$VMX_CFLAGS $CFLAGS"
 AC_COMPILE_IFELSE([
 #if defined(__GNUC__) && (__GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4))
 error "Need GCC >= 3.4 for sane altivec support"
@@ -362,7 +362,7 @@ ARM_SIMD_CFLAGS="-mcpu=arm1136j-s"
 have_arm_simd=no
 AC_MSG_CHECKING(whether to use ARM SIMD assembler)
 xserver_save_CFLAGS=$CFLAGS
-CFLAGS="$CFLAGS $ARM_SIMD_CFLAGS"
+CFLAGS="$ARM_SIMD_CFLAGS $CFLAGS"
 AC_COMPILE_IFELSE([
 int main () {
     asm("uqadd8 r1, r1, r2");
@@ -401,7 +401,7 @@ ARM_NEON_CFLAGS="-mfpu=neon -mcpu=cortex-a8"
 have_arm_neon=no
 AC_MSG_CHECKING(whether to use ARM NEON)
 xserver_save_CFLAGS=$CFLAGS
-CFLAGS="$CFLAGS $ARM_NEON_CFLAGS"
+CFLAGS="$ARM_NEON_CFLAGS $CFLAGS"
 AC_COMPILE_IFELSE([
 #include <arm_neon.h>
 int main () {
commit 15304e3cddd6568ba6d5d1d3030568c3db7b05cc
Author: Siarhei Siamashka <siarhei.siamashka at nokia.com>
Date:   Wed Sep 2 19:46:47 2009 +0300

    ARM: Remove fallback to ARMv6 implementation from NEON delegate chain
    
    This can help to fix build problems with '-mthumb' gcc option in CFLAGS.
    ARMv6 optimized code can't be compiled for thumb (because of its inline
    assembly) and gets automatically disabled in configure. Reference
    to it from NEON optimized code resulted in linking problems.
    
    Every ARMv6 optimized fast path function also has a better NEON
    counterpart, so there is no need to fallback to ARMv6. Shorter
    delegate chain should additionally result in a bit better performance.

diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c
index 3e7f566..8a2d72e 100644
--- a/pixman/pixman-arm-neon.c
+++ b/pixman/pixman-arm-neon.c
@@ -2767,8 +2767,8 @@ arm_neon_fill (pixman_implementation_t *imp,
 pixman_implementation_t *
 _pixman_implementation_create_arm_neon (void)
 {
-    pixman_implementation_t *simd = _pixman_implementation_create_arm_simd ();
-    pixman_implementation_t *imp = _pixman_implementation_create (simd);
+    pixman_implementation_t *general = _pixman_implementation_create_fast_path ();
+    pixman_implementation_t *imp = _pixman_implementation_create (general);
 
     imp->composite = arm_neon_composite;
 #if 0 /* this code has some bugs */
commit 61b616067c3e8b2ff84fbf57f479a90cc9fa5344
Author: M Joonas Pihlaja <jpihlaja at cc.helsinki.fi>
Date:   Mon Aug 31 23:02:53 2009 +0100

    Default to optimised builds when using a Sun Studio compiler.
    
    Autoconf's AC_PROG_CC sets the default CFLAGS to -O2 -g for
    gcc and -g for every other compiler.  This patch defaults
    CFLAGS to the equivalent -O -g when we're using Sun Studio's cc
    if the user or site admin hasn't already set CFLAGS.

diff --git a/configure.ac b/configure.ac
index 02f8057..061a380 100644
--- a/configure.ac
+++ b/configure.ac
@@ -65,6 +65,8 @@ AM_CONFIG_HEADER(config.h)
 
 AC_CANONICAL_HOST
 
+test_CFLAGS=${CFLAGS+set} # We may override autoconf default CFLAGS.
+
 AC_PROG_CC
 AC_PROG_LIBTOOL
 AC_CHECK_FUNCS([getisax])
@@ -75,6 +77,16 @@ AC_C_INLINE
 AC_CHECK_DECL([__SUNPRO_C], [SUNCC="yes"], [SUNCC="no"])
 AC_CHECK_DECL([__amd64], [AMD64_ABI="yes"], [AMD64_ABI="no"])
 
+# Default CFLAGS to -O -g rather than just the -g from AC_PROG_CC
+# if we're using Sun Studio and neither the user nor a config.site
+# has set CFLAGS.
+if test $SUNCC = yes &&			\
+   test "$test_CFLAGS" == "" &&		\
+   test "$CFLAGS" = "-g"
+then
+  CFLAGS="-O -g"
+fi
+
 # 
 # We ignore pixman_major in the version here because the major version should
 # always be encoded in the actual library name. Ie., the soname is:
commit 20acda6fde8441e18aab33980a33b099a16063eb
Author: M Joonas Pihlaja <jpihlaja at cc.helsinki.fi>
Date:   Mon Aug 31 20:27:32 2009 +0100

    Work around a Sun Studio 12 code generation bug involving _mm_set_epi32().
    
    Calling a static function wrapper around _mm_set_epi32() when not
    using optimisation causes Sun Studio 12's cc to emit a spurious
    floating point load which confuses the assembler.  Using a macro wrapper
    rather than a function steps around the problem.

diff --git a/pixman/pixman-sse2.c b/pixman/pixman-sse2.c
index 1d4f02b..a5fcf21 100644
--- a/pixman/pixman-sse2.c
+++ b/pixman/pixman-sse2.c
@@ -2628,12 +2628,18 @@ create_mask_2x32_64 (uint32_t mask0,
     return _mm_set_pi32 (mask0, mask1);
 }
 
+/* Work around a code generation bug in Sun Studio 12. */
+#if defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)
+# define create_mask_2x32_128(mask0, mask1) \
+	(_mm_set_epi32 ((mask0), (mask1), (mask0), (mask1)))
+#else
 static force_inline __m128i
 create_mask_2x32_128 (uint32_t mask0,
                       uint32_t mask1)
 {
     return _mm_set_epi32 (mask0, mask1, mask0, mask1);
 }
+#endif
 
 /* SSE2 code patch for fbcompose.c */
 
commit e30c0037d44bf76a26182080be24c7037d7be5b5
Author: M Joonas Pihlaja <jpihlaja at cc.helsinki.fi>
Date:   Mon Aug 31 20:24:04 2009 +0100

    Work around differing _mm_prefetch() prototypes on Solaris.
    
    Sun Studio 12 expects the address to prefetch to be
    a const char pointer rather than a __m128i pointer or
    void pointer.

diff --git a/pixman/pixman-sse2.c b/pixman/pixman-sse2.c
index 727ad42..1d4f02b 100644
--- a/pixman/pixman-sse2.c
+++ b/pixman/pixman-sse2.c
@@ -359,13 +359,13 @@ in_over_2x128 (__m128i* src_lo,
 static force_inline void
 cache_prefetch (__m128i* addr)
 {
-    _mm_prefetch (addr, _MM_HINT_T0);
+    _mm_prefetch ((void const*)addr, _MM_HINT_T0);
 }
 
 static force_inline void
 cache_prefetch_next (__m128i* addr)
 {
-    _mm_prefetch (addr + 4, _MM_HINT_T0); /* 64 bytes ahead */
+    _mm_prefetch ((void const *)(addr + 4), _MM_HINT_T0); /* 64 bytes ahead */
 }
 
 /* load 4 pixels from a 16-byte boundary aligned address */
commit 698b686d58c510e1b8a9183750d00cbd9ed504b2
Author: Siarhei Siamashka <siarhei.siamashka at nokia.com>
Date:   Fri Aug 28 22:34:21 2009 +0300

    ARM: workaround for gcc bug in vshll_n_u8 intrinsic
    
    Some versions of gcc (cs2009q1, 4.4.1) incorrectly reject
    shift operand having value >= 8, claiming that it is out of
    range. So inline assembly is used as a workaround.

diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c
index 4125d1b..3e7f566 100644
--- a/pixman/pixman-arm-neon.c
+++ b/pixman/pixman-arm-neon.c
@@ -64,6 +64,12 @@ unpack0565 (uint16x8_t rgb)
     return res;
 }
 
+#ifdef USE_GCC_INLINE_ASM
+/* Some versions of gcc have problems with vshll_n_u8 intrinsic (Bug 23576) */
+#define vshll_n_u8(a, n) ({ uint16x8_t r; \
+    asm ("vshll.u8 %q0, %P1, %2\n" : "=w" (r) : "w" (a), "i" (n)); r; })
+#endif
+
 static force_inline uint16x8_t
 pack0565 (uint8x8x4_t s)
 {
commit b02b644d7017f794be2296c6354e44fd119d2477
Author: Søren Sandmann Pedersen <sandmann at redhat.com>
Date:   Wed Sep 2 16:09:32 2009 -0400

    Set version number to 0.16.1

diff --git a/configure.ac b/configure.ac
index 937fae7..02f8057 100644
--- a/configure.ac
+++ b/configure.ac
@@ -54,7 +54,7 @@ AC_PREREQ([2.57])
 
 m4_define([pixman_major], 0)
 m4_define([pixman_minor], 16)
-m4_define([pixman_micro], 0)
+m4_define([pixman_micro], 1)
 
 m4_define([pixman_version],[pixman_major.pixman_minor.pixman_micro])
 
commit d465f854b3d5f2ffcc122aebfbead2d64cca7169
Author: Makoto Kato <m_kato at ga2.so-net.ne.jp>
Date:   Tue Sep 1 10:59:05 2009 +0900

    Add CPU detection for VC++ x64
    
    VC++ x64 has no inline assembler and x64 mode supports SSE2.
    So, it is unnecessary to call cpuid.

diff --git a/pixman/pixman-cpu.c b/pixman/pixman-cpu.c
index a2a7b8a..5d5469b 100644
--- a/pixman/pixman-cpu.c
+++ b/pixman/pixman-cpu.c
@@ -325,7 +325,7 @@ pixman_have_arm_neon (void)
  * that would lead to SIGILL instructions on old CPUs that don't have
  * it.
  */
-#if !defined(__amd64__) && !defined(__x86_64__)
+#if !defined(__amd64__) && !defined(__x86_64__) && !defined(_M_AMD64)
 
 #ifdef HAVE_GETISAX
 #include <sys/auxv.h>


More information about the xorg-commit mailing list