[Piglit] [PATCH 4/4] Add test to draw multisample polygons with GL_POLYGON_SMOOTH enabled

Paul Berry stereotype441 at gmail.com
Tue May 22 09:13:02 PDT 2012


On 18 May 2012 16:57, Anuj Phogat <anuj.phogat at gmail.com> wrote:

> This test varifies that GL_POLYGON_SMOOTH is ignored in case of multisample
> polygons.
>
> Note: Multisample polygons renders fine but I couldn't draw smooth polygons
> using AMD's catalyst drivers. This test passes on AMD's catalyst drivers
> because smooth polygons are anyway not working. I also couldn't draw smooth
> polygons using mesa drivers on my Sandybridge laptop.
>

This test fails on my nVidia system, but not because of a problem with
GL_POLYGON_SMOOTH.  It fails because when nVidia driver blits from an MSAA
framebuffer to a non-MSAA framebuffer, it chooses a different blending
function based on whether or not the non-MSAA framebuffer uses sRGB.  If
the non-MSAA framebuffer doesn't use sRGB, it uses straightforward linear
blending.  If it *does* use sRGB, it uses a more complex blending function
that produces more perceptually pleasing results on monitors with an sRGB
gamma characteristic.  The nVidia driver sets up the default framebuffer as
sRGB, so when you blit from your MSAA framebuffer directly to the screen,
you're getting the more complex blending function.  But
test->measure_accuracy() assumes straightforward linear blending, so the
test fails.

I think the key problem here is that the test is checking two independent
things: (a) that multisample antialiasing happens correctly when polygon
smoothing is disabled, and (b) that MSAA drawing produces the same image
regardless of whether polygon smoothing is enabled.  Part (a) is failing on
nVidia because of this subtle sRGB problem, but part (a) is not really
something we need to test here; it's already adequately tested by the
ext_framebuffer_multisample-accuracy test.  Part (b) is passing on nVidia.

I would recommend just dropping part (a) of the test.


>
> Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
> ---
>  tests/all.tests                                    |    7 +
>  .../ext_framebuffer_multisample/CMakeLists.gl.txt  |    1 +
>  .../ext_framebuffer_multisample/polygon-smooth.cpp |  218
> ++++++++++++++++++++
>  3 files changed, 226 insertions(+), 0 deletions(-)
>  create mode 100644
> tests/spec/ext_framebuffer_multisample/polygon-smooth.cpp
>
> diff --git a/tests/all.tests b/tests/all.tests
> index 0540b9c..7beb01d 100644
> --- a/tests/all.tests
> +++ b/tests/all.tests
> @@ -1350,6 +1350,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(['polygon-smooth',
> 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 6ced83b..e1802b2 100644
> --- a/tests/spec/ext_framebuffer_multisample/CMakeLists.gl.txt
> +++ b/tests/spec/ext_framebuffer_multisample/CMakeLists.gl.txt
> @@ -22,6 +22,7 @@ piglit_add_executable
> (ext_framebuffer_multisample-negative-max-samples negative
>  piglit_add_executable
> (ext_framebuffer_multisample-negative-mismatched-samples
> negative-mismatched-samples.c)
>  piglit_add_executable (ext_framebuffer_multisample-negative-readpixels
> negative-readpixels.c)
>  piglit_add_executable (ext_framebuffer_multisample-point-smooth
> common.cpp point-smooth.cpp)
> +piglit_add_executable (ext_framebuffer_multisample-polygon-smooth
> common.cpp polygon-smooth.cpp)
>  piglit_add_executable (ext_framebuffer_multisample-renderbuffer-samples
> renderbuffer-samples.c)
>  piglit_add_executable
> (ext_framebuffer_multisample-renderbufferstorage-samples
> renderbufferstorage-samples.c)
>  piglit_add_executable (ext_framebuffer_multisample-samples samples.c)
> diff --git a/tests/spec/ext_framebuffer_multisample/polygon-smooth.cpp
> b/tests/spec/ext_framebuffer_multisample/polygon-smooth.cpp
> new file mode 100644
> index 0000000..05db70b
> --- /dev/null
> +++ b/tests/spec/ext_framebuffer_multisample/polygon-smooth.cpp
> @@ -0,0 +1,218 @@
> +/*
> + * 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 polygon-smooth.cpp
> + *
> + * Page 134 (in the PDF) of the OpenGL 3.0 spec says:
> + * "If MULTISAMPLE is enabled, and the value of SAMPLE BUFFERS is one,
> + * then polygons are rasterized using the following algorithm, regardless
> + * of whether polygon antialias-ing (POLYGON_SMOOTH) is enabled or
> disabled".
> + *
> + * This test operates by drawing a reference image for MSAA using
> supersampled
> + * fbo. This is rendered in to right half of default framebuffer.
> + *
> + * Draw the test pattern in to multisample fbo with GL_POLYGON_SMOOTH
> disabled.
> + * Blits it in to left half of window system framebuffer. This is the test
> + * image to verify MSAA and a reference image to test MSAA with
> + * GL_POLYGON_SMOOTH.
> + *
> + * Verify test_pattern is multisample antialiased.
> + *
> + * Draw the same test pattern for the second time in multisample buffer
> with
> + * GL_POLYGON_SMOOTH enabled. Blit it in to right half of window system
> + * framebuffer. This is the test image.
> + *
> + * To verify that GL_POLYGON_SMOOTH is ignored during MSAA, compare the
> two
> + * halves of default framebuffer. They are expected to match.
> + */
> +
> +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 ms_fbo;
> +Test *test = NULL;
> +GLbitfield buffer_to_test;
> +TestPattern *test_pattern = NULL;
> +ManifestProgram *manifest_program = NULL;
> +
> +bool
> +is_msaa_pattern()
> +{
> +       return test->measure_accuracy();
> +}
> +
> +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);
> +}
>

Again, I'm not aware of any need to test depth or stencil.


> +
> +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);
> +
> +       test_type_enum test_type;
> +       if (strcmp(argv[2], "color") == 0) {
> +               test_pattern = new Triangles();
> +               buffer_to_test = GL_COLOR_BUFFER_BIT;
> +               test_type = TEST_TYPE_COLOR;
> +       } else if (strcmp(argv[2], "depth") == 0) {
> +               test_pattern = new DepthSunburst();
> +               manifest_program = new ManifestDepth();
> +               buffer_to_test = GL_DEPTH_BUFFER_BIT;
> +               test_type = TEST_TYPE_DEPTH_DRAW;
> +       } else if (strcmp(argv[2], "stencil") == 0) {
> +               test_pattern = new StencilSunburst();
> +               manifest_program = new ManifestStencil();
> +               buffer_to_test = GL_STENCIL_BUFFER_BIT;
> +               test_type = TEST_TYPE_STENCIL_DRAW;
> +       } else {
> +               print_usage_and_exit(argv[0]);
> +       }
> +
> +       /* Draw reference image to verify MSAA */
> +        test = create_test(test_type, num_samples,
> +                          false /* small */,
> +                          true /* combine_depth_stencil */,
> +                          pattern_width, pattern_height,
> +                          16 /* supersample_factor */);
> +       test->draw_reference_image();
>

