rendercheck segfaults [Re: rendercheck: 10 commits]

Aaron Plattner aplattner at nvidia.com
Wed Dec 1 13:06:47 PST 2010


This series causes a segmentation fault in blend_test because the loop
at the top of the "while (k < num_dst)" loop doesn't ever increment y
because num_src is 325 and win_height is only 200.  Then, XGetImage
fails because height=0 and it crashes at the bottom of the loop
because it tries to XDestroyImage(NULL).

-- Aaron


On Wed, Dec 01, 2010 at 10:27:36AM -0800, Chris Wilson wrote:
>  doc/TODO        |    3
>  main.c          |    2
>  ops.c           |    8 +
>  rendercheck.h   |   57 ++++++++--
>  t_blend.c       |  133 +++++++++++++++++--------
>  t_composite.c   |  187 ++++++++++++++++++++++-------------
>  t_dstcoords.c   |   16 ++-
>  t_fill.c        |   13 +-
>  t_gradient.c    |    7 -
>  t_repeat.c      |   69 +++++++++----
>  t_srccoords.c   |   14 +-
>  t_triangles.c   |   46 ++++++--
>  t_tsrccoords.c  |   51 +++++----
>  t_tsrccoords2.c |   19 ++-
>  tests.c         |  293 ++++++++++++++++++++++++++++----------------------------
>  15 files changed, 569 insertions(+), 349 deletions(-)
> 
> New commits:
> commit a038220d4aeb3111d34b45d852b97be85a56459d
> Author: Chris Wilson <chris at chris-wilson.co.uk>
> Date:   Wed Dec 1 17:52:01 2010 +0000
> 
>     TODO: Multiple roundtrips for image processing due to get_pixel fixed
> 
>     Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> 
> diff --git a/doc/TODO b/doc/TODO
> index de1787c..34f2e44 100644
> --- a/doc/TODO
> +++ b/doc/TODO
> @@ -3,4 +3,3 @@
>  - Check coordinates for more different transformations
>  - Check source/mask pixels falling outside the drawable.
>  - Check trapezoids!
> -- get_pixel equivalent that doesn't involve round-trips per call.
> commit bf0067692cf961fea6ebbda601f83c1c1960aff4
> Author: Chris Wilson <chris at chris-wilson.co.uk>
> Date:   Wed Dec 1 17:50:07 2010 +0000
> 
>     dstcoords: Sample result using a single GetImage
> 
>     Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> 
> diff --git a/t_dstcoords.c b/t_dstcoords.c
> index ed91ecc..8944dec 100644
> --- a/t_dstcoords.c
> +++ b/t_dstcoords.c
> @@ -38,6 +38,7 @@ dstcoords_test(Display *dpy, picture_info *win, int op, picture_info *dst,
>      picture_info *bg, picture_info *fg)
>  {
>         color4d expected, tested;
> +       XImage *image;
>         int x, y, i;
>         Bool failed = FALSE;
> 
> @@ -50,9 +51,13 @@ dstcoords_test(Display *dpy, picture_info *win, int op, picture_info *dst,
> 
>         copy_pict_to_win(dpy, dst, win, TEST_WIDTH, TEST_HEIGHT);
> 
> +       image = XGetImage(dpy, dst->d,
> +                         0, 0, 5, 5,
> +                         ~0U, ZPixmap);
> +
>         for (x = 0; x < 5; x++) {
>                 for (y = 0; y < 5; y++) {
> -                       get_pixel(dpy, dst, x, y, &tested);
> +                       get_pixel_from_image(image, dst, x, y, &tested);
>                         if ((x >= 1 && x <= 3) && (y >= 1 && y <= 3))
>                                 expected = fg->color;
>                         else
> @@ -68,5 +73,7 @@ dstcoords_test(Display *dpy, picture_info *win, int op, picture_info *dst,
>                 }
>         }
> 
> +       XDestroyImage(image);
> +
>         return !failed;
>  }
> commit e70fb7146dc18adcd38dd58adfb861a2a432ce64
> Author: Chris Wilson <chris at chris-wilson.co.uk>
> Date:   Wed Dec 1 17:46:39 2010 +0000
> 
>     tsrcoords2: Sample result using a single GetImage
> 
>     Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> 
> diff --git a/t_tsrccoords2.c b/t_tsrccoords2.c
> index 89e92b1..4449dca 100644
> --- a/t_tsrccoords2.c
> +++ b/t_tsrccoords2.c
> @@ -81,6 +81,7 @@ trans_srccoords_test_2(Display *dpy, picture_info *win, picture_info *white,
>         int tested_colors[5][5];
>         picture_info *src;
>         XTransform t;
> +       XImage *image;
> 
>         src = create_target_picture(dpy);
>         if (src == NULL) {
> @@ -120,10 +121,14 @@ trans_srccoords_test_2(Display *dpy, picture_info *win, picture_info *white,
>                     &pa);
>         }
> 
> +       image = XGetImage(dpy, win->d,
> +                         0, 0, 5, 5,
> +                         0xffffffff, ZPixmap);
> +
>         for (i = 0; i < 25; i++) {
>                 int x = i % 5, y = i / 5, srcx, srcy;
> 
> -               get_pixel(dpy, win, x, y, &tested);
> +               get_pixel_from_image(image, win, x, y, &tested);
> 
>                 /* Map from our destination coordinates to where they are
>                  * in the source picture.  Rotate right.
> @@ -166,6 +171,7 @@ trans_srccoords_test_2(Display *dpy, picture_info *win, picture_info *white,
>                 }
>         }
> 
> +       XDestroyImage(image);
>         destroy_target_picture(dpy, src);
> 
>         return !failed;
> commit 168830dca2e75e67d448039f3f42a0bad6719147
> Author: Chris Wilson <chris at chris-wilson.co.uk>
> Date:   Wed Dec 1 17:44:41 2010 +0000
> 
>     tsrcoords: Sample result with just a single GetImage
> 
>     ... and whilst we are here make processing the 2D arrays cache friendly.
> 
>     Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> 
> diff --git a/t_tsrccoords.c b/t_tsrccoords.c
> index 63cee4b..124fdc9 100644
> --- a/t_tsrccoords.c
> +++ b/t_tsrccoords.c
> @@ -25,6 +25,9 @@
> 
>  #include "rendercheck.h"
> 
> +#define TEST_WIDTH 40
> +#define TEST_HEIGHT 40
> +
>  static int dot_colors[5][5] = {
>         {7, 7, 7, 7, 7},
>         {7, 7, 7, 7, 7},
> @@ -48,7 +51,7 @@ static picture_info *create_dot_picture(Display *dpy)
>         for (i = 0; i < 25; i++) {
>                 int x = i % 5;
>                 int y = i / 5;
> -               color4d *c = &colors[dot_colors[x][y]];
> +               color4d *c = &colors[dot_colors[y][x]];
> 
>                 argb_fill(dpy, p, x, y, 1, 1, c->a, c->r, c->g, c->b);
>         }
> @@ -79,11 +82,12 @@ trans_coords_test(Display *dpy, picture_info *win, picture_info *white,
>      Bool test_mask)
>  {
>         color4d tested;
> -       int x, y;
>         Bool failed = FALSE;
> -       int tested_colors[40][40], expected_colors[40][40];
> +       int tested_colors[TEST_HEIGHT][TEST_WIDTH], expected_colors[TEST_HEIGHT][TEST_WIDTH];
>         XTransform t;
>         picture_info *src;
> +       XImage *image;
> +       int x, y;
> 
>         src = create_dot_picture(dpy);
>         if (src == NULL) {
> @@ -98,31 +102,35 @@ trans_coords_test(Display *dpy, picture_info *win, picture_info *white,
> 
>         if (!test_mask)
>                 XRenderComposite(dpy, PictOpSrc, src->pict, 0,
> -                   win->pict, 0, 0, 0, 0, 0, 0, 40, 40);
> +                   win->pict, 0, 0, 0, 0, 0, 0, TEST_WIDTH, TEST_HEIGHT);
>         else {
>                 XRenderComposite(dpy, PictOpSrc, white->pict, src->pict,
> -                   win->pict, 0, 0, 0, 0, 0, 0, 40, 40);
> +                   win->pict, 0, 0, 0, 0, 0, 0, TEST_WIDTH, TEST_HEIGHT);
>         }
> 
> -       for (x = 0; x < 40; x++) {
> -           for (y = 0; y < 40; y++) {
> +       image = XGetImage(dpy, win->d,
> +                         0, 0, TEST_WIDTH, TEST_HEIGHT,
> +                         0xffffffff, ZPixmap);
> +
> +       for (y = 0; y < TEST_HEIGHT; y++) {
> +               for (x = 0; x < TEST_WIDTH; x++) {
>                 int src_sample_x, src_sample_y;
> 
>                 src_sample_x = x / 8;
>                 src_sample_y = y / 8;
> -               expected_colors[x][y] = dot_colors[src_sample_x][src_sample_y];
> +               expected_colors[y][x] = dot_colors[src_sample_y][src_sample_x];
> 
> -               get_pixel(dpy, win, x, y, &tested);
> +               get_pixel_from_image(image, win, x, y, &tested);
> 
>                 if (tested.r == 1.0 && tested.g == 1.0 && tested.b == 1.0) {
> -                       tested_colors[x][y] = 0;
> +                       tested_colors[y][x] = 0;
>                 } else if (tested.r == 0.0 && tested.g == 0.0 &&
>                     tested.b == 0.0) {
> -                       tested_colors[x][y] = 7;
> +                       tested_colors[y][x] = 7;
>                 } else {
> -                       tested_colors[x][y] = 9;
> +                       tested_colors[y][x] = 9;
>                 }
> -               if (tested_colors[x][y] != expected_colors[x][y])
> +               if (tested_colors[y][x] != expected_colors[y][x])
>                         failed = TRUE;
>             }
>         }
> @@ -131,21 +139,22 @@ trans_coords_test(Display *dpy, picture_info *win, picture_info *white,
>                 printf("%s transform coordinates test failed.\n",
>                     test_mask ? "mask" : "src");
>                 printf("expected vs tested:\n");
> -               for (y = 0; y < 40; y++) {
> -                       for (x = 0; x < 40; x++)
> -                               printf("%d", expected_colors[x][y]);
> +               for (y = 0; y < TEST_HEIGHT; y++) {
> +                       for (x = 0; x < TEST_WIDTH; x++)
> +                               printf("%d", expected_colors[y][x]);
>                         printf(" ");
> -                       for (x = 0; x < 40; x++)
> -                               printf("%d", tested_colors[x][y]);
> +                       for (x = 0; x < TEST_WIDTH; x++)
> +                               printf("%d", tested_colors[y][x]);
>                         printf("\n");
>                 }
>                 printf(" vs tested (same)\n");
> -               for (y = 0; y < 40; y++) {
> -                       for (x = 0; x < 40; x++)
> -                               printf("%d", tested_colors[x][y]);
> +               for (y = 0; y < TEST_HEIGHT; y++) {
> +                       for (x = 0; x < TEST_WIDTH; x++)
> +                               printf("%d", tested_colors[y][x]);
>                         printf("\n");
>                 }
>         }
> +       XDestroyImage(image);
> 
>         init_transform(&t);
> 
> commit 6fe8d675216524a68894a28a1c335f0ad29239db
> Author: Chris Wilson <chris at chris-wilson.co.uk>
> Date:   Wed Dec 1 17:35:41 2010 +0000
> 
>     triangles: Use a single GetImage call to sample the result
> 
>     Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> 
> diff --git a/t_triangles.c b/t_triangles.c
> index 645f507..207b7b0 100644
> --- a/t_triangles.c
> +++ b/t_triangles.c
> @@ -44,6 +44,7 @@ triangles_test(Display *dpy, picture_info *win, picture_info *dst, int op,
>         color4d tdst, tsrc;
>         int x, y;
>         Bool success = TRUE;
> +       XImage *image;
> 
>         triangles[0].p1.x = XDoubleToFixed(2);
>         triangles[0].p1.y = XDoubleToFixed(2);
> @@ -76,6 +77,10 @@ triangles_test(Display *dpy, picture_info *win, picture_info *dst, int op,
>         do_composite(ops[op].op, &src_color->color, NULL, &tdst, &tsrc, FALSE);
>         color_correct(dst, &tsrc);
> 
> +       image = XGetImage(dpy, dst->d,
> +                         0, 0, 5, 5,
> +                         0xffffffff, ZPixmap);
> +
>         for (x = 0; x < 5; x++) {
>             for (y = 0; y < 5; y++) {
>                 color4d expected, tested;
> @@ -86,7 +91,7 @@ triangles_test(Display *dpy, picture_info *win, picture_info *dst, int op,
>                         expected = tdst;
>                 }
> 
> -               get_pixel(dpy, dst, x, y, &tested);
> +               get_pixel_from_image(image, dst, x, y, &tested);
> 
>                 if (eval_diff(&dst->format->direct, &expected, &tested) > 2.) {
>                     print_fail("triangles", &expected, &tested, x, y,
> @@ -103,6 +108,7 @@ triangles_test(Display *dpy, picture_info *win, picture_info *dst, int op,
>                     dst_color->color.r, dst_color->color.g,
>                     dst_color->color.b, dst_color->color.a);
>         }
> +       XDestroyImage(image);
> 
>         return success;
>  }
> @@ -115,6 +121,7 @@ trifan_test(Display *dpy, picture_info *win, picture_info *dst, int op,
>         color4d tdst, tsrc;
>         int x, y;
>         Bool success = TRUE;
> +       XImage *image;
> 
>         points[0].x = XDoubleToFixed(2);
>         points[0].y = XDoubleToFixed(2);
> @@ -142,6 +149,10 @@ trifan_test(Display *dpy, picture_info *win, picture_info *dst, int op,
>         do_composite(ops[op].op, &src_color->color, NULL, &tdst, &tsrc, FALSE);
>         color_correct(dst, &tsrc);
> 
> +       image = XGetImage(dpy, dst->d,
> +                         0, 0, 5, 5,
> +                         0xffffffff, ZPixmap);
> +
>         for (x = 0; x < 5; x++) {
>             for (y = 0; y < 5; y++) {
>                 color4d expected, tested;
> @@ -152,7 +163,7 @@ trifan_test(Display *dpy, picture_info *win, picture_info *dst, int op,
>                         expected = tdst;
>                 }
> 
> -               get_pixel(dpy, dst, x, y, &tested);
> +               get_pixel_from_image(image, dst, x, y, &tested);
> 
>                 if (eval_diff(&dst->format->direct, &expected, &tested) > 2.) {
>                         print_fail("triangles", &expected, &tested, x,y,
> @@ -169,6 +180,7 @@ trifan_test(Display *dpy, picture_info *win, picture_info *dst, int op,
>                     dst_color->color.r, dst_color->color.g,
>                     dst_color->color.b, dst_color->color.a);
>         }
> +       XDestroyImage(image);
> 
>         return success;
>  }
> @@ -181,6 +193,7 @@ tristrip_test(Display *dpy, picture_info *win, picture_info *dst, int op,
>         color4d tdst, tsrc;
>         int x, y;
>         Bool success = TRUE;
> +       XImage *image;
> 
>         points[0].x = XDoubleToFixed(2);
>         points[0].y = XDoubleToFixed(2);
> @@ -208,6 +221,10 @@ tristrip_test(Display *dpy, picture_info *win, picture_info *dst, int op,
>         do_composite(ops[op].op, &src_color->color, NULL, &tdst, &tsrc, FALSE);
>         color_correct(dst, &tsrc);
> 
> +       image = XGetImage(dpy, dst->d,
> +                         0, 0, 5, 5,
> +                         0xffffffff, ZPixmap);
> +
>         for (x = 0; x < 5; x++) {
>             for (y = 0; y < 5; y++) {
>                 color4d expected, tested;
> @@ -218,7 +235,7 @@ tristrip_test(Display *dpy, picture_info *win, picture_info *dst, int op,
>                         expected = tdst;
>                 }
> 
> -               get_pixel(dpy, dst, x, y, &tested);
> +               get_pixel_from_image(image, dst, x, y, &tested);
> 
>                 if (eval_diff(&dst->format->direct, &expected, &tested) > 2.) {
>                     print_fail("triangles", &expected, &tested, x, y,
> @@ -235,6 +252,7 @@ tristrip_test(Display *dpy, picture_info *win, picture_info *dst, int op,
>                     dst_color->color.r, dst_color->color.g,
>                     dst_color->color.b, dst_color->color.a);
>         }
> +       XDestroyImage(image);
> 
>         return success;
>  }
> commit ad4da4e62ace7f5bfa0cfb2b82240b9498ce1005
> Author: Chris Wilson <chris at chris-wilson.co.uk>
> Date:   Wed Dec 1 14:52:13 2010 +0000
> 
>     repeat: Only call GetImage once for each test.
> 
>     Sample the entire result with a single call to GetImage in order to
>     batch up the transfers when checking the result.
> 
>     Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> 
> diff --git a/t_repeat.c b/t_repeat.c
> index bd5cd38..4e26136 100644
> --- a/t_repeat.c
> +++ b/t_repeat.c
> @@ -50,7 +50,6 @@ repeat_test(Display *dpy, picture_info *win, picture_info *dst, int op,
>      picture_info *dst_color, picture_info *c1, picture_info *c2, Bool test_mask)
>  {
>         int wi, hi;
> -       Bool failed = FALSE;
> 
>         for (wi = 0; wi < sizeof(sizes) / sizeof(int); wi++) {
>             int w = sizes[wi];
> @@ -64,6 +63,8 @@ repeat_test(Display *dpy, picture_info *win, picture_info *dst, int op,
>                 color4d tdst, c1expected, c2expected;
>                 XRenderPictureAttributes pa;
>                 XRenderDirectFormat acc;
> +               XImage *image;
> +               Bool failed = FALSE;
> 
>                 pa.component_alpha = test_mask;
>                 pa.repeat = TRUE;
> @@ -129,8 +130,12 @@ repeat_test(Display *dpy, picture_info *win, picture_info *dst, int op,
>                 color_correct(dst, &c1expected);
>                 color_correct(dst, &c2expected);
> 
> -               for (x = 0; x < TEST_WIDTH; x++) {
> -                   for (y = 0; y < TEST_HEIGHT; y++) {
> +               image = XGetImage(dpy, dst->d,
> +                                 0, 0, TEST_WIDTH, TEST_HEIGHT,
> +                                 ~0U, ZPixmap);
> +
> +               for (y = 0; y < TEST_HEIGHT; y++) {
> +                   for (x = 0; x < TEST_WIDTH; x++) {
>                         int samplex = x % w;
>                         int sampley = y % h;
>                         color4d *expected, tested;
> @@ -140,7 +145,7 @@ repeat_test(Display *dpy, picture_info *win, picture_info *dst, int op,
>                         } else {
>                                 expected = &c1expected;
>                         }
> -                       get_pixel(dpy, dst, x, y, &tested);
> +                       get_pixel_from_image(image, dst, x, y, &tested);
> 
>                         if (eval_diff(&acc, expected, &tested) > 3.) {
>                             snprintf(name, 40, "%dx%d %s %s-repeat", w, h,
> @@ -148,13 +153,20 @@ repeat_test(Display *dpy, picture_info *win, picture_info *dst, int op,
> 
>                             print_fail(name, expected, &tested, x, y,
>                                        eval_diff(&acc, expected, &tested));
> -                               failed = TRUE;
> +
> +                           failed = TRUE;
> +                           goto out;
>                         }
>                     }
>                 }
> +out:
> +               XDestroyImage(image);
>                 XRenderFreePicture(dpy, src.pict);
>                 XFreePixmap(dpy, src.d);
> +
> +               if (failed)
> +                   return FALSE;
>             }
>         }
> -       return !failed;
> +       return TRUE;
>  }
> commit 903b5030826ab6915d354aa95a4e36c3dd684989
> Author: Chris Wilson <chris at chris-wilson.co.uk>
> Date:   Wed Dec 1 13:56:07 2010 +0000
> 
>     Split out printing the results from eval_diff()
> 
>     Separate the evalation of two colors given a format and the printing of
>     the result. This allows eval_diff() to be used elsewhere and also means
>     that we do not need to waste cycles generating unused strings for
>     eval_diff() [this accounts for as much time as composite_op!]. As part
>     of this process pass in the expected accuracy of the operation to
>     eval_diff().
> 
>     Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> 
> diff --git a/doc/TODO b/doc/TODO
> index ee20732..de1787c 100644
> --- a/doc/TODO
> +++ b/doc/TODO
> @@ -1,8 +1,6 @@
>  - Check bilinear filtering
>  - Check repeating transformed sources
>  - Check coordinates for more different transformations
> -- Get a useful number being produced for error values, and correct eval_diff's
> -  limit.
>  - Check source/mask pixels falling outside the drawable.
>  - Check trapezoids!
>  - get_pixel equivalent that doesn't involve round-trips per call.
> diff --git a/rendercheck.h b/rendercheck.h
> index 3e9966d..34d06c5 100644
> --- a/rendercheck.h
> +++ b/rendercheck.h
> @@ -117,9 +117,26 @@ get_pixel_from_image(XImage *image,
>                      int x, int y,
>                      color4d *color);
> 
> -int
> -eval_diff(char *name, color4d *expected, color4d *test, int x, int y,
> -    Bool verbose);
> +void
> +accuracy(XRenderDirectFormat *result,
> +        const XRenderDirectFormat *a,
> +        const XRenderDirectFormat *b);
> +
> +double
> +eval_diff(const XRenderDirectFormat *accuracy,
> +         const color4d *expected,
> +         const color4d *test);
> +
> +void print_fail(const char *name,
> +               const color4d *expected,
> +               const color4d *test,
> +               int x, int y,
> +               double d);
> +
> +void print_pass(const char *name,
> +               const color4d *expected,
> +               int x, int y,
> +               double d);
> 
>  void
>  argb_fill(Display *dpy, picture_info *p, int x, int y, int w, int h, float a,
> @@ -154,7 +171,7 @@ composite_test(Display *dpy, picture_info *win, picture_info *dst,
>                const picture_info **src_color, int num_src,
>                const picture_info **mask_color, int num_mask,
>                const picture_info **dst_color, int num_dst,
> -              Bool componentAlpha, Bool print_errors);
> +              Bool componentAlpha);
> 
>  Bool
>  dstcoords_test(Display *dpy, picture_info *win, int op, picture_info *dst,
> diff --git a/t_blend.c b/t_blend.c
> index 7847d07..525ea09 100644
> --- a/t_blend.c
> +++ b/t_blend.c
> @@ -72,10 +72,20 @@ blend_test(Display *dpy, picture_info *win, picture_info *dst,
> 
>             y = 0;
>             while (k0 < k) {
> +               XRenderDirectFormat dst_acc;
> +
> +               accuracy(&dst_acc,
> +                        &dst->format->direct,
> +                        &dst_color[k0]->format->direct);
> +
>                 tdst = dst_color[k0]->color;
>                 color_correct(dst, &tdst);
> 
>                 for (j = 0; j < num_src; j++) {
> +                   XRenderDirectFormat acc;
> +
> +                   accuracy(&acc, &src_color[j]->format->direct, &dst_acc);
> +
>                     for (i = 0; i < num_op; i++) {
>                         get_pixel_from_image(image, dst, i, y, &tested);
> 
> @@ -87,11 +97,13 @@ blend_test(Display *dpy, picture_info *win, picture_info *dst,
>                                      FALSE);
>                         color_correct(dst, &expected);
> 
> -                       snprintf(testname, 20, "%s blend", ops[op[i]].name);
> -                       if (!eval_diff(testname, &expected, &tested, 0, 0, is_verbose)) {
> +                       if (eval_diff(&acc, &expected, &tested) > 3.) {
>                             char srcformat[20];
> 
> +                           snprintf(testname, 20, "%s blend", ops[op[i]].name);
>                             describe_format(srcformat, 20, src_color[j]->format);
> +                           print_fail(testname, &expected, &tested, 0, 0,
> +                                      eval_diff(&acc, &expected, &tested));
>                             printf("src color: %.2f %.2f %.2f %.2f (%s)\n"
>                                    "dst color: %.2f %.2f %.2f %.2f\n",
>                                    src_color[j]->color.r, src_color[j]->color.g,
> @@ -101,8 +113,6 @@ blend_test(Display *dpy, picture_info *win, picture_info *dst,
>                                    dst_color[k0]->color.b, dst_color[k0]->color.a);
>                             printf("src: %s, dst: %s\n", src_color[j]->name, dst->name);
>                             return FALSE;
> -                       } else if (is_verbose) {
> -                           printf("src: %s, dst: %s\n", src_color[j]->name, dst->name);
>                         }
>                     }
>                     y++;
> diff --git a/t_composite.c b/t_composite.c
> index 315650b..d305d1e 100644
> --- a/t_composite.c
> +++ b/t_composite.c
> @@ -33,7 +33,7 @@ composite_test(Display *dpy, picture_info *win, picture_info *dst,
>                const picture_info **src_color, int num_src,
>                const picture_info **mask_color, int num_mask,
>                const picture_info **dst_color, int num_dst,
> -              Bool componentAlpha, Bool print_errors)
> +              Bool componentAlpha)
>  {
>         color4d expected, tested, tdst, tmsk;
>         char testname[40];
> @@ -44,6 +44,7 @@ composite_test(Display *dpy, picture_info *win, picture_info *dst,
>             color_correct(dst, &tdst);
> 
>             for (m = 0; m < num_mask; m++) {
> +               XRenderDirectFormat mask_acc;
>                 XImage *image;
> 
>                 if (componentAlpha) {
> @@ -100,7 +101,16 @@ composite_test(Display *dpy, picture_info *win, picture_info *dst,
>                 } else
>                     tmsk = mask_color[m]->color;
> 
> +               accuracy(&mask_acc,
> +                        &mask_color[m]->format->direct,
> +                        &dst_color[d]->format->direct);
> +               accuracy(&mask_acc, &mask_acc, &dst->format->direct);
> +
>                 for (s = 0; s < num_src; s++) {
> +                   XRenderDirectFormat acc;
> +
> +                   accuracy(&acc, &mask_acc, &src_color[s]->format->direct);
> +
>                     for (i = 0; i < num_op; i++) {
>                         get_pixel_from_image(image, dst, i, s, &tested);
> 
> @@ -109,38 +119,33 @@ composite_test(Display *dpy, picture_info *win, picture_info *dst,
>                                      &expected, componentAlpha);
>                         color_correct(dst, &expected);
> 
> -                       snprintf(testname, 40,
> -                                "%s %scomposite", ops[op[i]].name,
> -                                componentAlpha ? "CA " : "");
> -                       if (!eval_diff(testname, &expected, &tested, 0, 0,
> -                                      is_verbose && print_errors)) {
> -                           if (print_errors)
> -                               printf("src color: %.2f %.2f %.2f %.2f\n"
> -                                      "msk color: %.2f %.2f %.2f %.2f\n"
> -                                      "dst color: %.2f %.2f %.2f %.2f\n",
> -                                      src_color[s]->color.r,
> -                                      src_color[s]->color.g,
> -                                      src_color[s]->color.b,
> -                                      src_color[s]->color.a,
> -                                      mask_color[m]->color.r,
> -                                      mask_color[m]->color.g,
> -                                      mask_color[m]->color.b,
> -                                      mask_color[m]->color.a,
> -                                      dst_color[d]->color.r,
> -                                      dst_color[d]->color.g,
> -                                      dst_color[d]->color.b,
> -                                      dst_color[d]->color.a);
> +                       if (eval_diff(&acc, &expected, &tested) > 3.) {
> +                           snprintf(testname, 40,
> +                                    "%s %scomposite", ops[op[i]].name,
> +                                    componentAlpha ? "CA " : "");
> +                           print_fail(testname, &expected, &tested, 0, 0,
> +                                      eval_diff(&acc, &expected, &tested));
> +                           printf("src color: %.2f %.2f %.2f %.2f\n"
> +                                  "msk color: %.2f %.2f %.2f %.2f\n"
> +                                  "dst color: %.2f %.2f %.2f %.2f\n",
> +                                  src_color[s]->color.r,
> +                                  src_color[s]->color.g,
> +                                  src_color[s]->color.b,
> +                                  src_color[s]->color.a,
> +                                  mask_color[m]->color.r,
> +                                  mask_color[m]->color.g,
> +                                  mask_color[m]->color.b,
> +                                  mask_color[m]->color.a,
> +                                  dst_color[d]->color.r,
> +                                  dst_color[d]->color.g,
> +                                  dst_color[d]->color.b,
> +                                  dst_color[d]->color.a);
>                             printf("src: %s, mask: %s, dst: %s\n",
>                                    src_color[s]->name,
>                                    mask_color[m]->name,
>                                    dst->name);
>                             XDestroyImage(image);
>                             return FALSE;
> -                       } else if (is_verbose) {
> -                           printf("src: %s, mask: %s, dst: %s\n",
> -                                  src_color[s]->name,
> -                                  mask_color[m]->name,
> -                                  dst->name);
>                         }
>                     }
>                 }
> diff --git a/t_dstcoords.c b/t_dstcoords.c
> index f6adab7..ed91ecc 100644
> --- a/t_dstcoords.c
> +++ b/t_dstcoords.c
> @@ -59,9 +59,12 @@ dstcoords_test(Display *dpy, picture_info *win, int op, picture_info *dst,
>                                 expected = bg->color;
> 
>                         color_correct(dst, &expected);
> -                       if (!eval_diff("dst coords", &expected, &tested, x, y,
> -                           is_verbose))
> +                       if (eval_diff(&dst->format->direct, &expected, &tested) > 2.0) {
> +                           print_fail("dst coords",
> +                                      &expected, &tested, x, y,
> +                                      eval_diff(&dst->format->direct, &expected, &tested));
>                                 failed = TRUE;
> +                       }
>                 }
>         }
> 
> diff --git a/t_fill.c b/t_fill.c
> index f367cb8..4dd80a6 100644
> --- a/t_fill.c
> +++ b/t_fill.c
> @@ -35,10 +35,15 @@ fill_test(Display *dpy, picture_info *win, picture_info *src)
>         char name[20];
> 
>         get_pixel(dpy, src, 0, 0, &tested);
> -
>         copy_pict_to_win(dpy, src, win, win_width, win_height);
> 
> -       strcpy(name, "fill ");
> -       describe_format(name, 20 - strlen(name), src->format);
> -       return eval_diff(name, &src->color, &tested, 0, 0, is_verbose);
> +       if (eval_diff(&src->format->direct, &src->color, &tested) > 2.) {
> +           strcpy(name, "fill ");
> +           describe_format(name, 20 - strlen(name), src->format);
> +           print_fail(name, &src->color, &tested, 0, 0,
> +                      eval_diff(&src->format->direct, &src->color, &tested));
> +           return FALSE;
> +       }
> +
> +       return TRUE;
>  }
> diff --git a/t_gradient.c b/t_gradient.c
> index 379c163..4f84403 100644
> --- a/t_gradient.c
> +++ b/t_gradient.c
> @@ -305,8 +305,11 @@ Bool linear_gradient_test(Display *dpy, picture_info *win,
>                                   &expected, False);
>                      color_correct(dst, &expected);
> 
> -                    snprintf(testname, 40, "%s linear gradient", ops[op].name);
> -                    if (!eval_diff(testname, &expected, &tested, 0, 0, is_verbose)) {
> +                    if (eval_diff(&dst->format->direct, &expected, &tested) > 3.) {
> +                       snprintf(testname, 40,
> +                                "%s linear gradient", ops[op].name);
> +                       print_fail(testname, &expected, &tested, 0, 0,
> +                                  eval_diff(&dst->format->direct, &expected, &tested));
>                          printf("gradient: %d stops: %d repeat: %d pos: %d/%d\n"
>                                 "src color: %.2f %.2f %.2f %.2f\n"
>                                 "dst color: %.2f %.2f %.2f %.2f\n",
> diff --git a/t_repeat.c b/t_repeat.c
> index 92b95ea..bd5cd38 100644
> --- a/t_repeat.c
> +++ b/t_repeat.c
> @@ -63,6 +63,7 @@ repeat_test(Display *dpy, picture_info *win, picture_info *dst, int op,
>                 char name[40];
>                 color4d tdst, c1expected, c2expected;
>                 XRenderPictureAttributes pa;
> +               XRenderDirectFormat acc;
> 
>                 pa.component_alpha = test_mask;
>                 pa.repeat = TRUE;
> @@ -108,6 +109,12 @@ repeat_test(Display *dpy, picture_info *win, picture_info *dst, int op,
>                 tdst = dst_color->color;
>                 color_correct(dst, &tdst);
> 
> +               accuracy(&acc,
> +                        &dst->format->direct,
> +                        &dst_color->format->direct);
> +               accuracy(&acc, &acc, &c1->format->direct);
> +               accuracy(&acc, &acc, &c2->format->direct);
> +
>                 if (!test_mask) {
>                         do_composite(ops[op].op, &c1->color, NULL, &tdst,
>                             &c1expected, FALSE);
> @@ -122,8 +129,6 @@ repeat_test(Display *dpy, picture_info *win, picture_info *dst, int op,
>                 color_correct(dst, &c1expected);
>                 color_correct(dst, &c2expected);
> 
> -               snprintf(name, 40, "%dx%d %s %s-repeat", w, h,
> -                   ops[op].name, test_mask ? "mask" : "src");
>                 for (x = 0; x < TEST_WIDTH; x++) {
>                     for (y = 0; y < TEST_HEIGHT; y++) {
>                         int samplex = x % w;
> @@ -137,9 +142,14 @@ repeat_test(Display *dpy, picture_info *win, picture_info *dst, int op,
>                         }
>                         get_pixel(dpy, dst, x, y, &tested);
> 
> -                       if (!eval_diff(name, expected, &tested, x, y,
> -                           is_verbose))
> +                       if (eval_diff(&acc, expected, &tested) > 3.) {
> +                           snprintf(name, 40, "%dx%d %s %s-repeat", w, h,
> +                                    ops[op].name, test_mask ? "mask" : "src");
> +
> +                           print_fail(name, expected, &tested, x, y,
> +                                      eval_diff(&acc, expected, &tested));
>                                 failed = TRUE;
> +                       }
>                     }
>                 }
>                 XRenderFreePicture(dpy, src.pict);
> diff --git a/t_srccoords.c b/t_srccoords.c
> index c29a960..6aff6d5 100644
> --- a/t_srccoords.c
> +++ b/t_srccoords.c
> @@ -90,7 +90,6 @@ srccoords_test(Display *dpy, picture_info *win, picture_info *white,
>         }
> 
>         for (i = 0; i < 25; i++) {
> -               char name[20];
>                 int x = i % 5, y = i / 5;
> 
>                 if (!test_mask)
> @@ -123,13 +122,12 @@ srccoords_test(Display *dpy, picture_info *win, picture_info *white,
>                 } else
>                         tested_colors[x][y] = 9;
> 
> -               if (test_mask)
> -                       snprintf(name, 20, "mask coords");
> -               else
> -                       snprintf(name, 20, "src coords");
> -               if (!eval_diff(name, &expected, &tested, x, y,
> -                   is_verbose))
> -                       failed = TRUE;
> +               if (eval_diff(&win->format->direct, &expected, &tested) > 2.) {
> +                   print_fail(test_mask ? "mask coords" : "src coords",
> +                              &expected, &tested, x, y,
> +                              eval_diff(&win->format->direct, &expected, &tested));
> +                   failed = TRUE;
> +               }
>         }
>         if (failed) {
>                 int j;
> diff --git a/t_triangles.c b/t_triangles.c
> index 230c2ff..645f507 100644
> --- a/t_triangles.c
> +++ b/t_triangles.c
> @@ -88,10 +88,10 @@ triangles_test(Display *dpy, picture_info *win, picture_info *dst, int op,
> 
>                 get_pixel(dpy, dst, x, y, &tested);
> 
> -               if (!eval_diff("triangles", &expected, &tested, x, y,
> -                   is_verbose))
> -               {
> -                       success = FALSE;
> +               if (eval_diff(&dst->format->direct, &expected, &tested) > 2.) {
> +                   print_fail("triangles", &expected, &tested, x, y,
> +                              eval_diff(&dst->format->direct, &expected, &tested));
> +                   success = FALSE;
>                 }
>             }
>         }
> @@ -154,9 +154,9 @@ trifan_test(Display *dpy, picture_info *win, picture_info *dst, int op,
> 
>                 get_pixel(dpy, dst, x, y, &tested);
> 
> -               if (!eval_diff("triangles", &expected, &tested, x, y,
> -                   is_verbose))
> -               {
> +               if (eval_diff(&dst->format->direct, &expected, &tested) > 2.) {
> +                       print_fail("triangles", &expected, &tested, x,y,
> +                                  eval_diff(&dst->format->direct, &expected, &tested));
>                         success = FALSE;
>                 }
>             }
> @@ -220,10 +220,10 @@ tristrip_test(Display *dpy, picture_info *win, picture_info *dst, int op,
> 
>                 get_pixel(dpy, dst, x, y, &tested);
> 
> -               if (!eval_diff("triangles", &expected, &tested, x, y,
> -                   is_verbose))
> -               {
> -                       success = FALSE;
> +               if (eval_diff(&dst->format->direct, &expected, &tested) > 2.) {
> +                   print_fail("triangles", &expected, &tested, x, y,
> +                              eval_diff(&dst->format->direct, &expected, &tested));
> +                   success = FALSE;
>                 }
>             }
>         }
> diff --git a/t_tsrccoords2.c b/t_tsrccoords2.c
> index 1bb3974..89e92b1 100644
> --- a/t_tsrccoords2.c
> +++ b/t_tsrccoords2.c
> @@ -121,7 +121,6 @@ trans_srccoords_test_2(Display *dpy, picture_info *win, picture_info *white,
>         }
> 
>         for (i = 0; i < 25; i++) {
> -               char name[20];
>                 int x = i % 5, y = i / 5, srcx, srcy;
> 
>                 get_pixel(dpy, win, x, y, &tested);
> @@ -142,12 +141,12 @@ trans_srccoords_test_2(Display *dpy, picture_info *win, picture_info *white,
>                 } else
>                         tested_colors[y][x] = 9;
> 
> -               if (test_mask)
> -                       snprintf(name, 20, "mask coords");
> -               else
> -                       snprintf(name, 20, "src coords");
> -               if (!eval_diff(name, &expected, &tested, x, y, is_verbose))
> +               if (eval_diff(&win->format->direct, &expected, &tested) > 2.) {
> +                   print_fail(test_mask ? "mask coords" : "src coords",
> +                              &expected, &tested, x, y,
> +                              eval_diff(&win->format->direct, &expected, &tested));
>                         failed = TRUE;
> +               }
>         }
>         if (failed) {
>                 int x, y;
> diff --git a/tests.c b/tests.c
> index 66a1115..f722bc6 100644
> --- a/tests.c
> +++ b/tests.c
> @@ -156,43 +156,63 @@ get_pixel(Display *dpy,
>         XDestroyImage(image);
>  }
> 
> -int
> -eval_diff(char *name, color4d *expected, color4d *test, int x, int y,
> -    Bool verbose)
> +void
> +accuracy(XRenderDirectFormat *result,
> +        const XRenderDirectFormat *a,
> +        const XRenderDirectFormat *b)
>  {
> -       double rscale, gscale, bscale, ascale;
> -       double rdiff, gdiff, bdiff, adiff, diff;
> +    result->redMask = min(a->redMask, b->redMask);
> +    result->greenMask = min(a->greenMask, b->greenMask);
> +    result->blueMask = min(a->blueMask, b->blueMask);
> +    result->alphaMask = min(a->alphaMask, b->alphaMask);
> +}
> 
> -       /* 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;
> -       /*rdiff = log2(1.0 + rdiff);
> +double
> +eval_diff(const XRenderDirectFormat *format,
> +         const color4d *expected,
> +         const color4d *test)
> +{
> +       double rdiff, gdiff, bdiff, adiff;
> +
> +       rdiff = fabs(test->r - expected->r) * format->redMask;
> +       bdiff = fabs(test->g - expected->g) * format->greenMask;
> +       gdiff = fabs(test->b - expected->b) * format->blueMask;
> +       adiff = fabs(test->a - expected->a) * format->alphaMask;
> +
> +#if 0
> +       rdiff = log2(1.0 + rdiff);
>         gdiff = log2(1.0 + gdiff);
>         bdiff = log2(1.0 + bdiff);
> -       adiff = log2(1.0 + adiff);*/
> -       diff = max(max(max(rdiff, gdiff), bdiff), adiff);
> -       if (diff > 3.0) {
> -               printf("%s test error of %.4f at (%d, %d) --\n"
> -                   "           R    G    B    A\n"
> -                   "got:       %.2f %.2f %.2f %.2f\n"
> -                   "expected:  %.2f %.2f %.2f %.2f\n", name, diff, x, y,
> -                   test->r, test->g, test->b, test->a,
> -                   expected->r, expected->g, expected->b, expected->a);
> -               return FALSE;
> -       } else if (verbose) {
> -               printf("%s test succeeded at (%d, %d) with %.4f: "
> -                   "%.2f %.2f %.2f %.2f\n", name, x, y, diff,
> -                   expected->r, expected->g, expected->b, expected->a);
> -       }
> -       return TRUE;
> +       adiff = log2(1.0 + adiff);
> +#endif
> +
> +       return max(max(max(rdiff, gdiff), bdiff), adiff);
> +}
> +
> +void print_fail(const char *name,
> +               const color4d *expected,
> +               const color4d *test,
> +               int x, int y,
> +               double d)
> +{
> +    printf("%s test error of %.4f at (%d, %d) --\n"
> +          "           R     G     B     A\n"
> +          "got:       %.3f %.3f %.3f %.3f\n"
> +          "expected:  %.3f %.3f %.3f %.3f\n",
> +          name, d, x, y,
> +          test->r, test->g, test->b, test->a,
> +          expected->r, expected->g, expected->b, expected->a);
> +}
> +
> +void print_pass(const char *name,
> +               const color4d *expected,
> +               int x, int y,
> +               double d)
> +{
> +    printf("%s test succeeded at (%d, %d) with %.4f: "
> +          "%.2f %.2f %.2f %.2f\n",
> +          name, x, y, d,
> +          expected->r, expected->g, expected->b, expected->a);
>  }
> 
>  void
> @@ -578,7 +598,7 @@ do {                                                                \
>                                         test_src, num_test_src,
>                                         test_mask, num_test_mask,
>                                         test_dst, num_test_dst,
> -                                       FALSE, TRUE);
> +                                       FALSE);
>                     RECORD_RESULTS();
>                 }
>                 if (group_ok)
> @@ -603,7 +623,7 @@ do {                                                                \
>                                         test_src, num_test_src,
>                                         test_mask, num_test_mask,
>                                         test_dst, num_test_dst,
> -                                       TRUE, TRUE);
> +                                       TRUE);
>                     RECORD_RESULTS();
>                 }
>                 if (group_ok)
> commit 55612909182c253bbfe8278a8867c93c9b09bc01
> Author: Chris Wilson <chris at chris-wilson.co.uk>
> Date:   Wed Dec 1 11:58:04 2010 +0000
> 
>     composite: Batch tests
> 
>     Process an entire num_mask x num_op in a single GetImage pass.
> 
>     Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> 
> diff --git a/rendercheck.h b/rendercheck.h
> index 5b802a2..3e9966d 100644
> --- a/rendercheck.h
> +++ b/rendercheck.h
> @@ -149,9 +149,12 @@ blend_test(Display *dpy, picture_info *win, picture_info *dst,
>            const picture_info **dst_color, int num_dst);
> 
>  Bool
> -composite_test(Display *dpy, picture_info *win, picture_info *dst, int op,
> -    picture_info *src_color, picture_info *mask_color, picture_info *dst_color,
> -    Bool componentAlpha, Bool print_errors);
> +composite_test(Display *dpy, picture_info *win, picture_info *dst,
> +              const int *op, int num_op,
> +              const picture_info **src_color, int num_src,
> +              const picture_info **mask_color, int num_mask,
> +              const picture_info **dst_color, int num_dst,
> +              Bool componentAlpha, Bool print_errors);
> 
>  Bool
>  dstcoords_test(Display *dpy, picture_info *win, int op, picture_info *dst,
> diff --git a/t_composite.c b/t_composite.c
> index 25b4dd0..315650b 100644
> --- a/t_composite.c
> +++ b/t_composite.c
> @@ -24,81 +24,129 @@
> 
>  #include "rendercheck.h"
> 
> -#define TEST_WIDTH     10
> -#define TEST_HEIGHT    10
> -
>  /* Test a composite of a given operation, source, mask, and destination picture.
>   * Fills the window, and samples from the 0,0 pixel corner.
>   */
>  Bool
> -composite_test(Display *dpy, picture_info *win, picture_info *dst, int op,
> -    picture_info *src_color, picture_info *mask_color, picture_info *dst_color,
> -    Bool componentAlpha, Bool print_errors)
> +composite_test(Display *dpy, picture_info *win, picture_info *dst,
> +              const int *op, int num_op,
> +              const picture_info **src_color, int num_src,
> +              const picture_info **mask_color, int num_mask,
> +              const picture_info **dst_color, int num_dst,
> +              Bool componentAlpha, Bool print_errors)
>  {
>         color4d expected, tested, tdst, tmsk;
>         char testname[40];
> -       XRenderPictureAttributes pa;
> -       Bool success = TRUE;
> -       int i;
> -
> -       if (componentAlpha) {
> -               pa.component_alpha = TRUE;
> -               XRenderChangePicture(dpy, mask_color->pict, CPComponentAlpha,
> -                   &pa);
> -       }
> -       for (i = 0; i < pixmap_move_iter; i++) {
> -               XRenderComposite(dpy, PictOpSrc, dst_color->pict, 0, dst->pict,
> -                   0, 0, 0, 0, 0, 0, TEST_WIDTH, TEST_HEIGHT);
> -               XRenderComposite(dpy, ops[op].op, src_color->pict,
> -                   mask_color->pict, dst->pict, 0, 0, 0, 0, 0, 0,
> -                   TEST_WIDTH, TEST_HEIGHT);
> -       }
> -       get_pixel(dpy, dst, 0, 0, &tested);
> -       copy_pict_to_win(dpy, dst, win, TEST_WIDTH, TEST_HEIGHT);
> +       int i, s, m, d, iter;
> 
> -       if (componentAlpha) {
> -               pa.component_alpha = FALSE;
> -               XRenderChangePicture(dpy, mask_color->pict, CPComponentAlpha,
> -                   &pa);
> -       }
> +       for (d = 0; d < num_dst; d++) {
> +           tdst = dst_color[d]->color;
> +           color_correct(dst, &tdst);
> +
> +           for (m = 0; m < num_mask; m++) {
> +               XImage *image;
> +
> +               if (componentAlpha) {
> +                   XRenderPictureAttributes pa;
> +
> +                   pa.component_alpha = TRUE;
> +                   XRenderChangePicture(dpy, mask_color[m]->pict,
> +                                        CPComponentAlpha, &pa);
> +               }
> +
> +               for (iter = 0; iter < pixmap_move_iter; iter++) {
> +                   XRenderComposite(dpy, PictOpSrc,
> +                                    dst_color[d]->pict, 0, dst->pict,
> +                                    0, 0,
> +                                    0, 0,
> +                                    0, 0,
> +                                    num_op, num_src);
> +                   for (s = 0; s < num_src; s++) {
> +                       for (i = 0; i < num_op; i++)
> +                           XRenderComposite(dpy, ops[op[i]].op,
> +                                            src_color[s]->pict,
> +                                            mask_color[m]->pict,
> +                                            dst->pict,
> +                                            0, 0,
> +                                            0, 0,
> +                                            i, s,
> +                                            1, 1);
> +                   }
> +               }
> 
> -       if (componentAlpha && mask_color->format->direct.redMask == 0) {
> -               /* Ax component-alpha masks expand alpha into all color
> -                * channels.  XXX: This should be located somewhere generic.
> -                */
> -               tmsk.a = mask_color->color.a;
> -               tmsk.r = mask_color->color.a;
> -               tmsk.g = mask_color->color.a;
> -               tmsk.b = mask_color->color.a;
> -       } else
> -               tmsk = mask_color->color;
> -
> -       tdst = dst_color->color;
> -       color_correct(dst, &tdst);
> -       do_composite(ops[op].op, &src_color->color, &tmsk, &tdst,
> -           &expected, componentAlpha);
> -       color_correct(dst, &expected);
> -
> -       snprintf(testname, 40, "%s %scomposite", ops[op].name,
> -           componentAlpha ? "CA " : "");
> -       if (!eval_diff(testname, &expected, &tested, 0, 0, is_verbose &&
> -           print_errors)) {
> -               if (print_errors)
> -                       printf("src color: %.2f %.2f %.2f %.2f\n"
> -                           "msk color: %.2f %.2f %.2f %.2f\n"
> -                           "dst color: %.2f %.2f %.2f %.2f\n",
> -                           src_color->color.r, src_color->color.g,
> -                           src_color->color.b, src_color->color.a,
> -                           mask_color->color.r, mask_color->color.g,
> -                           mask_color->color.b, mask_color->color.a,
> -                           dst_color->color.r, dst_color->color.g,
> -                           dst_color->color.b, dst_color->color.a);
> -               printf("src: %s, mask: %s, dst: %s\n", src_color->name,
> -                   mask_color->name, dst->name);
> -               success = FALSE;
> -       } else if (is_verbose) {
> -               printf("src: %s, mask: %s, dst: %s\n", src_color->name,
> -                   mask_color->name, dst->name);
> +               if (componentAlpha) {
> +                   XRenderPictureAttributes pa;
> +
> +                   pa.component_alpha = FALSE;
> +                   XRenderChangePicture(dpy, mask_color[m]->pict,
> +                                        CPComponentAlpha, &pa);
> +               }
> +
> +               image = XGetImage(dpy, dst->d,
> +                                 0, 0, num_op, num_src,
> +                                 0xffffffff, ZPixmap);
> +               copy_pict_to_win(dpy, dst, win, win_width, win_height);
> +
> +               if (componentAlpha &&
> +                   mask_color[m]->format->direct.redMask == 0) {
> +                   /* Ax component-alpha masks expand alpha into
> +                    * all color channels.
> +                    * XXX: This should be located somewhere generic.
> +                    */
> +                   tmsk.a = mask_color[m]->color.a;
> +                   tmsk.r = mask_color[m]->color.a;
> +                   tmsk.g = mask_color[m]->color.a;
> +                   tmsk.b = mask_color[m]->color.a;
> +               } else
> +                   tmsk = mask_color[m]->color;
> +
> +               for (s = 0; s < num_src; s++) {
> +                   for (i = 0; i < num_op; i++) {
> +                       get_pixel_from_image(image, dst, i, s, &tested);
> +
> +                       do_composite(ops[op[i]].op,
> +                                    &src_color[s]->color, &tmsk, &tdst,
> +                                    &expected, componentAlpha);
> +                       color_correct(dst, &expected);
> +
> +                       snprintf(testname, 40,
> +                                "%s %scomposite", ops[op[i]].name,
> +                                componentAlpha ? "CA " : "");
> +                       if (!eval_diff(testname, &expected, &tested, 0, 0,
> +                                      is_verbose && print_errors)) {
> +                           if (print_errors)
> +                               printf("src color: %.2f %.2f %.2f %.2f\n"
> +                                      "msk color: %.2f %.2f %.2f %.2f\n"
> +                                      "dst color: %.2f %.2f %.2f %.2f\n",
> +                                      src_color[s]->color.r,
> +                                      src_color[s]->color.g,
> +                                      src_color[s]->color.b,
> +                                      src_color[s]->color.a,
> +                                      mask_color[m]->color.r,
> +                                      mask_color[m]->color.g,
> +                                      mask_color[m]->color.b,
> +                                      mask_color[m]->color.a,
> +                                      dst_color[d]->color.r,
> +                                      dst_color[d]->color.g,
> +                                      dst_color[d]->color.b,
> +                                      dst_color[d]->color.a);
> +                           printf("src: %s, mask: %s, dst: %s\n",
> +                                  src_color[s]->name,
> +                                  mask_color[m]->name,
> +                                  dst->name);
> +                           XDestroyImage(image);
> +                           return FALSE;
> +                       } else if (is_verbose) {
> +                           printf("src: %s, mask: %s, dst: %s\n",
> +                                  src_color[s]->name,
> +                                  mask_color[m]->name,
> +                                  dst->name);
> +                       }
> +                   }
> +               }
> +               XDestroyImage(image);
> +           }
>         }
> -       return success;
> +
> +       return TRUE;
>  }
> diff --git a/tests.c b/tests.c
> index 0465e6d..66a1115 100644
> --- a/tests.c
> +++ b/tests.c
> @@ -296,11 +296,17 @@ create_formats_list(Display *dpy)
>  Bool
>  do_tests(Display *dpy, picture_info *win)
>  {
> -       int i, j, src, dst = 0, mask;
> +       int i, j, src;
>         int num_dests;
>         picture_info *dests, *pictures_1x1, *pictures_10x10, picture_3x3, *pictures_solid;
>         int success_mask = 0, tests_passed = 0, tests_total = 0;
>         int num_tests;
> +       int *test_ops;
> +       const picture_info **test_src, **test_mask, **test_dst;
> +       int num_test_ops = 0;
> +       int num_test_src = 0;
> +       int num_test_mask = 0;
> +       int num_test_dst = 0;
> 
>         create_formats_list(dpy);
> 
> @@ -426,6 +432,30 @@ do {                                                               \
> 
>         num_tests = num_colors * nformats;
> 
> +       test_ops = malloc(sizeof(int)*num_ops);
> +       test_src = malloc(sizeof(picture_info*)*(2*num_tests+num_colors));
> +       test_mask = malloc(sizeof(picture_info*)*2*num_tests);
> +       test_dst = malloc(sizeof(picture_info*)*(num_tests+num_colors));
> +
> +       for (i = 0; i < num_ops; i++) {
> +           if (ops[i].disabled)
> +               continue;
> +
> +           test_ops[num_test_ops++] = i;
> +       }
> +
> +       for (i = 0; i < num_tests; i++) {
> +           test_src[num_test_src++] = &pictures_1x1[i];
> +           test_src[num_test_src++] = &pictures_10x10[i];
> +           test_mask[num_test_mask++] = &pictures_1x1[i];
> +           test_mask[num_test_mask++] = &pictures_10x10[i];
> +           test_dst[num_test_dst++] = &pictures_1x1[i];
> +       }
> +       for (i = 0; i < num_colors; i++) {
> +           test_src[num_test_src++] = &pictures_solid[i];
> +           test_dst[num_test_dst++] = &pictures_solid[i];
> +       }
> +
>         if (enabled_tests & TEST_FILL) {
>                 Bool ok, group_ok = TRUE;
> 
> @@ -509,29 +539,6 @@ do {                                                               \
> 
>         if (enabled_tests & TEST_BLEND) {
>                 Bool ok, group_ok = TRUE;
> -               int *blend_ops = malloc(sizeof(int)*num_ops);
> -               const picture_info **blend_src = malloc(sizeof(picture_info*)*(2*num_tests+num_colors));
> -               const picture_info **blend_dst = malloc(sizeof(picture_info*)*(num_tests+num_colors));
> -               int num_blend_ops = 0;
> -               int num_blend_src = 0;
> -               int num_blend_dst = 0;
> -
> -               for (i = 0; i < num_ops; i++) {
> -                   if (ops[i].disabled)
> -                       continue;
> -
> -                   blend_ops[num_blend_ops++] = i;
> -               }
> -
> -               for (i = 0; i < num_tests; i++) {
> -                   blend_src[num_blend_src++] = &pictures_1x1[i];
> -                   blend_src[num_blend_src++] = &pictures_10x10[i];
> -                   blend_dst[num_blend_dst++] = &pictures_1x1[i];
> -               }
> -               for (i = 0; i < num_colors; i++) {
> -                   blend_src[num_blend_src++] = &pictures_solid[i];
> -                   blend_dst[num_blend_dst++] = &pictures_solid[i];
> -               }
> 
>                 for (j = 0; j <= num_dests; j++) {
>                     picture_info *pi;
> @@ -544,63 +551,35 @@ do {                                                              \
>                     printf("Beginning blend test on %s\n", pi->name);
> 
>                     ok = blend_test(dpy, win, pi,
> -                                   blend_ops, num_blend_ops,
> -                                   blend_src, num_blend_src,
> -                                   blend_dst, num_blend_dst);
> +                                   test_ops, num_test_ops,
> +                                   test_src, num_test_src,
> +                                   test_dst, num_test_dst);
>                     RECORD_RESULTS();
>                 }
>                 if (group_ok)
>                         success_mask |= TEST_BLEND;
> -
> -               free(blend_ops);
> -               free(blend_src);
> -               free(blend_dst);
>         }
> 
>         if (enabled_tests & TEST_COMPOSITE) {
>                 Bool ok, group_ok = TRUE;
> 
> -               for (i = 0; i < num_ops; i++) {
> -                   if (ops[i].disabled)
> -                       continue;
> +               for (j = 0; j <= num_dests; j++) {
> +                   picture_info *pi;
> 
> -                   for (j = 0; j <= num_dests; j++) {
> -                       picture_info *pi;
> +                   if (j != num_dests)
> +                       pi = &dests[j];
> +                   else
> +                       pi = win;
> 
> -                       if (j != num_dests)
> -                               pi = &dests[j];
> -                       else
> -                               pi = win;
> -                       printf("Beginning %s composite mask test on %s\n",
> -                           ops[i].name, pi->name);
> +                   printf("Beginning composite mask test on %s\n", pi->name);
> 
> -                       for (src = 0; src < num_tests; src++) {
> -                           for (mask = 0; mask < num_tests; mask++) {
> -                               for (dst = 0; dst < num_tests; dst++) {
> -                                       ok = composite_test(dpy, win, pi, i,
> -                                           &pictures_10x10[src],
> -                                           &pictures_10x10[mask],
> -                                           &pictures_1x1[dst], FALSE, TRUE);
> -                                       RECORD_RESULTS();
> -                                       ok = composite_test(dpy, win, pi, i,
> -                                           &pictures_1x1[src],
> -                                           &pictures_10x10[mask],
> -                                           &pictures_1x1[dst], FALSE, TRUE);
> -                                       RECORD_RESULTS();
> -                                       ok = composite_test(dpy, win, pi, i,
> -                                           &pictures_10x10[src],
> -                                           &pictures_1x1[mask],
> -                                           &pictures_1x1[dst], FALSE, TRUE);
> -                                       RECORD_RESULTS();
> -                                       ok = composite_test(dpy, win, pi, i,
> -                                           &pictures_1x1[src],
> -                                           &pictures_1x1[mask],
> -                                           &pictures_1x1[dst], FALSE, TRUE);
> -                                       RECORD_RESULTS();
> -                               }
> -                           }
> -                       }
> -                   }
> +                   ok = composite_test(dpy, win, pi,
> +                                       test_ops, num_test_ops,
> +                                       test_src, num_test_src,
> +                                       test_mask, num_test_mask,
> +                                       test_dst, num_test_dst,
> +                                       FALSE, TRUE);
> +                   RECORD_RESULTS();
>                 }
>                 if (group_ok)
>                         success_mask |= TEST_COMPOSITE;
> @@ -609,47 +588,23 @@ do {                                                              \
>         if (enabled_tests & TEST_CACOMPOSITE) {
>                 Bool ok, group_ok = TRUE;
> 
> -               for (i = 0; i < num_ops; i++) {
> -                   if (ops[i].disabled)
> -                       continue;
> +               for (j = 0; j <= num_dests; j++) {
> +                   picture_info *pi;
> 
> -                   for (j = 0; j <= num_dests; j++) {
> -                       picture_info *pi;
> +                   if (j != num_dests)
> +                       pi = &dests[j];
> +                   else
> +                       pi = win;
> 
> -                       if (j != num_dests)
> -                               pi = &dests[j];
> -                       else
> -                               pi = win;
> -                       printf("Beginning %s composite CA mask test on %s\n",
> -                           ops[i].name, pi->name);
> +                   printf("Beginning composite CA mask test on %s\n", pi->name);
> 
> -                       for (src = 0; src < num_tests; src++) {
> -                           for (mask = 0; mask < num_tests; mask++) {
> -                               for (dst = 0; dst < num_tests; dst++) {
> -                                       ok = composite_test(dpy, win, pi, i,
> -                                           &pictures_10x10[src],
> -                                           &pictures_10x10[mask],
> -                                           &pictures_1x1[dst], TRUE, TRUE);
> -                                       RECORD_RESULTS();
> -                                       ok = composite_test(dpy, win, pi, i,
> -                                           &pictures_1x1[src],
> -                                           &pictures_10x10[mask],
> -                                           &pictures_1x1[dst], TRUE, TRUE);
> -                                       RECORD_RESULTS();
> -                                       ok = composite_test(dpy, win, pi, i,
> -                                           &pictures_10x10[src],
> -                                           &pictures_1x1[mask],
> -                                           &pictures_1x1[dst], TRUE, TRUE);
> -                                       RECORD_RESULTS();
> -                                       ok = composite_test(dpy, win, pi, i,
> -                                           &pictures_1x1[src],
> -                                           &pictures_1x1[mask],
> -                                           &pictures_1x1[dst], TRUE, TRUE);
> -                                       RECORD_RESULTS();
> -                               }
> -                           }
> -                       }
> -                   }
> +                   ok = composite_test(dpy, win, pi,
> +                                       test_ops, num_test_ops,
> +                                       test_src, num_test_src,
> +                                       test_mask, num_test_mask,
> +                                       test_dst, num_test_dst,
> +                                       TRUE, TRUE);
> +                   RECORD_RESULTS();
>                 }
>                 if (group_ok)
>                         success_mask |= TEST_CACOMPOSITE;
> @@ -772,6 +727,11 @@ do {                                                               \
>                 success_mask |= TEST_BUG7366;
>         }
> 
> +       free(test_ops);
> +       free(test_src);
> +       free(test_mask);
> +       free(test_dst);
> +
>         printf("%d tests passed of %d total\n", tests_passed, tests_total);
> 
>         return tests_passed == tests_total;
> commit dc32549256620a42b6e22a9f3a5ff27a785a827e
> Author: Chris Wilson <chris at chris-wilson.co.uk>
> Date:   Wed Dec 1 10:38:47 2010 +0000
> 
>     blend: Combine multiple tests into a single XGetImage request
> 
>     Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> 
> diff --git a/main.c b/main.c
> index 99d8441..9a97d72 100644
> --- a/main.c
> +++ b/main.c
> @@ -41,7 +41,7 @@ char **format_whitelist;
>  int pixmap_move_iter = 1;
> 
>  int win_width = 40;
> -int win_height = 40;
> +int win_height = 200;
> 
>  int
>  bit_count(int i)
> diff --git a/ops.c b/ops.c
> index ebcc770..0e03550 100644
> --- a/ops.c
> +++ b/ops.c
> @@ -205,8 +205,12 @@ calc_op(int op, double src, double dst, double srca, double dsta)
>  }
> 
>  void
> -do_composite(int op, color4d *src, color4d *mask, color4d *dst, color4d *result,
> -    Bool componentAlpha)
> +do_composite(int op,
> +            const color4d *src,
> +            const color4d *mask,
> +            const color4d *dst,
> +            color4d *result,
> +            Bool componentAlpha)
>  {
>         color4d srcval, srcalpha;
> 
> diff --git a/rendercheck.h b/rendercheck.h
> index bb35c5e..5b802a2 100644
> --- a/rendercheck.h
> +++ b/rendercheck.h
> @@ -106,7 +106,16 @@ void
>  color_correct(picture_info *pi, color4d *color);
> 
>  void
> -get_pixel(Display *dpy, picture_info *pi, int x, int y, color4d *color);
> +get_pixel(Display *dpy,
> +         const picture_info *pi,
> +         int x, int y,
> +         color4d *color);
> +
> +void
> +get_pixel_from_image(XImage *image,
> +                    const picture_info *pi,
> +                    int x, int y,
> +                    color4d *color);
> 
>  int
>  eval_diff(char *name, color4d *expected, color4d *test, int x, int y,
> @@ -125,13 +134,19 @@ copy_pict_to_win(Display *dpy, picture_info *pict, picture_info *win,
> 
>  /* ops.c */
>  void
> -do_composite(int op, color4d *src, color4d *mask, color4d *dst, color4d *result,
> -    Bool componentAlpha);
> +do_composite(int op,
> +            const color4d *src,
> +            const color4d *mask,
> +            const color4d *dst,
> +            color4d *result,
> +            Bool componentAlpha);
> 
>  /* The tests */
>  Bool
> -blend_test(Display *dpy, picture_info *win, picture_info *dst, int op,
> -    picture_info *src_color, picture_info *dst_color);
> +blend_test(Display *dpy, picture_info *win, picture_info *dst,
> +          const int *op, int num_op,
> +          const picture_info **src_color, int num_src,
> +          const picture_info **dst_color, int num_dst);
> 
>  Bool
>  composite_test(Display *dpy, picture_info *win, picture_info *dst, int op,
> diff --git a/t_blend.c b/t_blend.c
> index 94cce20..7847d07 100644
> --- a/t_blend.c
> +++ b/t_blend.c
> @@ -24,51 +24,94 @@
> 
>  #include "rendercheck.h"
> 
> -#define TEST_WIDTH     10
> -#define TEST_HEIGHT    10
> -
> -/* Test a composite of a given operation, source, and destination picture.
> - * Fills the window, and samples from the 0,0 pixel corner.
> - */
> +/* Test a composite of a given operation, source, and destination picture.  */
>  Bool
> -blend_test(Display *dpy, picture_info *win, picture_info *dst, int op,
> -    picture_info *src_color, picture_info *dst_color)
> +blend_test(Display *dpy, picture_info *win, picture_info *dst,
> +          const int *op, int num_op,
> +          const picture_info **src_color, int num_src,
> +          const picture_info **dst_color, int num_dst)
>  {
>         color4d expected, tested, tdst;
>         char testname[20];
> -       int i;
> +       int i, j, k, y, iter;
> 
> -       for (i = 0; i < pixmap_move_iter; i++) {
> -               XRenderComposite(dpy, PictOpSrc, dst_color->pict, 0,
> -                   dst->pict, 0, 0, 0, 0, 0, 0, TEST_WIDTH, TEST_HEIGHT);
> -               XRenderComposite(dpy, ops[op].op, src_color->pict, 0,
> -                   dst->pict, 0, 0, 0, 0, 0, 0, TEST_WIDTH, TEST_HEIGHT);
> -       }
> -       get_pixel(dpy, dst, 0, 0, &tested);
> -       copy_pict_to_win(dpy, dst, win, TEST_WIDTH, TEST_HEIGHT);
> +       k = y = 0;
> +       while (k < num_dst) {
> +           XImage *image;
> +           int k0 = k;
> +
> +           for (iter = 0; iter < pixmap_move_iter; iter++) {
> +               k = k0;
> +               y = 0;
> +               while (k < num_dst && y + num_src < win_height) {
> +                   XRenderComposite(dpy, PictOpSrc,
> +                                    dst_color[k]->pict, 0, dst->pict,
> +                                    0, 0,
> +                                    0, 0,
> +                                    0, y,
> +                                    num_op, num_src);
> +                   for (j = 0; j < num_src; j++) {
> +                       for (i = 0; i < num_op; i++) {
> +                           XRenderComposite(dpy, ops[op[i]].op,
> +                                            src_color[j]->pict, 0, dst->pict,
> +                                            0, 0,
> +                                            0, 0,
> +                                            i, y,
> +                                            1, 1);
> +                       }
> +                       y++;
> +                   }
> +                   k++;
> +               }
> +           }
> +
> +           image = XGetImage(dpy, dst->d,
> +                             0, 0, num_ops, y,
> +                             0xffffffff, ZPixmap);
> +           copy_pict_to_win(dpy, dst, win, win_width, win_height);
> 
> -       tdst = dst_color->color;
> -       color_correct(dst, &tdst);
> -       do_composite(ops[op].op, &src_color->color, NULL, &tdst, &expected,
> -           FALSE);
> -       color_correct(dst, &expected);
> +           y = 0;
> +           while (k0 < k) {
> +               tdst = dst_color[k0]->color;
> +               color_correct(dst, &tdst);
> 
> -       snprintf(testname, 20, "%s blend", ops[op].name);
> -       if (!eval_diff(testname, &expected, &tested, 0, 0, is_verbose)) {
> -               char srcformat[20];
> +               for (j = 0; j < num_src; j++) {
> +                   for (i = 0; i < num_op; i++) {
> +                       get_pixel_from_image(image, dst, i, y, &tested);
> 
> -               describe_format(srcformat, 20, src_color->format);
> -               printf("src color: %.2f %.2f %.2f %.2f (%s)\n"
> -                   "dst color: %.2f %.2f %.2f %.2f\n",
> -                   src_color->color.r, src_color->color.g,
> -                   src_color->color.b, src_color->color.a,
> -                   srcformat,
> -                   dst_color->color.r, dst_color->color.g,
> -                   dst_color->color.b, dst_color->color.a);
> -               printf("src: %s, dst: %s\n", src_color->name, dst->name);
> -               return FALSE;
> -       } else if (is_verbose) {
> -               printf("src: %s, dst: %s\n", src_color->name, dst->name);
> +                       do_composite(ops[op[i]].op,
> +                                    &src_color[j]->color,
> +                                    NULL,
> +                                    &tdst,
> +                                    &expected,
> +                                    FALSE);
> +                       color_correct(dst, &expected);
> +
> +                       snprintf(testname, 20, "%s blend", ops[op[i]].name);
> +                       if (!eval_diff(testname, &expected, &tested, 0, 0, is_verbose)) {
> +                           char srcformat[20];
> +
> +                           describe_format(srcformat, 20, src_color[j]->format);
> +                           printf("src color: %.2f %.2f %.2f %.2f (%s)\n"
> +                                  "dst color: %.2f %.2f %.2f %.2f\n",
> +                                  src_color[j]->color.r, src_color[j]->color.g,
> +                                  src_color[j]->color.b, src_color[j]->color.a,
> +                                  srcformat,
> +                                  dst_color[k0]->color.r, dst_color[k0]->color.g,
> +                                  dst_color[k0]->color.b, dst_color[k0]->color.a);
> +                           printf("src: %s, dst: %s\n", src_color[j]->name, dst->name);
> +                           return FALSE;
> +                       } else if (is_verbose) {
> +                           printf("src: %s, dst: %s\n", src_color[j]->name, dst->name);
> +                       }
> +                   }
> +                   y++;
> +               }
> +               k0++;
> +           }
> +
> +           XDestroyImage(image);
>         }
> +
>         return TRUE;
>  }
> diff --git a/tests.c b/tests.c
> index 47a10dc..0465e6d 100644
> --- a/tests.c
> +++ b/tests.c
> @@ -113,16 +113,16 @@ color_correct(picture_info *pi, color4d *color)
>  }
> 
>  void
> -get_pixel(Display *dpy, picture_info *pi, int x, int y, color4d *color)
> +get_pixel_from_image(XImage *image,
> +                    const picture_info *pi,
> +                    int x, int y,
> +                    color4d *color)
>  {
> -       XImage *image;
>         unsigned long val;
>         unsigned long rm, gm, bm, am;
>         XRenderDirectFormat *layout = &pi->format->direct;
> 
> -       image = XGetImage(dpy, pi->d, x, y, 1, 1, 0xffffffff, ZPixmap);
> -
> -       val = XGetPixel(image, 0, 0);
> +       val = XGetPixel(image, x, y);
> 
>         rm = (unsigned long)layout->redMask << layout->red;
>         gm = (unsigned long)layout->greenMask << layout->green;
> @@ -141,6 +141,18 @@ get_pixel(Display *dpy, picture_info *pi, int x, int y, color4d *color)
>                 color->g = 0.0;
>                 color->b = 0.0;
>         }
> +}
> +
> +void
> +get_pixel(Display *dpy,
> +         const picture_info *pi,
> +         int x, int y,
> +         color4d *color)
> +{
> +       XImage *image;
> +
> +       image = XGetImage(dpy, pi->d, x, y, 1, 1, 0xffffffff, ZPixmap);
> +       get_pixel_from_image(image, pi, 0, 0, color);
>         XDestroyImage(image);
>  }
> 
> @@ -497,43 +509,52 @@ do {                                                              \
> 
>         if (enabled_tests & TEST_BLEND) {
>                 Bool ok, group_ok = TRUE;
> +               int *blend_ops = malloc(sizeof(int)*num_ops);
> +               const picture_info **blend_src = malloc(sizeof(picture_info*)*(2*num_tests+num_colors));
> +               const picture_info **blend_dst = malloc(sizeof(picture_info*)*(num_tests+num_colors));
> +               int num_blend_ops = 0;
> +               int num_blend_src = 0;
> +               int num_blend_dst = 0;
> 
>                 for (i = 0; i < num_ops; i++) {
>                     if (ops[i].disabled)
>                         continue;
> 
> -                   for (j = 0; j <= num_dests; j++) {
> -                       picture_info *pi;
> +                   blend_ops[num_blend_ops++] = i;
> +               }
> 
> -                       if (j != num_dests)
> -                               pi = &dests[j];
> -                       else
> -                               pi = win;
> -                       printf("Beginning %s blend test on %s\n", ops[i].name,
> -                           pi->name);
> +               for (i = 0; i < num_tests; i++) {
> +                   blend_src[num_blend_src++] = &pictures_1x1[i];
> +                   blend_src[num_blend_src++] = &pictures_10x10[i];
> +                   blend_dst[num_blend_dst++] = &pictures_1x1[i];
> +               }
> +               for (i = 0; i < num_colors; i++) {
> +                   blend_src[num_blend_src++] = &pictures_solid[i];
> +                   blend_dst[num_blend_dst++] = &pictures_solid[i];
> +               }
> 
> -                       for (src = 0; src < num_tests; src++) {
> -                               for (dst = 0; dst < num_tests; dst++) {
> -                                       ok = blend_test(dpy, win, pi, i,
> -                                           &pictures_1x1[src],
> -                                           &pictures_1x1[dst]);
> -                                       RECORD_RESULTS();
> -                                       ok = blend_test(dpy, win, pi, i,
> -                                           &pictures_10x10[src],
> -                                           &pictures_1x1[dst]);
> -                                       RECORD_RESULTS();
> -                               }
> -                       }
> -                        for (src = 0; src < num_colors; src++) {
> -                            for (dst = 0; dst < num_colors; dst++) {
> -                                ok = blend_test(dpy, win, pi, i, &pictures_solid[src], &pictures_1x1[dst]);
> -                               RECORD_RESULTS();
> -                            }
> -                        }
> -                   }
> +               for (j = 0; j <= num_dests; j++) {
> +                   picture_info *pi;
> +
> +                   if (j != num_dests)
> +                       pi = &dests[j];
> +                   else
> +                       pi = win;
> +
> +                   printf("Beginning blend test on %s\n", pi->name);
> +
> +                   ok = blend_test(dpy, win, pi,
> +                                   blend_ops, num_blend_ops,
> +                                   blend_src, num_blend_src,
> +                                   blend_dst, num_blend_dst);
> +                   RECORD_RESULTS();
>                 }
>                 if (group_ok)
>                         success_mask |= TEST_BLEND;
> +
> +               free(blend_ops);
> +               free(blend_src);
> +               free(blend_dst);
>         }
> 
>         if (enabled_tests & TEST_COMPOSITE) {
> commit a040544669ba71d0eebff3492f21a3b40a1c419c
> Author: Chris Wilson <chris at chris-wilson.co.uk>
> Date:   Wed Dec 1 15:07:25 2010 +0000
> 
>     repeat: Specify test width/height rather than relying on win_width/height
> 
>     Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> 
> diff --git a/t_repeat.c b/t_repeat.c
> index fc9ceb7..92b95ea 100644
> --- a/t_repeat.c
> +++ b/t_repeat.c
> @@ -30,7 +30,10 @@
> 
>  #include "rendercheck.h"
> 
> -/* We choose some sizes larger than win_width/height because AAs like to turn
> +#define TEST_WIDTH 40
> +#define TEST_HEIGHT 40
> +
> +/* We choose some sizes larger than width/height because AAs like to turn
>   * off repeating when it's unnecessary and we want to make sure that those paths
>   * are sane.
>   */
> @@ -72,28 +75,32 @@ repeat_test(Display *dpy, picture_info *win, picture_info *dst, int op,
> 
>                 /* Fill to the first color */
>                 XRenderComposite(dpy, PictOpSrc, c1->pict, None, src.pict,
> -                   0, 0, 0, 0, 0, 0, w, h);
> +                                0, 0, 0, 0, 0, 0, w, h);
>                 /* And set the upper-left to the second color */
>                 XRenderComposite(dpy, PictOpSrc, c2->pict, None, src.pict,
> -                   0, 0, 0, 0, 0, 0, c2w, c2h);
> +                                0, 0, 0, 0, 0, 0, c2w, c2h);
> 
>                 for (i = 0; i < pixmap_move_iter; i++) {
>                         /* Fill to dst_color */
> -                       XRenderComposite(dpy, PictOpSrc, dst_color->pict, None,
> -                           dst->pict, 0, 0, 0, 0, 0, 0, win_width, win_height);
> -                       /* Composite the repeat picture in. */
> +                       XRenderComposite(dpy, PictOpSrc,
> +                                        dst_color->pict, None, dst->pict,
> +                                        0, 0, 0, 0, 0, 0,
> +                                        TEST_WIDTH, TEST_HEIGHT);
> +                       /* Composite the repeat picture in. */
>                         if (!test_mask) {
>                                 XRenderComposite(dpy, ops[op].op,
> -                                   src.pict, None, dst->pict, 0, 0, 0, 0, 0, 0,
> -                                   win_width, win_height);
> +                                                src.pict, None, dst->pict,
> +                                                0, 0, 0, 0, 0, 0,
> +                                                TEST_WIDTH, TEST_HEIGHT);
>                         } else {
>                                 /* Using PictOpSrc, color 0 (white), and
>                                  * component alpha, the mask color should be
>                                  * written to the destination.
>                                  */
>                                 XRenderComposite(dpy, ops[op].op,
> -                                   argb32white->pict, src.pict, dst->pict,
> -                                   0, 0, 0, 0, 0, 0, win_width, win_height);
> +                                                argb32white->pict, src.pict, dst->pict,
> +                                                0, 0, 0, 0, 0, 0,
> +                                                TEST_WIDTH, TEST_HEIGHT);
>                         }
>                 }
> 
> @@ -117,8 +124,8 @@ repeat_test(Display *dpy, picture_info *win, picture_info *dst, int op,
> 
>                 snprintf(name, 40, "%dx%d %s %s-repeat", w, h,
>                     ops[op].name, test_mask ? "mask" : "src");
> -               for (x = 0; x < win_width; x++) {
> -                   for (y = 0; y < win_height; y++) {
> +               for (x = 0; x < TEST_WIDTH; x++) {
> +                   for (y = 0; y < TEST_HEIGHT; y++) {
>                         int samplex = x % w;
>                         int sampley = y % h;
>                         color4d *expected, tested;
> _______________________________________________
> xorg-commit mailing list
> xorg-commit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/xorg-commit
> 


More information about the xorg-devel mailing list