summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2010-12-01 21:36:31 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2010-12-01 21:43:16 +0000
commit81d988f407ab997e0e43432b3e2a85820bbe2756 (patch)
tree3f523257ae63b5f6cf80031f0c1dbb3ebd4ed5d3
parentc285306dfaadb388706529623d171cc9fdde1b78 (diff)
composite: Handle more sources than available rows in the window
Group the sources into pages if we cannot fit them all onto a single window. Reported-by: Aaron Plattner <aplattner@nvidia.com> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--t_composite.c190
1 files changed, 102 insertions, 88 deletions
diff --git a/t_composite.c b/t_composite.c
index d305d1e..73133db 100644
--- a/t_composite.c
+++ b/t_composite.c
@@ -38,6 +38,14 @@ composite_test(Display *dpy, picture_info *win, picture_info *dst,
color4d expected, tested, tdst, tmsk;
char testname[40];
int i, s, m, d, iter;
+ int page, num_pages;
+
+ /* If the window is smaller than the number of sources to test,
+ * we need to break the sources up into pages.
+ *
+ * We however assume that the window will always be wider than num_ops.
+ */
+ num_pages = num_src / win_height + 1;
for (d = 0; d < num_dst; d++) {
tdst = dst_color[d]->color;
@@ -45,6 +53,7 @@ composite_test(Display *dpy, picture_info *win, picture_info *dst,
for (m = 0; m < num_mask; m++) {
XRenderDirectFormat mask_acc;
+ int this_src, rem_src;
XImage *image;
if (componentAlpha) {
@@ -55,101 +64,106 @@ composite_test(Display *dpy, picture_info *win, picture_info *dst,
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);
+ rem_src = num_src;
+ for (page = 0; page < num_pages; page++) {
+ this_src = rem_src / (num_pages - page);
+ 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, this_src);
+ for (s = 0; s < this_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) {
- XRenderPictureAttributes pa;
+ if (componentAlpha) {
+ XRenderPictureAttributes pa;
- pa.component_alpha = FALSE;
- XRenderChangePicture(dpy, mask_color[m]->pict,
- CPComponentAlpha, &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;
-
- 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);
-
- do_composite(ops[op[i]].op,
- &src_color[s]->color, &tmsk, &tdst,
- &expected, componentAlpha);
- color_correct(dst, &expected);
-
- 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;
+ image = XGetImage(dpy, dst->d,
+ 0, 0, num_op, this_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;
+
+ 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 < this_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);
+
+ do_composite(ops[op[i]].op,
+ &src_color[s]->color, &tmsk, &tdst,
+ &expected, componentAlpha);
+ color_correct(dst, &expected);
+
+ 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;
+ }
}
}
+ XDestroyImage(image);
+ rem_src -= this_src;
}
- XDestroyImage(image);
}
}