[Piglit] [PATCH 01/20] util: Generalize piglit_probe_image_{rgb, rgba}
Paul Berry
stereotype441 at gmail.com
Tue Jun 5 17:03:11 PDT 2012
This patch eliminates code duplication between
piglit_probe_image_rgb() and piglit_probe_image_rgba() by implementing
them both in terms of a common function, piglit_probe_image_color().
In addition to being able to test GL_RGB and GL_RGBA,
piglit_probe_image_color() should be able to test any color buffer
format (e.g. GL_RG or GL_LUMINANCE_ALPHA).
piglit_probe_image_color() makes use of a new function,
piglit_num_components(), to determine how many components a given base
internal format contains (e.g. piglit_num_components(GL_RGBA) == 4).
This function is exposed through piglit-util.h in case it can be
useful in writing tests.
---
tests/util/piglit-util-gl.c | 113 ++++++++++++++++++++++++++++---------------
tests/util/piglit-util.h | 2 +
2 files changed, 76 insertions(+), 39 deletions(-)
diff --git a/tests/util/piglit-util-gl.c b/tests/util/piglit-util-gl.c
index edbab9f..4b6f3fd 100644
--- a/tests/util/piglit-util-gl.c
+++ b/tests/util/piglit-util-gl.c
@@ -38,6 +38,32 @@
GLint piglit_ARBfp_pass_through = 0;
+unsigned
+piglit_num_components(GLenum base_format)
+{
+ switch (base_format) {
+ case GL_ALPHA:
+ case GL_DEPTH_COMPONENT:
+ case GL_INTENSITY:
+ case GL_LUMINANCE:
+ case GL_RED:
+ return 1;
+ case GL_DEPTH_STENCIL:
+ case GL_LUMINANCE_ALPHA:
+ case GL_RG:
+ return 2;
+ case GL_RGB:
+ return 3;
+ case GL_RGBA:
+ return 4;
+ default:
+ printf("Unknown num_components for %s\n",
+ piglit_get_gl_enum_name(base_format));
+ piglit_report_result(PIGLIT_FAIL);
+ return 0;
+ }
+}
+
/**
* Read a pixel from the given location and compare its RGBA value to the
* given expected values.
@@ -206,27 +232,57 @@ piglit_probe_rect_rgba_uint(int x, int y, int w, int h,
return 1;
}
+static void
+print_pixel(const float *pixel, unsigned components)
+{
+ int p;
+ for (p = 0; p < components; ++p)
+ printf(" %f", pixel[p]);
+}
+
int
-piglit_probe_image_rgb(int x, int y, int w, int h, const float *image)
+piglit_probe_image_color(int x, int y, int w, int h, GLenum format,
+ const float *image)
{
int i, j, p;
+ int c = piglit_num_components(format);
GLfloat *probe;
- GLfloat *pixels = malloc(w*h*3*sizeof(float));
+ GLfloat *pixels = malloc(w*h*c*sizeof(float));
+ float tolerance[4];
+ if (format == GL_INTENSITY) {
+ /* GL_INTENSITY is not allowed for ReadPixels so
+ * substitute GL_LUMINANCE.
+ */
+ format = GL_LUMINANCE;
+ }
+ switch (format) {
+ case GL_LUMINANCE_ALPHA:
+ tolerance[0] = piglit_tolerance[0];
+ tolerance[1] = piglit_tolerance[3];
+ break;
+ case GL_ALPHA:
+ tolerance[0] = piglit_tolerance[3];
+ break;
+ default:
+ for (p = 0; p < c; ++p)
+ tolerance[p] = piglit_tolerance[p];
+ }
- glReadPixels(x, y, w, h, GL_RGB, GL_FLOAT, pixels);
+ glReadPixels(x, y, w, h, format, GL_FLOAT, pixels);
for (j = 0; j < h; j++) {
for (i = 0; i < w; i++) {
- const float *expected = &image[(j*w+i)*3];
- probe = &pixels[(j*w+i)*3];
+ const float *expected = &image[(j*w+i)*c];
+ probe = &pixels[(j*w+i)*c];
- for (p = 0; p < 3; ++p) {
- if (fabs(probe[p] - expected[p]) >= piglit_tolerance[p]) {
+ for (p = 0; p < c; ++p) {
+ if (fabs(probe[p] - expected[p]) >= tolerance[p]) {
printf("Probe at (%i,%i)\n", x+i, y+j);
- printf(" Expected: %f %f %f\n",
- expected[0], expected[1], expected[2]);
- printf(" Observed: %f %f %f\n",
- probe[0], probe[1], probe[2]);
+ printf(" Expected:");
+ print_pixel(expected, c);
+ printf("\n Observed:");
+ print_pixel(probe, c);
+ printf("\n");
free(pixels);
return 0;
@@ -240,36 +296,15 @@ piglit_probe_image_rgb(int x, int y, int w, int h, const float *image)
}
int
-piglit_probe_image_rgba(int x, int y, int w, int h, const float *image)
+piglit_probe_image_rgb(int x, int y, int w, int h, const float *image)
{
- int i, j, p;
- GLfloat *probe;
- GLfloat *pixels = malloc(w*h*4*sizeof(float));
-
- glReadPixels(x, y, w, h, GL_RGBA, GL_FLOAT, pixels);
-
- for (j = 0; j < h; j++) {
- for (i = 0; i < w; i++) {
- const float *expected = &image[(j*w+i)*4];
- probe = &pixels[(j*w+i)*4];
-
- for (p = 0; p < 4; ++p) {
- if (fabs(probe[p] - expected[p]) >= piglit_tolerance[p]) {
- printf("Probe at (%i,%i)\n", x+i, y+j);
- printf(" Expected: %f %f %f %f\n",
- expected[0], expected[1], expected[2], expected[3]);
- printf(" Observed: %f %f %f %f\n",
- probe[0], probe[1], probe[2], probe[3]);
-
- free(pixels);
- return 0;
- }
- }
- }
- }
+ return piglit_probe_image_color(x, y, w, h, GL_RGB, image);
+}
- free(pixels);
- return 1;
+int
+piglit_probe_image_rgba(int x, int y, int w, int h, const float *image)
+{
+ return piglit_probe_image_color(x, y, w, h, GL_RGBA, image);
}
/**
diff --git a/tests/util/piglit-util.h b/tests/util/piglit-util.h
index 204a680..2d89775 100755
--- a/tests/util/piglit-util.h
+++ b/tests/util/piglit-util.h
@@ -207,6 +207,7 @@ void piglit_report_result(enum piglit_result result);
void piglit_require_gl_version(int required_version_times_10);
void piglit_require_extension(const char *name);
void piglit_require_not_extension(const char *name);
+unsigned piglit_num_components(GLenum base_format);
int piglit_probe_pixel_rgb_silent(int x, int y, const float* expected, float *out_probe);
int piglit_probe_pixel_rgba_silent(int x, int y, const float* expected, float *out_probe);
int piglit_probe_pixel_rgb(int x, int y, const float* expected);
@@ -216,6 +217,7 @@ int piglit_probe_rect_rgb_silent(int x, int y, int w, int h, const float *expect
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);
+int piglit_probe_image_color(int x, int y, int w, int h, GLenum format, const float *image);
int piglit_probe_image_rgb(int x, int y, int w, int h, const float *image);
int piglit_probe_image_rgba(int x, int y, int w, int h, const float *image);
int piglit_probe_texel_rect_rgb(int target, int level, int x, int y,
--
1.7.7.6
More information about the Piglit
mailing list