[Piglit] [PATCH] msaa: add test to verify alpha-to-coverage together with alpha-to-one

Brian Paul brianp at vmware.com
Fri Aug 4 17:02:51 UTC 2017


On 08/04/2017 10:44 AM, Ilia Mirkin wrote:
> On Fri, Aug 4, 2017 at 12:40 PM, Brian Paul <brianp at vmware.com> wrote:
>> On 08/04/2017 10:13 AM, Ilia Mirkin wrote:
>>>
>>> On Fri, Aug 4, 2017 at 11:36 AM, Brian Paul <brianp at vmware.com> wrote:
>>>>
>>>> On 08/04/2017 09:30 AM, Brian Paul wrote:
>>>>>
>>>>>
>>>>> On 08/04/2017 08:51 AM, Roland Scheidegger wrote:
>>>>>>
>>>>>>
>>>>>> Am 04.08.2017 um 16:43 schrieb Brian Paul:
>>>>>>>
>>>>>>>
>>>>>>> On 08/04/2017 08:32 AM, sroland at vmware.com wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>> From: Roland Scheidegger <sroland at vmware.com>
>>>>>>>>
>>>>>>>> I believe the sole reason alpha-to-one exists at all is that it can
>>>>>>>> be
>>>>>>>> used together with alpha-to-coverage (otherwise why not just output
>>>>>>>> alpha
>>>>>>>> 1.0 in the fs in the first place...).
>>>>>>>> Therefore, it seems quite appropriate to test this together with
>>>>>>>> alpha-to-coverage.
>>>>>>>>
>>>>>>>> Note: the test is a simple copy of sample-alpha-to-coverage with only
>>>>>>>> trivial adjustments. I don't think the common code used actually
>>>>>>>> handles
>>>>>>>> this case correctly for the reference image (as it's the same as when
>>>>>>>> just using alpha-to-coverage, which can't be right), but I haven't
>>>>>>>> looked
>>>>>>>> at it long enough to be able to fix it.
>>>>>>>> It is, however, good enough to pass on my nvidia card, albeit some
>>>>>>>> mesa
>>>>>>>> drivers trying to emulate this feature are definitely broken (I'm
>>>>>>>> looking
>>>>>>>> at you radeons...).
>>>>>>>> ---
>>>>>>>>      tests/all.py                                       |   5 +
>>>>>>>>      .../ext_framebuffer_multisample/CMakeLists.gl.txt  |   2 +
>>>>>>>>      .../sample-alpha-to-coverage-one.cpp               | 162
>>>>>>>> +++++++++++++++++++++
>>>>>>>>      3 files changed, 169 insertions(+)
>>>>>>>>      create mode 100644
>>>>>>>>
>>>>>>>> tests/spec/ext_framebuffer_multisample/sample-alpha-to-coverage-one.cpp
>>>>>>>>
>>>>>>>> diff --git a/tests/all.py b/tests/all.py
>>>>>>>> index fc00d99..bc5b9e0 100644
>>>>>>>> --- a/tests/all.py
>>>>>>>> +++ b/tests/all.py
>>>>>>>> @@ -3028,6 +3028,11 @@ with profile.test_list.group_manager(
>>>>>>>>                     sample_count, buffer_type],
>>>>>>>>                    'sample-alpha-to-coverage {} {}'.format(
>>>>>>>>                        sample_count, buffer_type))
>>>>>>>> +
>>>>>>>> g(['ext_framebuffer_multisample-sample-alpha-to-coverage-one',
>>>>>>>> +               sample_count, buffer_type],
>>>>>>>> +              'sample-alpha-to-coverage-one {} {}'.format(
>>>>>>>> +                  sample_count, buffer_type))
>>>>>>>> +
>>>>>>>>
>>>>>>>>              for test in ['line-smooth', 'point-smooth',
>>>>>>>> 'polygon-smooth',
>>>>>>>>                           'sample-alpha-to-one',
>>>>>>>> diff --git a/tests/spec/ext_framebuffer_multisample/CMakeLists.gl.txt
>>>>>>>> b/tests/spec/ext_framebuffer_multisample/CMakeLists.gl.txt
>>>>>>>> index 6841267..e93c609 100644
>>>>>>>> --- a/tests/spec/ext_framebuffer_multisample/CMakeLists.gl.txt
>>>>>>>> +++ b/tests/spec/ext_framebuffer_multisample/CMakeLists.gl.txt
>>>>>>>> @@ -62,6 +62,8 @@ piglit_add_executable
>>>>>>>> (ext_framebuffer_multisample-samples samples.c)
>>>>>>>>      piglit_add_executable
>>>>>>>> (ext_framebuffer_multisample-sample-coverage
>>>>>>>> common.cpp sample-coverage.cpp)
>>>>>>>>      piglit_add_executable
>>>>>>>> (ext_framebuffer_multisample-sample-alpha-to-coverage common.cpp
>>>>>>>>                     draw-buffers-common.cpp
>>>>>>>> sample-alpha-to-coverage.cpp)
>>>>>>>> +piglit_add_executable
>>>>>>>> (ext_framebuffer_multisample-sample-alpha-to-coverage-one common.cpp
>>>>>>>> +               draw-buffers-common.cpp
>>>>>>>> sample-alpha-to-coverage-one.cpp)
>>>>>>>>      piglit_add_executable
>>>>>>>> (ext_framebuffer_multisample-sample-alpha-to-one common.cpp
>>>>>>>>                     draw-buffers-common.cpp sample-alpha-to-one.cpp)
>>>>>>>>      piglit_add_executable (ext_framebuffer_multisample-turn-on-off
>>>>>>>> common.cpp turn-on-off.cpp)
>>>>>>>> diff --git
>>>>>>>>
>>>>>>>>
>>>>>>>> a/tests/spec/ext_framebuffer_multisample/sample-alpha-to-coverage-one.cpp
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> b/tests/spec/ext_framebuffer_multisample/sample-alpha-to-coverage-one.cpp
>>>>>>>>
>>>>>>>> new file mode 100644
>>>>>>>> index 0000000..887893a
>>>>>>>> --- /dev/null
>>>>>>>> +++
>>>>>>>>
>>>>>>>>
>>>>>>>> b/tests/spec/ext_framebuffer_multisample/sample-alpha-to-coverage-one.cpp
>>>>>>>>
>>>>>>>> @@ -0,0 +1,162 @@
>>>>>>>> +/*
>>>>>>>> + * 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 "draw-buffers-common.h"
>>>>>>>> +
>>>>>>>> +/**
>>>>>>>> + * \file sample-alpha-to-coverage.cpp
>>>>>>>> + *
>>>>>>>> + * Verify sample alpha to coverage plus alpha to one with
>>>>>>>> multisample
>>>>>>>> FBO
>>>>>>>> + *
>>>>>>>> + * When rendering to multisample FBO, fragment's alpha value should
>>>>>>>> be
>>>>>>>> + * used to determine the coverage value, and then the alpha value
>>>>>>>> set
>>>>>>>> to 1.
>>>>>>>> + *
>>>>>>>> + * This test operates by drawing a pattern in multisample FBO to
>>>>>>>> generate
>>>>>>>> + * reference and test image. Reference image is drawn to right half
>>>>>>>> of window
>>>>>>>> + * system frame buffer and test image to left half.
>>>>>>>> + *
>>>>>>>> + * Compute the expected color / depth values.
>>>>>>>> + *
>>>>>>>> + * Probe color / depth buffer blitted to downsampled FBO
>>>>>>>> (resolve_fbo) and
>>>>>>>> + * compare against expected color values.
>>>>>>>> + *
>>>>>>>> + * Author: Anuj Phogat <anuj.phogat at gmail.com>
>>>>>>>> + */
>>>>>>>> +
>>>>>>>> +PIGLIT_GL_TEST_CONFIG_BEGIN
>>>>>>>> +
>>>>>>>> +    config.supports_gl_compat_version = 10;
>>>>>>>> +
>>>>>>>> +    config.window_width = 512;
>>>>>>>> +    config.window_height = 256;
>>>>>>>> +    config.window_visual = PIGLIT_GL_VISUAL_DOUBLE |
>>>>>>>> PIGLIT_GL_VISUAL_RGBA;
>>>>>>>> +
>>>>>>>> +PIGLIT_GL_TEST_CONFIG_END
>>>>>>>> +
>>>>>>>> +static GLenum buffer_to_test;
>>>>>>>> +
>>>>>>>> +void
>>>>>>>> +print_usage_and_exit(char *prog_name)
>>>>>>>> +{
>>>>>>>> +    printf("Usage: %s <num_samples> <test_type>\n"
>>>>>>>> +           "  where <test_type> is one of:\n"
>>>>>>>> +           "    color\n"
>>>>>>>> +           "    depth\n",
>>>>>>>> +           prog_name);
>>>>>>>> +    piglit_report_result(PIGLIT_FAIL);
>>>>>>>> +}
>>>>>>>> +
>>>>>>>> +void
>>>>>>>> +piglit_init(int argc, char **argv)
>>>>>>>> +{
>>>>>>>> +    const int num_attachments = 1;
>>>>>>>> +    int samples;
>>>>>>>> +
>>>>>>>> +    piglit_require_gl_version(21);
>>>>>>>> +    piglit_require_extension("GL_ARB_framebuffer_object");
>>>>>>>> +    piglit_require_extension("GL_ARB_vertex_array_object");
>>>>>>>> +
>>>>>>>> +    if (argc < 3)
>>>>>>>> +        print_usage_and_exit(argv[0]);
>>>>>>>> +    {
>>>>>>>> +        char *endptr = NULL;
>>>>>>>> +        samples = strtol(argv[1], &endptr, 0);
>>>>>>>> +        if (endptr != argv[1] + strlen(argv[1]))
>>>>>>>> +            print_usage_and_exit(argv[0]);
>>>>>>>> +    }
>>>>>>>> +    if (strcmp(argv[2], "color") == 0) {
>>>>>>>> +        buffer_to_test = GL_COLOR_BUFFER_BIT;
>>>>>>>> +    } else if (strcmp(argv[2], "depth") == 0) {
>>>>>>>> +        buffer_to_test = GL_DEPTH_BUFFER_BIT;
>>>>>>>> +        glEnable(GL_DEPTH_TEST);
>>>>>>>> +        glDepthFunc(GL_ALWAYS);
>>>>>>>> +    } else
>>>>>>>> +        print_usage_and_exit(argv[0]);
>>>>>>>> +
>>>>>>>> +    int pattern_width = piglit_width / 2;
>>>>>>>> +    int pattern_height = piglit_height / num_attachments;
>>>>>>>> +
>>>>>>>> +    piglit_ortho_projection(pattern_width,
>>>>>>>> +                pattern_height,
>>>>>>>> +                GL_TRUE);
>>>>>>>> +
>>>>>>>> +    /* Skip the test if samples > GL_MAX_SAMPLES */
>>>>>>>> +    GLint max_samples;
>>>>>>>> +    glGetIntegerv(GL_MAX_SAMPLES, &max_samples);
>>>>>>>> +
>>>>>>>> +    if (samples > max_samples)
>>>>>>>> +        piglit_report_result(PIGLIT_SKIP);
>>>>>>>> +
>>>>>>>> +    ms_fbo_and_draw_buffers_setup(samples,
>>>>>>>> +                      pattern_width,
>>>>>>>> +                      pattern_height,
>>>>>>>> +                      num_attachments,
>>>>>>>> +                      buffer_to_test,
>>>>>>>> +                      GL_RGBA);
>>>>>>>> +    shader_compile(true /* sample_alpha_to_coverage */,
>>>>>>>> +               false /* dual_src_blend */,
>>>>>>>> +               true /* frag_out_zero_write */);
>>>>>>>> +}
>>>>>>>> +
>>>>>>>> +enum piglit_result
>>>>>>>> +piglit_display()
>>>>>>>> +{
>>>>>>>> +    bool pass = true;
>>>>>>>> +    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, piglit_winsys_fbo);
>>>>>>>> +    glClearColor(0.0, 0.0, 0.0, 1.0);
>>>>>>>> +    glClear(GL_COLOR_BUFFER_BIT);
>>>>>>>> +    allocate_data_arrays();
>>>>>>>> +
>>>>>>>> +    /* Reference image drawn here doesn't represent an expected
>>>>>>>> image.
>>>>>>>> +     * Reference image is drawn only to visualize the image
>>>>>>>> difference
>>>>>>>> +     * caused by enabling sample_alpha_to_coverage in test image.
>>>>>>>> +     */
>>>>>>>> +    if(buffer_to_test == GL_COLOR_BUFFER_BIT)
>>>>>>>> +        draw_reference_image(true /* sample_alpha_to_coverage */,
>>>>>>>> +                     true /* sample_alpha_to_one */);
>>>>>>>> +
>>>>>>>> +    draw_test_image(true /* sample_alpha_to_coverage */,
>>>>>>>> +            true /* sample_alpha_to_one */);
>>>>>>>> +
>>>>>>>> +    pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
>>>>>>>> +
>>>>>>>> +    /* Probe all the test image blitted to resolve fbo and compare
>>>>>>>> with
>>>>>>>> +     * expected color values.  This method of verification is
>>>>>>>> appropriate
>>>>>>>> +     * for tests with sample-alpha-to-coverage enabled. Possibility
>>>>>>>> of
>>>>>>>> +     * dithering effect when the coverage value is not a strict
>>>>>>>> multiple
>>>>>>>> +     * of 1 / num_samples makes image compare (test / reference
>>>>>>>> image)
>>>>>>>> +     * unsuitable for this test.
>>>>>>>> +     */
>>>>>>>> +    if(buffer_to_test == GL_COLOR_BUFFER_BIT)
>>>>>>>> +        pass = probe_framebuffer_color() && pass;
>>>>>>>> +    else if (buffer_to_test == GL_DEPTH_BUFFER_BIT)
>>>>>>>> +        pass = probe_framebuffer_depth() && pass;
>>>>>>>> +
>>>>>>>> +    /* Free the memory allocated for data arrays */
>>>>>>>> +    free_data_arrays();
>>>>>>>> +
>>>>>>>> +    if (!piglit_automatic && buffer_to_test == GL_COLOR_BUFFER_BIT)
>>>>>>>> +        piglit_present_results();
>>>>>>>> +
>>>>>>>> +    return pass ? PIGLIT_PASS : PIGLIT_FAIL;
>>>>>>>> +}
>>>>>>>>
>>>>>>>
>>>>>>> I have a patch in my tree for testing the same thing.
>>>>>>>
>>>>>>> I've cleaned it up and attached it below.  What do you think?  Less
>>>>>>> code.
>>>>>>>
>>>>>>
>>>>>> Yes, much better, I'll drop this then. (I was actually wondering why
>>>>>> the
>>>>>> alpha-to-one and alpha-to-coverage ones were separate to begin with...)
>>>>>
>>>>>
>>>>>
>>>>> OK, I'll post my patch for review after I figure out the magic
>>>>> incantation needed in all.py to pass the --alpha-to-one flag to the
>>>>> test.  I'm nearly at my wits end here.  I may need Dylan to help me.
>>>>>
>>>>
>>>> Dylan,
>>>>
>>>> I'm trying to modify this block (or add a similar block) at line 3047 of
>>>> all.py:
>>>>
>>>>           for buffer_type in ('color', 'depth'):
>>>>               g(['ext_framebuffer_multisample-sample-alpha-to-coverage',
>>>>                  sample_count, buffer_type],
>>>>                 'sample-alpha-to-coverage {} {}'.format(
>>>>                     sample_count, buffer_type))
>>>>
>>>> to pass the new --alpha-to-one argument to the test.  How do I do that?
>>>> I've tried about a dozen things without luck so far.
>>>>
>>>> Honestly, the syntax for specifying tests in all.py seem more complicated
>>>> than it should be.
>>>
>>>
>>> That might be my bad - it was my suggestion. I think a comment at the
>>> top would go a long way to clearing up any confusion.
>>>
>>> g(["foo-test-name", "--alpha-to-one"])
>>>
>>> should have the desired effect. (Assuming there's a "with .... as g"
>>> block around it.)
>>
>>
>> Yeah, I tried that earlier.  No go:
>>
>> Fatal Error: A test has already been assigned the name:
>> spec at ext_framebuffer_multisample@sample-alpha-to-coverage 2 color
>> Further, the two tests are not the same,
>> The original test has this command:
>> "/home/brian/piglit-2017/piglit/bin/ext_framebuffer_multisample-sample-alpha-to-coverage
>> 2 color -auto -fbo"
>> The new test has this command:
>> "/home/brian/piglit-2017/piglit/bin/ext_framebuffer_multisample-sample-alpha-to-coverage
>> --alpha-to-one 2 color -auto -fbo"
>> Command exited with non-zero status 1
>> 12.49user 1.53system 0:14.12elapsed 99%CPU (0avgtext+0avgdata
>> 201484maxresident)k
>> 0inputs+528outputs (2major+147526minor)pagefaults 0swaps
>>
>> And changing the test name to
>> g(['ext_framebuffer_multisample-sample-alpha-to-coverage-alpha-to-one', ...)
>> doesn't work either.
>
> Right, so it's complaining about two tests having the same name.
> Generically the way that generator (g) function works is it takes 2
> arguments - one is a list of arguments starting with the binary name,
> to pass to execve() or similar, and the second is the test name (which
> by default is set to IIRC the concatenation of all arguments, but I
> forget). You need to modify that second argument to include some
> mention of the alpha-to-one thing so that its name is different from
> the previously defined test.

OK, I think I've finally got the right combination of things.  Patch 
coming.  Thanks, Ilia.

-Brian




More information about the Piglit mailing list