[Piglit] [PATCH 01/20] util: Generalize piglit_probe_image_{rgb, rgba}
Anuj Phogat
anuj.phogat at gmail.com
Tue Jun 5 21:13:44 PDT 2012
On Tue, Jun 5, 2012 at 5:03 PM, Paul Berry <stereotype441 at gmail.com> wrote:
>
> 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
>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit
Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>
More information about the Piglit
mailing list