[Piglit] [PATCH 05/16] msaa/formats: Adapt glReadPixels() call to handle integer formats.

Anuj Phogat anuj.phogat at gmail.com
Fri Jun 22 12:00:02 PDT 2012


On Fri, Jun 15, 2012 at 8:32 AM, Paul Berry <stereotype441 at gmail.com> wrote:
> This patch adapts the MSAA "formats" test to pass the proper
> parameters to glReadPixels() when checking that the proper image has
> been rendered.  Since glReadPixels() requires an integral type when
> reading pixels from an integer framebuffer, we read the pixels into a
> temporary integer buffer and then copy them (using the CPU) into a
> floating point buffer for comparison to the reference image.
> ---
>  tests/spec/ext_framebuffer_multisample/formats.cpp |   54 ++++++++++++++++++--
>  1 files changed, 50 insertions(+), 4 deletions(-)
>
> diff --git a/tests/spec/ext_framebuffer_multisample/formats.cpp b/tests/spec/ext_framebuffer_multisample/formats.cpp
> index dc46038..fc8d2a5 100644
> --- a/tests/spec/ext_framebuffer_multisample/formats.cpp
> +++ b/tests/spec/ext_framebuffer_multisample/formats.cpp
> @@ -203,6 +203,37 @@ PatternRenderer::draw()
>
>
>  /**
> + * Return the integer base format corresponding to a given base
> + * format.
> + */
> +GLenum
> +integer_base_format(GLenum base_format)
> +{
> +       switch (base_format) {
> +       case GL_RED:
> +               return GL_RED_INTEGER_EXT;
> +       case GL_RG:
> +               return GL_RG_INTEGER;
> +       case GL_RGB:
> +               return GL_RGB_INTEGER;
> +       case GL_RGBA:
> +               return GL_RGBA_INTEGER;
> +       case GL_ALPHA:
> +               return GL_ALPHA_INTEGER;
> +       case GL_LUMINANCE:
> +               return GL_LUMINANCE_INTEGER_EXT;
> +       case GL_LUMINANCE_ALPHA:
> +               return GL_LUMINANCE_ALPHA_INTEGER_EXT;
> +       default:
> +               printf("Unexpected integer base_format: %s\n",
> +                      piglit_get_gl_enum_name(base_format));
> +               piglit_report_result(PIGLIT_FAIL);
> +               return 0;
> +       }
> +}
> +
> +
> +/**
>  * Read the image from the downsampled FBO into a newly allocated
>  * array of floats and return it.
>  */
> @@ -210,8 +241,8 @@ float *
>  PatternRenderer::read_image(GLenum base_format)
>  {
>        unsigned components = piglit_num_components(base_format);
> -       unsigned size = sizeof(float)*components*pattern_width*pattern_height;
> -       float *image = (float *) malloc(size);
> +       unsigned array_size = components*pattern_width*pattern_height;
> +       float *image = (float *) malloc(sizeof(float)*array_size);
>        glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo_downsampled.handle);
>        if (base_format == GL_INTENSITY) {
>                /* GL_INTENSITY is not allowed for ReadPixels so
> @@ -219,8 +250,23 @@ PatternRenderer::read_image(GLenum base_format)
>                 */
>                base_format = GL_LUMINANCE;
>        }
> -       glReadPixels(0, 0, pattern_width, pattern_height, base_format, GL_FLOAT,
> -                    image);
> +       if (component_type == GL_INT || component_type == GL_UNSIGNED_INT) {
> +               int *tmp = (int *) malloc(sizeof(int)*array_size);
> +               glReadPixels(0, 0, pattern_width, pattern_height,
> +                            integer_base_format(base_format),
> +                            component_type, tmp);
> +               if (component_type == GL_INT) {
> +                       for (unsigned i = 0; i < array_size; ++i)
> +                               image[i] = tmp[i];
> +               } else {
> +                       for (unsigned i = 0; i < array_size; ++i)
> +                               image[i] = (unsigned) tmp[i];
> +               }
> +               free(tmp);
> +       } else {
> +               glReadPixels(0, 0, pattern_width, pattern_height, base_format,
> +                            GL_FLOAT, image);
> +       }
>        return image;
>  }
>
> --
> 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