Drawing the reference image in piglit_init() is problematic for two reasons:

(1) the window system may at any time decide to discard data in the window
system framebuffer and request that the app redraw it.  (On a system with a
compositing window manager this typically happens only when the window is
resized.  On a system without compositing this may happen at any time, e.g.
when a window is obscured).  If you draw the reference image in
piglit_init(), there's no guarantee that it will still be there when
piglit_display() runs.

(2) pigilt_display() may be called multiple times.  If your piglit_display
function overwrites the reference image (which it does), then the next time
piglit_display() gets called the results will be different.

Since this reference image is only used to check something that is already
adequately tested in ext_framebuffer_multisample-accuracy, I would
recommend just dropping this call to draw_reference_image(), and the call
to is_msaa_pattern() below.


> +
> +       test_pattern->compile();
> +       if (manifest_program)
> +               manifest_program->compile();
> +
> +       ms_fbo.init(num_samples, pattern_width, pattern_height,
> +                    true /* combine_depth_stencil */,
> +                    false /* attach_texture */);
> +
> +       /* Enable blending to test GL_POLYGON_SMOOTH */
> +       glEnable (GL_BLEND);
> +       glBlendFunc (GL_SRC_ALPHA_SATURATE, GL_ONE);
> +}
> +
> +enum piglit_result
> +piglit_display()
> +{
> +       bool pass = true;
> +       float proj[4][4] = {
> +               { 1, 0, 0, 0 },
> +               { 0, 1, 0, 0 },
> +               { 0, 0, 1, 0 },
> +               { 0, 0, 0, 1 }
> +       };
> +
> +       /* Draw test pattern in  multisample ms_fbo with GL_POLYGON_SMOOTH
> +        * disabled.
> +        */
> +       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, ms_fbo.handle);
> +       ms_fbo.set_viewport();
> +       test_pattern->draw(proj);
> +
> +       /* Blit ms_fbo to the left half of window system framebuffer.  This
> +        * is the test image when used to measure the accuracy of MSAA and
> a
> +        * reference image when used to test MSAA with polygon smooth.
> +        */
> +       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, ms_fbo.handle);
> +       ms_fbo.set_viewport();
> +       if (manifest_program)
> +               manifest_program->run();
> +       glBindFramebuffer(GL_READ_FRAMEBUFFER, ms_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);
> +
> +       /* Verify that test pattern is multisample anti-aliased */
> +       pass = is_msaa_pattern() && pass;
> +
> +       /* Now draw test pattern in mulisample ms_fbo with
> GL_POLYGON_SMOOTH
> +        * enabled
> +        */
> +       glDisable(GL_DEPTH_TEST);
> +       glEnable(GL_POLYGON_SMOOTH);
> +       glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
> +
> +       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, ms_fbo.handle);
> +       ms_fbo.set_viewport();
> +
> +       glClear(buffer_to_test);
> +       test_pattern->draw(proj);
> +
> +       glDisable(GL_POLYGON_SMOOTH);
> +
> +       /* Blit ms_fbo to the right half of window system framebuffer. This
> +        * is the test image.
> +        */
> +       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, ms_fbo.handle);
> +       ms_fbo.set_viewport();
> +       if (manifest_program)
> +               manifest_program->run();
> +       glBindFramebuffer(GL_READ_FRAMEBUFFER, ms_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 GL_POLYGON_SMOOTH is not ignored with multisample
> +        * rendering.
> +        */
> +       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
>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/piglit/attachments/20120522/5755d7b5/attachment.html>


More information about the Piglit mailing list