diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2013-12-02 10:43:51 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2013-12-02 17:11:06 +0000 |
commit | 49af22ee5533b1afbf30f50fcfd7245f1c8d98bc (patch) | |
tree | feffaa9416d81a129c15459603ab0a4e224643fb | |
parent | 3dae8b97151f1d08942ec690dac5a5008901d7d0 (diff) |
tests: Exercise tiled fills
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | test/.gitignore | 1 | ||||
-rw-r--r-- | test/Makefile.am | 1 | ||||
-rw-r--r-- | test/basic-tiledrect.c | 236 | ||||
-rw-r--r-- | test/test.h | 4 | ||||
-rw-r--r-- | test/test_display.c | 16 | ||||
-rw-r--r-- | test/test_render.c | 2 |
6 files changed, 250 insertions, 10 deletions
diff --git a/test/.gitignore b/test/.gitignore index 05bb9363..7a36837d 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -4,6 +4,7 @@ basic-fillrect basic-putimage basic-lines basic-stress +basic-tiledrect render-fill render-trapezoid render-trapezoid-image diff --git a/test/Makefile.am b/test/Makefile.am index 5c2a3e1e..033afd38 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,5 +1,6 @@ stress_TESTS = \ basic-fillrect \ + basic-tiledrect \ basic-rectangle \ basic-string \ basic-copyarea \ diff --git a/test/basic-tiledrect.c b/test/basic-tiledrect.c new file mode 100644 index 00000000..1596c4c1 --- /dev/null +++ b/test/basic-tiledrect.c @@ -0,0 +1,236 @@ +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> + +#include "test.h" + +static unsigned char bitmap4x4[] = { + 0x03, 0x06, 0x0c, 0x09 +}; + +static unsigned char bitmap8x8[3][8] = { + { 0xcc, 0x66, 0x33, 0x99, 0xcc, 0x66, 0x33, 0x99 }, + { 0x00, 0xfe, 0x92, 0x92, 0xfe, 0x92, 0x92, 0xfe }, + { 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa }, +}; + +static void fill_rect(struct test_target *t, uint8_t alu, + XRectangle *clip, int nclip, + uint8_t tile, int tx, int ty, + int x, int y, int w, int h, + uint32_t fg, uint32_t bg) +{ + Display *dpy = t->dpy->dpy; + XGCValues val; + GC gc; + + val.function = alu; + val.fill_style = FillTiled; + val.ts_x_origin = tx; + val.ts_y_origin = ty; + if (tile == 0) { + val.tile = XCreatePixmapFromBitmapData(dpy, t->draw, (char *)bitmap4x4, 4, 4, + fg, bg, t->depth); + } else { + char *b = (char *)bitmap8x8[tile-1]; + val.tile = XCreatePixmapFromBitmapData(dpy, t->draw, b, 8, 8, + fg, bg, t->depth); + } + + gc = XCreateGC(dpy, t->draw, GCFillStyle | GCTileStipXOrigin | GCTileStipYOrigin | GCTile | GCFunction, &val); + if (nclip) + XSetClipRectangles(dpy, gc, 0, 0, clip, nclip, Unsorted); + XFillRectangle(dpy, t->draw, gc, x, y, w, h); + XFreeGC(dpy, gc); + XFreePixmap(dpy, val.tile); +} + +static void clear(struct test_target *tt) +{ + XRenderColor render_color = {0}; + XRenderFillRectangle(tt->dpy->dpy, PictOpClear, tt->picture, &render_color, + 0, 0, tt->width, tt->height); +} + +static void unclipped_tests(struct test *t, int reps, int sets, enum target target) +{ + struct test_target real, ref; + int r, s; + + printf("Testing unclipped tiled fills (%s): ", test_target_name(target)); + fflush(stdout); + + test_target_create_render(&t->real, target, &real); + clear(&real); + + test_target_create_render(&t->ref, target, &ref); + clear(&ref); + + for (s = 0; s < sets; s++) { + for (r = 0; r < reps; r++) { + int x = rand() % real.width; + int y = rand() % real.height; + int w = rand() % (real.width - x); + int h = rand() % (real.height - y); + int tx = rand() % (2*real.width) - real.width; + int ty = rand() % (2*real.height) - real.height; + uint8_t tile = rand() % 4; + uint8_t alu = rand() % (GXset + 1); + uint32_t fg = rand(); + uint32_t bg = rand(); + + fill_rect(&real, alu, NULL, 0, + tile, tx, ty, + x, y, w, h, + fg, bg); + fill_rect(&ref, alu, NULL, 0, + tile, tx, ty, + x, y, w, h, + fg, bg); + } + + test_compare(t, + real.draw, real.format, + ref.draw, ref.format, + 0, 0, real.width, real.height, + ""); + } + + printf("passed [%d iterations x %d]\n", reps, sets); + + test_target_destroy_render(&t->real, &real); + test_target_destroy_render(&t->ref, &ref); +} + +static void simple_clip_tests(struct test *t, int reps, int sets, enum target target) +{ + struct test_target real, ref; + int r, s; + + printf("Testing simple clipped tiled fills (%s): ", test_target_name(target)); + fflush(stdout); + + test_target_create_render(&t->real, target, &real); + clear(&real); + + test_target_create_render(&t->ref, target, &ref); + clear(&ref); + + for (s = 0; s < sets; s++) { + for (r = 0; r < reps; r++) { + int x = rand() % (2*real.width) - real.width; + int y = rand() % (2*real.height) - real.height; + int w = rand() % (2*real.width); + int h = rand() % (2*real.height); + int tx = rand() % (2*real.width) - real.width; + int ty = rand() % (2*real.height) - real.height; + uint8_t tile = rand() % 4; + uint8_t alu = rand() % (GXset + 1); + uint32_t fg = rand(); + uint32_t bg = rand(); + + fill_rect(&real, alu, NULL, 0, + tile, tx, ty, + x, y, w, h, + fg, bg); + fill_rect(&ref, alu, NULL, 0, + tile, tx, ty, + x, y, w, h, + fg, bg); + } + + test_compare(t, + real.draw, real.format, + ref.draw, ref.format, + 0, 0, real.width, real.height, + ""); + } + + printf("passed [%d iterations x %d]\n", reps, sets); + + test_target_destroy_render(&t->real, &real); + test_target_destroy_render(&t->ref, &ref); +} + +static void complex_clip_tests(struct test *t, int reps, int sets, enum target target) +{ + struct test_target real, ref; + XRectangle *clip; + int nclip, r, s; + + printf("Testing complex clipped tiled fills (%s): ", test_target_name(target)); + fflush(stdout); + + test_target_create_render(&t->real, target, &real); + clear(&real); + + test_target_create_render(&t->ref, target, &ref); + clear(&ref); + + for (s = 0; s < sets; s++) { + nclip = (rand() % 16) + 2; + clip = malloc(sizeof(XRectangle)*nclip); + for (r = 0; r < nclip; r++) { + clip[r].x = rand() % real.width; + clip[r].y = rand() % real.height; + clip[r].width = rand() % (real.width - clip[r].x); + clip[r].height = rand() % (real.height - clip[r].y); + } + + for (r = 0; r < reps; r++) { + int x = rand() % (2*real.width) - real.width; + int y = rand() % (2*real.height) - real.height; + int w = rand() % (2*real.width); + int h = rand() % (2*real.height); + int tx = rand() % (2*real.width) - real.width; + int ty = rand() % (2*real.height) - real.height; + uint8_t tile = rand() % 4; + uint8_t alu = rand() % (GXset + 1); + uint32_t fg = rand(); + uint32_t bg = rand(); + + fill_rect(&real, alu, clip, nclip, + tile, tx, ty, + x, y, w, h, + fg, bg); + fill_rect(&ref, alu, clip, nclip, + tile, tx, ty, + x, y, w, h, + fg, bg); + } + + test_compare(t, + real.draw, real.format, + ref.draw, ref.format, + 0, 0, real.width, real.height, + ""); + + free(clip); + } + + printf("passed [%d iterations x %d]\n", reps, sets); + + test_target_destroy_render(&t->real, &real); + test_target_destroy_render(&t->ref, &ref); +} + +int main(int argc, char **argv) +{ + struct test test; + int i; + + test_init(&test, argc, argv); + + for (i = 0; i <= DEFAULT_ITERATIONS; i++) { + int reps = REPS(i), sets = SETS(i); + enum target t; + + for (t = TARGET_FIRST; t <= TARGET_LAST; t++) { + unclipped_tests(&test, reps, sets, t); + simple_clip_tests(&test, reps, sets, t); + complex_clip_tests(&test, reps, sets, t); + } + } + + return 0; +} diff --git a/test/test.h b/test/test.h index 3cd94576..568e000c 100644 --- a/test/test.h +++ b/test/test.h @@ -31,7 +31,7 @@ struct test { Window root; XShmSegmentInfo shm; int max_shm_size; - int width, height; + int width, height, depth; XRenderPictFormat *format; } real, ref; }; @@ -82,7 +82,7 @@ struct test_target { GC gc; XRenderPictFormat *format; Picture picture; - int width, height; + int width, height, depth; enum target target; }; diff --git a/test/test_display.c b/test/test_display.c index b5e7e06e..36cfe698 100644 --- a/test/test_display.c +++ b/test/test_display.c @@ -16,12 +16,12 @@ static Window get_root(struct test_display *t) * can guarantee we do not get clipped by children. */ attr.override_redirect = 1; - w= XCreateWindow(t->dpy, DefaultRootWindow(t->dpy), - 0, 0, t->width, t->height, 0, - DefaultDepth(t->dpy, DefaultScreen(t->dpy)), - InputOutput, - DefaultVisual(t->dpy, DefaultScreen(t->dpy)), - CWOverrideRedirect, &attr); + w = XCreateWindow(t->dpy, DefaultRootWindow(t->dpy), + 0, 0, t->width, t->height, 0, + DefaultDepth(t->dpy, DefaultScreen(t->dpy)), + InputOutput, + DefaultVisual(t->dpy, DefaultScreen(t->dpy)), + CWOverrideRedirect, &attr); XMapWindow(t->dpy, w); return w; @@ -125,6 +125,7 @@ static void default_setup(struct test_display *dpy) XRenderFindVisualFormat(dpy->dpy, DefaultVisual(dpy->dpy, DefaultScreen(dpy->dpy))); + dpy->depth = DefaultDepth(dpy->dpy, DefaultScreen(dpy->dpy)); } static void test_get_displays(int argc, char **argv, @@ -136,8 +137,7 @@ static void test_get_displays(int argc, char **argv, shm_setup(real); real->root = get_root(real); - ref->dpy = ref_display(real->width, real->height, - DefaultDepth(real->dpy, DefaultScreen(real->dpy))); + ref->dpy = ref_display(real->width, real->height, real->depth); default_setup(ref); shm_setup(ref); ref->root = get_root(ref); diff --git a/test/test_render.c b/test/test_render.c index 67889acc..926e930d 100644 --- a/test/test_render.c +++ b/test/test_render.c @@ -31,6 +31,7 @@ void test_target_create_render(struct test_display *dpy, tt->format = dpy->format; tt->width = dpy->width; tt->height = dpy->height; + tt->depth = dpy->depth; switch (target) { case ROOT: @@ -56,6 +57,7 @@ void test_target_create_render(struct test_display *dpy, tt->draw = XCreatePixmap(dpy->dpy, tt->draw, dpy->width, dpy->height, tt->format->depth); + tt->depth = 32; break; } |