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

Anuj Phogat anuj.phogat at gmail.com
Tue May 22 15:04:03 PDT 2012


On Tue, May 22, 2012 at 9:13 AM, Paul Berry <stereotype441 at gmail.com> wrote:
> 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.
>
Yes, part (a) can be removed. I'll add a comment stating this test's
dependency on ext_framebuffer_multisample-accuracy 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.
I'll remove code for depth and 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.
>
Thanks for the detailed explanation. I'll post the updated patch with suggested
changes.

>>
>> +
>> +       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
>
>


More information about the Piglit mailing list