103b705cfSriastradh#include <stdint.h>
203b705cfSriastradh#include <stdio.h>
303b705cfSriastradh#include <stdlib.h>
403b705cfSriastradh
503b705cfSriastradh#include <X11/Xutil.h> /* for XDestroyImage */
603b705cfSriastradh
703b705cfSriastradh#include "test.h"
803b705cfSriastradh
903b705cfSriastradh#define SIZE 20000
1003b705cfSriastradhstruct draw {
1103b705cfSriastradh	Pixmap a, b;
1203b705cfSriastradh	Picture pa, pb;
1303b705cfSriastradh	GC gc;
1403b705cfSriastradh	XRenderPictFormat *format;
1503b705cfSriastradh};
1603b705cfSriastradh
1703b705cfSriastradhstatic void target_init(struct test_display *t, struct draw *tt, int size)
1803b705cfSriastradh{
1903b705cfSriastradh	XRenderColor color;
2003b705cfSriastradh
2103b705cfSriastradh	tt->format = XRenderFindStandardFormat(t->dpy, PictStandardARGB32);
2203b705cfSriastradh
2303b705cfSriastradh	tt->a = XCreatePixmap(t->dpy, DefaultRootWindow(t->dpy),
2403b705cfSriastradh			      size, size, tt->format->depth);
2503b705cfSriastradh	tt->pa = XRenderCreatePicture(t->dpy, tt->a, tt->format, 0, NULL);
2603b705cfSriastradh
2703b705cfSriastradh	color.alpha = 0xffff;
2803b705cfSriastradh	color.red = 0xffff;
2903b705cfSriastradh	color.green = 0;
3003b705cfSriastradh	color.blue = 0;
3103b705cfSriastradh	XRenderFillRectangle(t->dpy, PictOpSrc, tt->pa, &color, 0, 0, size, size);
3203b705cfSriastradh
3303b705cfSriastradh	tt->b = XCreatePixmap(t->dpy, DefaultRootWindow(t->dpy),
3403b705cfSriastradh			      size, size, tt->format->depth);
3503b705cfSriastradh	tt->pb = XRenderCreatePicture(t->dpy, tt->b, tt->format, 0, NULL);
3603b705cfSriastradh
3703b705cfSriastradh	color.alpha = 0xffff;
3803b705cfSriastradh	color.red = 0;
3903b705cfSriastradh	color.green = 0;
4003b705cfSriastradh	color.blue = 0xffff;
4103b705cfSriastradh	XRenderFillRectangle(t->dpy, PictOpSrc, tt->pb, &color, 0, 0, size, size);
4203b705cfSriastradh}
4303b705cfSriastradh
4403b705cfSriastradhstatic void target_fini(struct test_display *t, struct draw *tt)
4503b705cfSriastradh{
4603b705cfSriastradh	XRenderFreePicture(t->dpy, tt->pa);
4703b705cfSriastradh	XFreePixmap(t->dpy, tt->a);
4803b705cfSriastradh
4903b705cfSriastradh	XRenderFreePicture(t->dpy, tt->pb);
5003b705cfSriastradh	XFreePixmap(t->dpy, tt->b);
5103b705cfSriastradh}
5203b705cfSriastradh
5303b705cfSriastradhint main(int argc, char **argv)
5403b705cfSriastradh{
5503b705cfSriastradh	struct test test;
5642542f5fSchristos	struct draw out, ref;
5703b705cfSriastradh	int size, i;
5803b705cfSriastradh
5903b705cfSriastradh	test_init(&test, argc, argv);
6003b705cfSriastradh
6103b705cfSriastradh	/* Copy back and forth betwenn two pixmaps, gradually getting larger */
6203b705cfSriastradh	for (size = 1; size <= SIZE; size = (size * 3 + 1) / 2) {
6342542f5fSchristos		target_init(&test.out, &out, size);
6403b705cfSriastradh		target_init(&test.ref, &ref, size);
6503b705cfSriastradh
6603b705cfSriastradh		printf("size=%d\n", size);
6703b705cfSriastradh		for (i = 0; i <= DEFAULT_ITERATIONS; i++) {
6842542f5fSchristos			int reps = REPS(i);
6903b705cfSriastradh			do {
7003b705cfSriastradh				int sx = rand() % (2*size) - size;
7103b705cfSriastradh				int sy = rand() % (2*size) - size;
7203b705cfSriastradh
7303b705cfSriastradh				int dx = rand() % (2*size) - size;
7403b705cfSriastradh				int dy = rand() % (2*size) - size;
7503b705cfSriastradh
7603b705cfSriastradh				int w = rand() % size;
7703b705cfSriastradh				int h = rand() % size;
7803b705cfSriastradh
7903b705cfSriastradh				int order = rand() & 1;
8003b705cfSriastradh
8142542f5fSchristos				XRenderComposite(test.out.dpy, PictOpSrc,
8242542f5fSchristos						 order ? out.pa : out.pb,
8303b705cfSriastradh						 0,
8442542f5fSchristos						 (!order) ? out.pa : out.pb,
8503b705cfSriastradh						 sx, sy,
8603b705cfSriastradh						 0, 0,
8703b705cfSriastradh						 dx, dy,
8803b705cfSriastradh						 w, h);
8903b705cfSriastradh
9003b705cfSriastradh				XRenderComposite(test.ref.dpy, PictOpSrc,
9103b705cfSriastradh						 order ? ref.pa : ref.pb,
9203b705cfSriastradh						 0,
9303b705cfSriastradh						 (!order) ? ref.pa : ref.pb,
9403b705cfSriastradh						 sx, sy,
9503b705cfSriastradh						 0, 0,
9603b705cfSriastradh						 dx, dy,
9703b705cfSriastradh						 w, h);
9803b705cfSriastradh			} while (--reps);
9903b705cfSriastradh		}
10003b705cfSriastradh
10103b705cfSriastradh		test_compare(&test,
10242542f5fSchristos			     out.a, out.format,
10303b705cfSriastradh			     ref.a, ref.format,
10403b705cfSriastradh			     0, 0, size, size,
10503b705cfSriastradh			     "");
10603b705cfSriastradh		test_compare(&test,
10742542f5fSchristos			     out.b, out.format,
10803b705cfSriastradh			     ref.b, ref.format,
10903b705cfSriastradh			     0, 0, size, size,
11003b705cfSriastradh			     "");
11103b705cfSriastradh
11242542f5fSchristos		target_fini(&test.out, &out);
11303b705cfSriastradh		target_fini(&test.ref, &ref);
11403b705cfSriastradh	}
11503b705cfSriastradh
11603b705cfSriastradh	return 0;
11703b705cfSriastradh}
118