[Piglit] [PATCH 09/18] util-gl: Add pixel comparison functions.

Fabian Bieler fabianbieler at fastmail.fm
Sun Jan 7 22:14:04 UTC 2018


Add two static functions to compare n-component float or ubyte color
values.

This is code easily shared between multiple probing functions.

Note: piglit_probe_rect_halves_equal_rgba was moved down to the other
probing functions in order to use one of the new functions without a forward
declaration.
---
 tests/util/piglit-util-gl.c | 349 +++++++++++++++++++++-----------------------
 1 file changed, 166 insertions(+), 183 deletions(-)

diff --git a/tests/util/piglit-util-gl.c b/tests/util/piglit-util-gl.c
index eb55b654b..0d2b7cabd 100644
--- a/tests/util/piglit-util-gl.c
+++ b/tests/util/piglit-util-gl.c
@@ -385,45 +385,6 @@ piglit_half_from_float(float val)
 	return result;
 }
 
-int
-piglit_probe_rect_halves_equal_rgba(int x, int y, int w, int h)
-{
-	int i, j, p;
-	GLfloat probe1[4];
-	GLfloat probe2[4];
-	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 / 2; i++) {
-			GLubyte *pixel1 = &pixels[4 * (j * w + i)];
-			GLubyte *pixel2 = &pixels[4 * (j * w + w / 2 + i)];
-
-			for (p = 0; p < 4; ++p) {
-				probe1[p] = pixel1[p] / 255.0f;
-				probe2[p] = pixel2[p] / 255.0f;
-			}
-
-			for (p = 0; p < 4; ++p) {
-				if (fabs(probe1[p] - probe2[p]) >= piglit_tolerance[p]) {
-					printf("Probe color at (%i,%i)\n", x+i, x+j);
-					printf("  Left: %f %f %f %f\n",
-					       probe1[0], probe1[1], probe1[2], probe1[3]);
-					printf("  Right: %f %f %f %f\n",
-					       probe2[0], probe2[1], probe2[2], probe2[3]);
-
-					free(pixels);
-					return 0;
-				}
-			}
-		}
-	}
-
-	free(pixels);
-	return 1;
-}
-
 
 /**
  * Return block size info for a specific texture compression format.
@@ -1146,12 +1107,22 @@ print_bad_pixel_float(int x, int y, int num_components,
 	printf("\n");
 }
 
+static bool
+compare_pixels_ubyte(const GLubyte *color1, const GLubyte *color2,
+		     const GLubyte *tolerance, int components)
+{
+	for (int p = 0; p < components; ++p)
+		if (abs((int)color1[p] - (int)color2[p]) > tolerance[p])
+			return false;
+	return true;
+}
+
 static bool
 compare_pixels_float(const float *color1, const float *color2,
-		     int components)
+		     const float *tolerance, int components)
 {
 	for (int p = 0; p < components; ++p)
-		if (fabsf(color1[p] - color2[p]) > piglit_tolerance[p])
+		if (fabsf(color1[p] - color2[p]) > tolerance[p])
 			return false;
 	return true;
 }
@@ -1160,14 +1131,11 @@ int
 piglit_probe_pixel_rgb_silent(int x, int y, const float* expected, float *out_probe)
 {
 	GLfloat probe[3];
-	int i;
-	GLboolean pass = GL_TRUE;
 
 	read_pixels_float(x, y, 1, 1, GL_RGB, probe);
 
-	for(i = 0; i < 3; ++i)
-		if (fabs(probe[i] - expected[i]) > piglit_tolerance[i])
-			pass = GL_FALSE;
+	bool pass =
+		compare_pixels_float(probe, expected, piglit_tolerance, 3);
 
 	if (out_probe)
 		memcpy(out_probe, probe, sizeof(probe));
@@ -1179,14 +1147,11 @@ int
 piglit_probe_pixel_rgba_silent(int x, int y, const float* expected, float *out_probe)
 {
 	GLfloat probe[4];
-	int i;
-	GLboolean pass = GL_TRUE;
 
 	read_pixels_float(x, y, 1, 1, GL_RGBA, probe);
 
-	for(i = 0; i < 4; ++i)
-		if (fabs(probe[i] - expected[i]) > piglit_tolerance[i])
-			pass = GL_FALSE;
+	bool pass =
+		compare_pixels_float(probe, expected, piglit_tolerance, 4);
 
 	if (out_probe)
 		memcpy(out_probe, probe, sizeof(probe));
@@ -1205,16 +1170,10 @@ int
 piglit_probe_pixel_rgb(int x, int y, const float* expected)
 {
 	GLfloat probe[3];
-	int i;
-	GLboolean pass = GL_TRUE;
 
 	read_pixels_float(x, y, 1, 1, GL_RGB, probe);
 
-	for(i = 0; i < 3; ++i)
-		if (fabs(probe[i] - expected[i]) > piglit_tolerance[i])
-			pass = GL_FALSE;
-
-	if (pass)
+	if (compare_pixels_float(probe, expected, piglit_tolerance, 3))
 		return 1;
 
 	print_bad_pixel_float(x, y, 3, expected, probe);
@@ -1233,16 +1192,10 @@ int
 piglit_probe_pixel_rgba(int x, int y, const float* expected)
 {
 	GLfloat probe[4];
-	int i;
-	GLboolean pass = GL_TRUE;
 
 	read_pixels_float(x, y, 1, 1, GL_RGBA, probe);
 
-	for(i = 0; i < 4; ++i)
-		if (fabs(probe[i] - expected[i]) > piglit_tolerance[i])
-			pass = GL_FALSE;
-
-	if (pass)
+	if (compare_pixels_float(probe, expected, piglit_tolerance, 4))
 		return 1;
 
 	print_bad_pixel_float(x, y, 4, expected, probe);
@@ -1272,7 +1225,7 @@ static bool
 probe_rect_ubyte(int x, int y, int w, int h, int num_components,
 			const float *fexpected, bool silent)
 {
-	int i, j, p;
+	int i, j;
 	GLubyte *probe;
 	GLubyte *pixels;
 	GLubyte tolerance[4];
@@ -1290,17 +1243,17 @@ probe_rect_ubyte(int x, int y, int w, int h, int num_components,
 		for (i = 0; i < w; i++) {
 			probe = &pixels[(j*w+i)*4];
 
-			for (p = 0; p < num_components; ++p) {
-				if (abs((int)probe[p] - (int)expected[p]) >= tolerance[p]) {
-					if (!silent) {
-						print_bad_pixel_ubyte(
-							x + i, y + j, 3,
-							expected, probe);
-					}
-					free(pixels);
-					return false;
-				}
+			if (compare_pixels_ubyte(probe, expected, tolerance,
+						 num_components))
+				continue;
+
+			if (!silent) {
+				print_bad_pixel_ubyte(
+					x + i, y + j, 3,
+					expected, probe);
 			}
+			free(pixels);
+			return false;
 		}
 	}
 
@@ -1311,7 +1264,7 @@ probe_rect_ubyte(int x, int y, int w, int h, int num_components,
 int
 piglit_probe_rect_rgb_silent(int x, int y, int w, int h, const float *expected)
 {
-	int i, j, p;
+	int i, j;
 	GLfloat *probe;
 	GLfloat *pixels;
 
@@ -1324,12 +1277,12 @@ piglit_probe_rect_rgb_silent(int x, int y, int w, int h, const float *expected)
 		for (i = 0; i < w; i++) {
 			probe = &pixels[(j*w+i)*3];
 
-			for (p = 0; p < 3; ++p) {
-				if (fabs(probe[p] - expected[p]) >= piglit_tolerance[p]) {
-					free(pixels);
-					return 0;
-				}
-			}
+			if (compare_pixels_float(probe, expected,
+						 piglit_tolerance, 3))
+				continue;
+
+			free(pixels);
+			return 0;
 		}
 	}
 
@@ -1371,7 +1324,7 @@ piglit_probe_rect_r_ubyte(int x, int y, int w, int h, GLubyte expected)
 int
 piglit_probe_rect_rgb(int x, int y, int w, int h, const float *expected)
 {
-	int i, j, p;
+	int i, j;
 	GLfloat *probe;
 	GLfloat *pixels;
 
@@ -1384,16 +1337,16 @@ piglit_probe_rect_rgb(int x, int y, int w, int h, const float *expected)
 		for (i = 0; i < w; i++) {
 			probe = &pixels[(j*w+i)*4];
 
-			for (p = 0; p < 3; ++p) {
-				if (fabs(probe[p] - expected[p]) >= piglit_tolerance[p]) {
-					print_bad_pixel_float(x + i, y + j, 3,
-							      expected,
-							      probe);
+			if (compare_pixels_float(probe, expected,
+						 piglit_tolerance, 3))
+				continue;
 
-					free(pixels);
-					return 0;
-				}
-			}
+			print_bad_pixel_float(x + i, y + j, 3,
+					      expected,
+					      probe);
+
+			free(pixels);
+			return 0;
 		}
 	}
 
@@ -1438,9 +1391,48 @@ piglit_probe_rects_equal(int x1, int y1, int x2, int y2,
 }
 
 int
-piglit_probe_rect_rgba(int x, int y, int w, int h, const float *expected)
+piglit_probe_rect_halves_equal_rgba(int x, int y, int w, int h)
 {
 	int i, j, p;
+	GLfloat probe1[4];
+	GLfloat probe2[4];
+	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 / 2; i++) {
+			GLubyte *pixel1 = &pixels[4 * (j * w + i)];
+			GLubyte *pixel2 = &pixels[4 * (j * w + w / 2 + i)];
+
+			for (p = 0; p < 4; ++p) {
+				probe1[p] = pixel1[p] / 255.0f;
+				probe2[p] = pixel2[p] / 255.0f;
+			}
+
+			if (compare_pixels_float(probe1, probe2,
+						 piglit_tolerance, 4))
+				continue;
+
+			printf("Probe color at (%i,%i)\n", x+i, x+j);
+			printf("  Left: %f %f %f %f\n",
+			       probe1[0], probe1[1], probe1[2], probe1[3]);
+			printf("  Right: %f %f %f %f\n",
+			       probe2[0], probe2[1], probe2[2], probe2[3]);
+
+			free(pixels);
+			return 0;
+		}
+	}
+
+	free(pixels);
+	return 1;
+}
+
+int
+piglit_probe_rect_rgba(int x, int y, int w, int h, const float *expected)
+{
+	int i, j;
 	GLfloat *probe;
 	GLfloat *pixels;
 
@@ -1453,16 +1445,16 @@ piglit_probe_rect_rgba(int x, int y, int w, int h, const float *expected)
 		for (i = 0; i < w; i++) {
 			probe = &pixels[(j*w+i)*4];
 
-			for (p = 0; p < 4; ++p) {
-				if (fabs(probe[p] - expected[p]) >= piglit_tolerance[p]) {
-					print_bad_pixel_float(x + i, y + j, 4,
-							      expected,
-							      probe);
+			if (compare_pixels_float(probe, expected,
+						 piglit_tolerance, 4))
+				continue;
 
-					free(pixels);
-					return 0;
-				}
-			}
+			print_bad_pixel_float(x + i, y + j, 4,
+					      expected,
+					      probe);
+
+			free(pixels);
+			return 0;
 		}
 	}
 
@@ -1553,8 +1545,10 @@ piglit_probe_rect_two_rgb(int x, int y, int w, int h,
 		for (int i = 0; i < w; i++) {
 			float *probe = &pixels[(j * w + i) * 4];
 
-			if (compare_pixels_float(probe, expected1, 3) ||
-			    compare_pixels_float(probe, expected2, 3))
+			if (compare_pixels_float(probe, expected1,
+						 piglit_tolerance, 3) ||
+			    compare_pixels_float(probe, expected2,
+						 piglit_tolerance, 3))
 				continue;
 
 			printf("Probe color at (%i,%i)\n", x + i, y + j);
@@ -1603,22 +1597,17 @@ 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_components_float(expected, num_components);
-			printf("\n  Observed:");
-			print_components_float(probe, num_components);
-			printf("\n");
+	if (compare_pixels_float(probe, expected, tolerance, num_components))
+		return 1;
 
-			return 0;
-		}
-	}
+	printf("Probe at (%i,%i)\n", x, y);
+	printf("  Expected:");
+	print_components_float(expected, num_components);
+	printf("\n  Observed:");
+	print_components_float(probe, num_components);
+	printf("\n");
 
-	return 1;
+	return 0;
 }
 
 int
@@ -1654,7 +1643,7 @@ piglit_compare_images_color(int x, int y, int w, int h, int num_components,
 			    const float *expected_image,
 			    const float *observed_image)
 {
-	int i, j, p;
+	int i, j;
 	for (j = 0; j < h; j++) {
 		for (i = 0; i < w; i++) {
 			const float *expected =
@@ -1664,19 +1653,18 @@ piglit_compare_images_color(int x, int y, int w, int h, int num_components,
 				&observed_image[((j + y) * w + i + x) *
 						num_components];
 
-			for (p = 0; p < num_components; ++p) {
-				if (fabs(probe[p] - expected[p])
-				    >= tolerance[p]) {
-					printf("Probe at (%i,%i)\n", x+i, y+j);
-					printf("  Expected:");
-					print_components_float(expected, num_components);
-					printf("\n  Observed:");
-					print_components_float(probe, num_components);
-					printf("\n");
+			if (compare_pixels_float(probe, expected, tolerance,
+						 num_components))
+				continue;
 
-					return 0;
-				}
-			}
+			printf("Probe at (%i,%i)\n", x+i, y+j);
+			printf("  Expected:");
+			print_components_float(expected, num_components);
+			printf("\n  Observed:");
+			print_components_float(probe, num_components);
+			printf("\n");
+
+			return 0;
 		}
 	}
 
@@ -1848,7 +1836,10 @@ piglit_probe_image_ubyte(int x, int y, int w, int h, GLenum format,
 {
 	const int c = piglit_num_components(format);
 	GLubyte *pixels = malloc(w * h * 4 * sizeof(GLubyte));
-	int i, j, p;
+	int i, j;
+	GLubyte tolerance[4];
+
+	array_float_to_ubyte_roundup(4, piglit_tolerance, tolerance);
 
 	glReadPixels(x, y, w, h, format, GL_UNSIGNED_BYTE, pixels);
 
@@ -1857,22 +1848,19 @@ piglit_probe_image_ubyte(int x, int y, int w, int h, GLenum format,
 			const GLubyte *expected = &image[(j * w + i) * c];
 			const GLubyte *probe = &pixels[(j * w + i) * c];
 
-			for (p = 0; p < c; ++p) {
-
-				const int tolerance = ceil(piglit_tolerance[p] * 255);
-				if (abs((int)probe[p] - (int)expected[p]) < tolerance)
-					continue;
+			if (compare_pixels_ubyte(probe, expected, tolerance,
+						 c))
+				continue;
 
-				printf("Probe at (%i,%i)\n", x + i, y + j);
-				printf("  Expected:");
-				print_components_ubyte(expected, c);
-				printf("\n  Observed:");
-				print_components_ubyte(probe, c);
-				printf("\n");
+			printf("Probe at (%i,%i)\n", x + i, y + j);
+			printf("  Expected:");
+			print_components_ubyte(expected, c);
+			printf("\n  Observed:");
+			print_components_ubyte(probe, c);
+			printf("\n");
 
-				free(pixels);
-				return 0;
-			}
+			free(pixels);
+			return 0;
 		}
 	}
 
@@ -1892,7 +1880,7 @@ int piglit_probe_texel_rect_rgb(int target, int level, int x, int y,
 {
 	GLfloat *buffer;
 	GLfloat *probe;
-	int i, j, p;
+	int i, j;
 	GLint width;
 	GLint height;
 
@@ -1911,16 +1899,12 @@ int piglit_probe_texel_rect_rgb(int target, int level, int x, int y,
 		for (i = x; i < x+w; ++i) {
 			probe = &buffer[(j * width + i) * 3];
 
-			for (p = 0; p < 3; ++p) {
-				if (fabs(probe[p] - expected[p]) >= piglit_tolerance[p]) {
-					print_bad_pixel_float(i, j, 3,
-							      expected,
-							      probe);
+			if (compare_pixels_float(probe, expected,
+						 piglit_tolerance, 3))
+				continue;
 
-					free(buffer);
-					return 0;
-				}
-			}
+			free(buffer);
+			return 0;
 		}
 	}
 
@@ -1953,7 +1937,7 @@ int piglit_probe_texel_rect_rgba(int target, int level, int x, int y,
 {
 	GLfloat *buffer;
 	GLfloat *probe;
-	int i, j, p;
+	int i, j;
 	GLint width;
 	GLint height;
 
@@ -1972,16 +1956,16 @@ int piglit_probe_texel_rect_rgba(int target, int level, int x, int y,
 		for (i = x; i < x+w; ++i) {
 			probe = &buffer[(j * width + i) * 4];
 
-			for (p = 0; p < 4; ++p) {
-				if (fabs(probe[p] - expected[p]) >= piglit_tolerance[p]) {
-					print_bad_pixel_float(i, j, 4,
-							      expected,
-							      probe);
+			if (compare_pixels_float(probe, expected,
+						 piglit_tolerance, 4))
+				continue;
 
-					free(buffer);
-					return 0;
-				}
-			}
+			print_bad_pixel_float(i, j, 4,
+					      expected,
+					      probe);
+
+			free(buffer);
+			return 0;
 		}
 	}
 
@@ -2015,7 +1999,7 @@ int piglit_probe_texel_volume_rgba(int target, int level, int x, int y, int z,
 {
 	GLfloat *buffer;
 	GLfloat *probe;
-	int i, j, k, p;
+	int i, j, k;
 	GLint width;
 	GLint height;
 	GLint depth;
@@ -2039,21 +2023,20 @@ int piglit_probe_texel_volume_rgba(int target, int level, int x, int y, int z,
 			for (i = x; i < x+w; ++i) {
 				probe = &buffer[(k * width * height + j * width + i) * 4];
 
-				for (p = 0; p < 4; ++p) {
-					if (fabs(probe[p] - expected[p]) >= piglit_tolerance[p]) {
-						printf("Probe color at (%i,%i,%i)\n", i, j, k);
-						printf("  Expected: ");
-						print_components_float(
-							expected, 4);
-						printf("\n  Observed: ");
-						print_components_float(probe,
-								       4);
-						printf("\n");
-
-						free(buffer);
-						return 0;
-					}
-				}
+				if (compare_pixels_float(probe, expected,
+							 piglit_tolerance, 4))
+					continue;
+
+				printf("Probe color at (%i,%i,%i)\n",
+				       i, j, k);
+				printf("  Expected: ");
+				print_components_float(expected, 4);
+				printf("\n  Observed: ");
+				print_components_float(probe, 4);
+				printf("\n");
+
+				free(buffer);
+				return 0;
 			}
 		}
 	}
-- 
2.15.1



More information about the Piglit mailing list