summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNanley Chery <nanley.g.chery@intel.com>2015-07-06 16:09:21 -0700
committerNanley Chery <nanley.g.chery@intel.com>2015-10-05 16:05:04 -0700
commit1e258ce22523a25a3620631c0694aeb60772f98f (patch)
treebb9220bf31c83b1cffe5bfcd7fc8b95fbba586c6
parent1e35f1a1df6b164835c75b764b49533812b2f569 (diff)
util: Add a piglit_probe_rects_equal_rgba() function
This function compares two rectangles for equality. This is useful to compare the rendering of individual miplevels in a miptree while avoiding too much resource consumption. v2: insert spaces in addition operation (Chad). Reviewed-by: Chad Versace <chad.versace@intel.com> Signed-off-by: Nanley Chery <nanley.g.chery@intel.com>
-rw-r--r--tests/util/piglit-util-gl.c81
-rw-r--r--tests/util/piglit-util-gl.h31
2 files changed, 112 insertions, 0 deletions
diff --git a/tests/util/piglit-util-gl.c b/tests/util/piglit-util-gl.c
index db17b83c7..767767d09 100644
--- a/tests/util/piglit-util-gl.c
+++ b/tests/util/piglit-util-gl.c
@@ -1242,6 +1242,41 @@ piglit_probe_rect_rgb(int x, int y, int w, int h, const float *expected)
}
int
+piglit_probe_rects_equal(int x1, int y1, int x2, int y2,
+ int w, int h, GLenum format)
+{
+ int retval;
+ GLfloat *pixels;
+ int ncomponents, rect_size;
+
+ /* Allocate buffer large enough for two rectangles */
+ ncomponents = piglit_num_components(format);
+ rect_size = w * h * ncomponents;
+ pixels = malloc(2 * rect_size * sizeof(GLfloat));
+
+ /* Load the pixels into the buffer and compare */
+ /* We only need to do one glReadPixels if the images are adjacent */
+ if ((x1 + w) == x2 && y1 == y2) {
+ piglit_read_pixels_float(x1, y1, 2*w, h, format, pixels);
+ retval = piglit_compare_image_halves_color(2*w, h,
+ ncomponents,
+ piglit_tolerance,
+ pixels);
+ } else {
+ piglit_read_pixels_float(x1, y1, w, h, format, pixels);
+ piglit_read_pixels_float(x2, y2, w, h, format,
+ pixels + rect_size);
+ retval = piglit_compare_images_color(0, 0, w, h,
+ ncomponents,
+ piglit_tolerance,
+ pixels, pixels + rect_size);
+ }
+
+ free(pixels);
+ return retval;
+}
+
+int
piglit_probe_rect_rgba(int x, int y, int w, int h, const float *expected)
{
int i, j, p;
@@ -1378,6 +1413,52 @@ piglit_compute_probe_tolerance(GLenum format, float *tolerance)
}
}
+int
+piglit_compare_pixels(int x, int y, const float *expected, const float *probe,
+ const float *tolerance, int num_components)
+{
+ int p;
+
+ for (p = 0; p < num_components; ++p) {
+ if (fabs(probe[p] - expected[p]) >= tolerance[p]) {
+ printf("Probe at (%i,%i)\n", x, y);
+ printf(" Expected:");
+ print_pixel_float(expected, num_components);
+ printf("\n Observed:");
+ print_pixel_float(probe, num_components);
+ printf("\n");
+
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+int
+piglit_compare_image_halves_color(int w, int h, int num_components,
+ const float *tolerance,
+ const float *image)
+{
+ int i, j, half_width;
+
+ half_width = w/2;
+ for (j = 0; j < h; j++) {
+ for (i = 0; i < half_width; i++) {
+ const float *probe =
+ &image[(j*w+i)*num_components];
+ const float *expected =
+ &image[(j*w+half_width+i)*num_components];
+ if (!piglit_compare_pixels(i, j, expected, probe,
+ tolerance,
+ num_components))
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
/**
* Compare two in-memory floating-point images.
*/
diff --git a/tests/util/piglit-util-gl.h b/tests/util/piglit-util-gl.h
index ddba1bb69..f06438a8d 100644
--- a/tests/util/piglit-util-gl.h
+++ b/tests/util/piglit-util-gl.h
@@ -142,6 +142,27 @@ int piglit_probe_rect_rgba(int x, int y, int w, int h, const float* expected);
int piglit_probe_rect_rgba_int(int x, int y, int w, int h, const int* expected);
int piglit_probe_rect_rgba_uint(int x, int y, int w, int h, const unsigned int* expected);
void piglit_compute_probe_tolerance(GLenum format, float *tolerance);
+
+/**
+ * Compare two pixels.
+ * \param x the x coordinate of the pixel being probed
+ * \param y the y coordinate of the pixel being probed
+ */
+int piglit_compare_pixels(int x, int y, const float *expected, const float *probe,
+ const float *tolerance, int num_components);
+
+/**
+ * Compare two adjacent in-memory floating-point images.
+ * Adjacent means: y1 == y2 && x1 == x2 - w;
+ *
+ * \param w the width of the rectangle containing both images
+ * \param h the height of the rectangle containing both images
+ * \param images : the start of the buffer containing the observed image on
+ * the left and the expected image on the right
+ */
+int piglit_compare_image_halves_color(int w, int h, int num_components,
+ const float *tolerance,
+ const float *expected_observed_image);
int piglit_compare_images_color(int x, int y, int w, int h, int num_components,
const float *tolerance,
const float *expected_image,
@@ -171,6 +192,16 @@ 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);
+/**
+ * \brief Check if two rectangles are equivalent
+ *
+ * Given the coordinates of two rectangles, check that the two are equal.
+ * The first rectangle is what's observed, whereas the second rectangle is
+ * what's expected.
+ */
+int piglit_probe_rects_equal(int x1, int y1, int x2, int y2,
+ int w, int h, GLenum format);
+
bool piglit_probe_buffer(GLuint buf, GLenum target, const char *label,
unsigned n, unsigned num_components,
const float *expected);