Add piglit_probe_rect_two_rgba.
This probe functions tests that all pixels in a rectangle are one of two
specified colors.

This is useful to test that two draw operations behave identically:
To use it clear the framebuffer, enable blending and make each draw operation
paint one color channel.
Then call piglit_probe_rect_two_rgba to determine that the framebuffer is either
the clear color or the combined color of both operations.
---
 tests/util/piglit-util-gl-common.c | 51 ++++++++++++++++++++++++++++++++++++++
 tests/util/piglit-util-gl-common.h |  2 ++
 2 files changed, 53 insertions(+)

diff --git a/tests/util/piglit-util-gl-common.c 
b/tests/util/piglit-util-gl-common.c
index 82ae820..0a01d5c 100644
--- a/tests/util/piglit-util-gl-common.c
+++ b/tests/util/piglit-util-gl-common.c
@@ -440,6 +440,57 @@ piglit_probe_rect_halves_equal_rgba(int x, int y, int w, 
int h)
 
 
 /**
+ * Checks that all pixels in a rectangular part of the framebuffer are one of
+ * two colors.
+ * \param  x, y, w, h the rectangle to test
+ * \param  expected1, expected2 the two expected colors
+ * \return 1 if all pixels in the rectangle are one of the expected colors,
+ *         0 otherwise.
+ */
+int
+piglit_probe_rect_two_rgba(int x, int y, int w, int h,
+                          const float* expected1, const float* expected2)
+{
+       int i, j, p;
+       GLubyte *probe;
+       GLubyte *pixels = malloc(w*h*4*sizeof(GLubyte));
+
+       glReadPixels(x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+
+       for (j = 0; j < h; j++) {
+               for (i = 0; i < w; i++) {
+                       probe = &pixels[(j*w+i)*4];
+
+                       for (p = 0; p < 4; ++p) {
+                               if ((fabs(probe[p]/255.0 - expected1[p]) <
+                                    piglit_tolerance[p]) ||
+                                   (fabs(probe[p]/255.0 - expected2[p]) <
+                                    piglit_tolerance[p]))
+                                       continue;
+
+                               printf("Probe color at (%i,%i)\n", x+i, y+j);
+                               printf("  Expected: %f %f %f %f\n",
+                                      expected1[0], expected1[1],
+                                      expected1[2], expected1[3]);
+                               printf("        or: %f %f %f %f\n",
+                                      expected2[0], expected2[1],
+                                      expected2[2], expected2[3]);
+                               printf("  Observed: %f %f %f %f\n",
+                                      probe[0]/255.0, probe[1]/255.0,
+                                      probe[2]/255.0, probe[3]/255.0);
+
+                               free(pixels);
+                               return 0;
+                       }
+               }
+       }
+
+       free(pixels);
+       return 1;
+}
+
+
+/**
  * Return block size info for a specific texture compression format.
  * \param  bw returns the block width, in pixels
  * \param  bh returns the block height, in pixels
diff --git a/tests/util/piglit-util-gl-common.h 
b/tests/util/piglit-util-gl-common.h
index aa21391..02eeae7 100644
--- a/tests/util/piglit-util-gl-common.h
+++ b/tests/util/piglit-util-gl-common.h
@@ -145,6 +145,8 @@ int piglit_probe_rect_depth(int x, int y, int w, int h, 
float expected);
 int piglit_probe_pixel_stencil(int x, int y, unsigned expected);
 int piglit_probe_rect_stencil(int x, int y, int w, int h, unsigned expected);
 int piglit_probe_rect_halves_equal_rgba(int x, int y, int w, int h);
+int piglit_probe_rect_two_rgba(int x, int y, int w, int h,
+                              const float* expected1, const float* expected2);
 
 int piglit_use_fragment_program(void);
 int piglit_use_vertex_program(void);
-- 
1.8.1.2

_______________________________________________
Piglit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to