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