[Piglit] [PATCH 1/2] Add a test of MSAA-to-MSAA blits.

Anuj Phogat anuj.phogat at gmail.com
Wed May 9 14:58:52 PDT 2012


On Wed, May 9, 2012 at 12:55 PM, Paul Berry <stereotype441 at gmail.com> wrote:
> This test verifies that a simple blit from one MSAA framebuffer to
> another work properly.
> ---
>  tests/all.tests                                    |    7 +
>  .../ext_framebuffer_multisample/CMakeLists.gl.txt  |    1 +
>  .../multisample-blit.cpp                           |  178 ++++++++++++++++++++
>  3 files changed, 186 insertions(+), 0 deletions(-)
>  create mode 100644 tests/spec/ext_framebuffer_multisample/multisample-blit.cpp
>
> diff --git a/tests/all.tests b/tests/all.tests
> index c943846..07ba1b8 100644
> --- a/tests/all.tests
> +++ b/tests/all.tests
> @@ -1324,6 +1324,13 @@ for num_samples in (2, 4, 8, 16, 32):
>                         test_name)
>                 ext_framebuffer_multisample[test_name] = PlainExecTest(executable)
>
> +for num_samples in (2, 4, 8, 16, 32):
> +        for buffer_type in ('color', 'depth', 'stencil'):
> +                test_name = ' ' .join(['multisample-blit', str(num_samples), buffer_type])
> +                executable = 'ext_framebuffer_multisample-{0} -auto'.format(
> +                        test_name)
> +                ext_framebuffer_multisample[test_name] = PlainExecTest(executable)
> +
>  ext_framebuffer_object = Group()
>  spec['EXT_framebuffer_object'] = ext_framebuffer_object
>  add_fbo_stencil_tests(ext_framebuffer_object, 'GL_STENCIL_INDEX1')
> diff --git a/tests/spec/ext_framebuffer_multisample/CMakeLists.gl.txt b/tests/spec/ext_framebuffer_multisample/CMakeLists.gl.txt
> index 3e38342..1dce723 100644
> --- a/tests/spec/ext_framebuffer_multisample/CMakeLists.gl.txt
> +++ b/tests/spec/ext_framebuffer_multisample/CMakeLists.gl.txt
> @@ -14,6 +14,7 @@ link_libraries (
>  piglit_add_executable (ext_framebuffer_multisample-accuracy common.cpp accuracy.cpp)
>  piglit_add_executable (ext_framebuffer_multisample-dlist dlist.c)
>  piglit_add_executable (ext_framebuffer_multisample-minmax minmax.c)
> +piglit_add_executable (ext_framebuffer_multisample-multisample-blit common.cpp multisample-blit.cpp)
>  piglit_add_executable (ext_framebuffer_multisample-negative-copypixels negative-copypixels.c)
>  piglit_add_executable (ext_framebuffer_multisample-negative-copyteximage negative-copyteximage.c)
>  piglit_add_executable (ext_framebuffer_multisample-negative-max-samples negative-max-samples.c)
> diff --git a/tests/spec/ext_framebuffer_multisample/multisample-blit.cpp b/tests/spec/ext_framebuffer_multisample/multisample-blit.cpp
> new file mode 100644
> index 0000000..602b52a
> --- /dev/null
> +++ b/tests/spec/ext_framebuffer_multisample/multisample-blit.cpp
> @@ -0,0 +1,178 @@
> +/*
> + * Copyright © 2012 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + */
> +#include "common.h"
> +
> +/**
> + * \file multisample-blit.cpp
> + *
> + * Verify the accuracy of blitting from an MSAA buffer to another MSAA
> + * buffer.
> + *
> + * This test operates by drawing a test image in an MSAA buffer,
> + * blitting it to a second MSAA buffer, and then blitting it to the
> + * window system framebuffer (which is non-MSAA).
> + *
> + * To verify that the MSAA-to-MSAA blit worked properly, we also do a
> + * blit straight from the MSAA buffer to the window system
> + * framebuffer--this should produce the same image.
> + */
> +int piglit_width = 512; int piglit_height = 256;
> +int piglit_window_mode =
> +       GLUT_DOUBLE | GLUT_RGBA | GLUT_ALPHA | GLUT_DEPTH | GLUT_STENCIL;
> +
> +const int pattern_width = 256; const int pattern_height = 256;
> +
> +Fbo src_fbo;
> +Fbo dst_fbo;
> +TestPattern *test_pattern = NULL;
> +ManifestProgram *manifest_program = NULL;
> +GLbitfield buffer_to_test;
> +
> +void
> +print_usage_and_exit(char *prog_name)
> +{
> +       printf("Usage: %s <num_samples> <buffer_type>\n"
> +              "  where <buffer_type> is one of:\n"
> +              "    color\n"
> +              "    stencil\n"
> +              "    depth\n",
> +              prog_name);
> +       piglit_report_result(PIGLIT_FAIL);
> +}
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> +       int num_samples;
> +       if (argc < 3)
> +               print_usage_and_exit(argv[0]);
> +       {
> +               char *endptr = NULL;
> +               num_samples = strtol(argv[1], &endptr, 0);
> +               if (endptr != argv[1] + strlen(argv[1]))
> +                       print_usage_and_exit(argv[0]);
> +       }
> +
> +       piglit_require_gl_version(30);
> +       piglit_require_GLSL_version(130);
> +
> +       /* Skip the test if num_samples > GL_MAX_SAMPLES */
> +       GLint max_samples;
> +       glGetIntegerv(GL_MAX_SAMPLES, &max_samples);
> +       if (num_samples > max_samples)
> +               piglit_report_result(PIGLIT_SKIP);
> +
> +       if (strcmp(argv[2], "color") == 0) {
> +               test_pattern = new Triangles();
> +               buffer_to_test = GL_COLOR_BUFFER_BIT;
> +       } else if (strcmp(argv[2], "depth") == 0) {
> +               test_pattern = new DepthSunburst();
> +               manifest_program = new ManifestDepth();
> +               buffer_to_test = GL_DEPTH_BUFFER_BIT;
> +       } else if (strcmp(argv[2], "stencil") == 0) {
> +               test_pattern = new StencilSunburst();
> +               manifest_program = new ManifestStencil();
> +               buffer_to_test = GL_STENCIL_BUFFER_BIT;
> +       } else {
> +               print_usage_and_exit(argv[0]);
> +       }
> +       test_pattern->compile();
> +       if (manifest_program)
> +               manifest_program->compile();
> +
> +       src_fbo.init(num_samples, pattern_width, pattern_height,
> +                    true /* combine_depth_stencil */,
> +                    false /* attach_texture */);
> +       dst_fbo.init(num_samples, pattern_width, pattern_height,
> +                    true /* combine_depth_stencil */,
> +                    false /* attach_texture */);
> +}
> +
> +enum piglit_result
> +piglit_display()
> +{
> +       bool pass = true;
> +
> +       /* Draw the test pattern in src_fbo. */
> +       float proj[4][4] = {
> +               { 1, 0, 0, 0 },
> +               { 0, 1, 0, 0 },
> +               { 0, 0, 1, 0 },
> +               { 0, 0, 0, 1 }
> +       };
> +       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, src_fbo.handle);
> +       src_fbo.set_viewport();
> +       test_pattern->draw(proj);
> +
> +       /* Blit from src_fbo to dst_fbo. */
> +       glBindFramebuffer(GL_READ_FRAMEBUFFER, src_fbo.handle);
> +       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, dst_fbo.handle);
> +       glBlitFramebuffer(0, 0, pattern_width, pattern_height,
> +                         0, 0, pattern_width, pattern_height,
> +                         buffer_to_test, GL_NEAREST);
> +
> +       /* If necessary, manifest the depth/stencil image in dst_fbo
> +        * into a color image.  This ensures that the blit that
> +        * follows will depend on all samples of each pixel.
> +        */
> +       dst_fbo.set_viewport();
> +       if (manifest_program)
> +               manifest_program->run();
> +
> +       /* Blit from dst_fbo to the left half of the window system
> +        * framebuffer.  This is the test image.
> +        */
> +       glBindFramebuffer(GL_READ_FRAMEBUFFER, dst_fbo.handle);
> +       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
> +       glBlitFramebuffer(0, 0, pattern_width, pattern_height,
> +                         0, 0, pattern_width, pattern_height,
> +                         GL_COLOR_BUFFER_BIT, GL_NEAREST);
> +
> +       /* Now manifest the image in src_fbo and blit it directly to
> +        * the window system framebuffer.  This is the reference
> +        * image.
> +        */
> +       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, src_fbo.handle);
> +       src_fbo.set_viewport();
> +       if (manifest_program)
> +               manifest_program->run();
> +       glBindFramebuffer(GL_READ_FRAMEBUFFER, src_fbo.handle);
> +       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
> +       glBlitFramebuffer(0, 0, pattern_width, pattern_height,
> +                         pattern_width, 0, 2*pattern_width, pattern_height,
> +                         GL_COLOR_BUFFER_BIT, GL_NEAREST);
> +
> +       /* Check that the left and right halves of the screen match.
> +        * If they don't, then there must have been a problem blitting
> +        * from src_fbo to dst_fbo.
> +        */
> +       glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
> +       pass = piglit_probe_rect_halves_equal_rgba(0, 0, piglit_width,
> +                                                  piglit_height) && pass;
> +
> +       pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
> +
> +       piglit_present_results();
> +
> +       return pass ? PIGLIT_PASS : PIGLIT_FAIL;
> +}
> --
> 1.7.7.6

I included this as sub test (only for color buffer blits) in a patch
posted on May 7:
[PATCH] Add test to verify glBlitFramebuffer with multisample
framebuffer objects.
In this patch, I am just clearing the multisample buffers to unique
colors to do the testing.
This patch definitely require an update after the recent splitting of
accuracy test. I would
love to see your comments to improve this patch.

Your patch looks better to me as it includes testing of depth and
stencil buffer blits as well.
Keeping the clear color version of same test has no added advantage.
So, I will exclude this
test case from the list of sub tests in above mentioned patch.

Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>


More information about the Piglit mailing list