[Piglit] [PATCH V2 2/6] ARB_sample_shading: Add test to verify the functionality of gl_NumSamples

Anuj Phogat anuj.phogat at gmail.com
Mon Nov 4 13:06:28 PST 2013


On Sat, Oct 26, 2013 at 11:37 AM, Chris Forbes <chrisf at ijw.co.nz> wrote:

> On Sat, Oct 26, 2013 at 12:49 PM, Anuj Phogat <anuj.phogat at gmail.com>
> wrote:
> > V2: Get rid of redundant projection matrix.
> > Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
> > ---
> >  tests/all.tests                                    |   6 +
> >  .../arb_sample_shading/execution/CMakeLists.gl.txt |   1 +
> >  .../execution/builtin-gl-num-samples.cpp           | 220
> +++++++++++++++++++++
> >  3 files changed, 227 insertions(+)
> >  create mode 100644
> tests/spec/arb_sample_shading/execution/builtin-gl-num-samples.cpp
> >
> > diff --git a/tests/all.tests b/tests/all.tests
> > index e30eb3b..1fcd08a 100644
> > --- a/tests/all.tests
> > +++ b/tests/all.tests
> > @@ -1336,6 +1336,12 @@ arb_sample_shading = Group()
> >  spec['ARB_sample_shading'] = arb_sample_shading
> >  add_plain_test(arb_sample_shading, 'arb_sample_shading-api')
> >
> > +TEST_SAMPLE_COUNTS = (0, 2, 4, 6, 8, 16, 32)
> > +for num_samples in TEST_SAMPLE_COUNTS:
> > +    test_name = 'builtin-gl-num-samples {0}'.format(num_samples)
> > +    executable = 'arb_sample_shading-{0} -auto'.format(test_name)
> > +    arb_sample_shading[test_name] = PlainExecTest(executable)
> > +
> >  # Group ARB_debug_output
> >  arb_debug_output = Group()
> >  spec['ARB_debug_output'] = arb_debug_output
> > diff --git a/tests/spec/arb_sample_shading/execution/CMakeLists.gl.txt
> b/tests/spec/arb_sample_shading/execution/CMakeLists.gl.txt
> > index 36289e0..56fa0da 100644
> > --- a/tests/spec/arb_sample_shading/execution/CMakeLists.gl.txt
> > +++ b/tests/spec/arb_sample_shading/execution/CMakeLists.gl.txt
> > @@ -11,4 +11,5 @@ link_libraries (
> >  )
> >
> >  piglit_add_executable (arb_sample_shading-api api.c)
> > +piglit_add_executable (arb_sample_shading-builtin-gl-num-samples
> builtin-gl-num-samples.cpp)
> >  # vim: ft=cmake:
> > diff --git
> a/tests/spec/arb_sample_shading/execution/builtin-gl-num-samples.cpp
> b/tests/spec/arb_sample_shading/execution/builtin-gl-num-samples.cpp
> > new file mode 100644
> > index 0000000..585fb75
> > --- /dev/null
> > +++ b/tests/spec/arb_sample_shading/execution/builtin-gl-num-samples.cpp
> > @@ -0,0 +1,220 @@
> > +/*
> > + * Copyright © 2013 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.
> > + */
> > +
> > +/** \file builtin-gl-num-samples.cpp
> > + *  This test verifies that using gl_NumSamples in fragment shader
> > + *  program works as per ARB_sample_shading specification.
> > + *
> > + **/
> > +
> > +#include "piglit-fbo.h"
> > +using namespace piglit_util_fbo;
> > +
> > +const int pattern_width = 128; const int pattern_height = 128;
> > +
> > +PIGLIT_GL_TEST_CONFIG_BEGIN
> > +
> > +       config.supports_gl_compat_version = 10;
> > +
> > +       config.window_width = pattern_width;
> > +       config.window_height = pattern_height;
> > +       config.window_visual = PIGLIT_GL_VISUAL_DOUBLE |
> PIGLIT_GL_VISUAL_RGBA;
> > +
> > +PIGLIT_GL_TEST_CONFIG_END
> > +
> > +static int  num_samples;
> > +static unsigned prog, vao, vertex_buf;
> > +static Fbo multisampled_fbo, singlesampled_fbo;
> > +
> > +static void
> > +print_usage_and_exit(char *prog_name)
> > +{
> > +       printf("Usage: %s <num_samples>\n", prog_name);
> > +       piglit_report_result(PIGLIT_FAIL);
> > +}
> > +
> > +void
> > +compile_shader(void)
> > +{
> > +       static const char *vert =
> > +               "#version 130\n"
> > +               "uniform mat4 proj;\n"
> > +               "in vec2 pos;\n"
> > +               "void main()\n"
> > +               "{\n"
> > +               "  gl_Position = vec4(pos, 0.0, 1.0);\n"
> > +               "}\n";
> > +       static const char *frag =
> > +               "#version 130\n"
> > +               "#extension GL_ARB_sample_shading : require\n"
> > +               "uniform int samples;\n"
> > +               "out vec4 out_color;\n"
> > +               "void main()\n"
> > +               "{\n"
> > +               "  if (gl_NumSamples == samples)\n"
> > +               "    out_color = vec4(0.0, 1.0, 0.0, 1.0);\n"
> > +               "  else\n"
> > +               "    out_color = vec4(1.0, 0.0, 0.0, 1.0);\n"
> > +               "}\n";
> > +       /* Compile program */
> > +       prog = glCreateProgram();
> > +       GLint vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vert);
> > +       glAttachShader(prog, vs);
> > +       piglit_check_gl_error(GL_NO_ERROR);
> > +       GLint fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, frag);
> > +       glAttachShader(prog, fs);
> > +       glBindAttribLocation(prog, 0, "pos");
> > +       glLinkProgram(prog);
> > +       if (!piglit_link_check_status(prog)) {
> > +               piglit_report_result(PIGLIT_FAIL);
> > +       }
> > +
> > +       /* Set up vertex array object */
> > +       glGenVertexArrays(1, &vao);
> > +       glBindVertexArray(vao);
> > +
> > +       /* Set up vertex input buffer */
> > +       glGenBuffers(1, &vertex_buf);
> > +       glBindBuffer(GL_ARRAY_BUFFER, vertex_buf);
> > +       glEnableVertexAttribArray(0);
> > +       glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4*sizeof(float),
> > +                             (void *) 0);
> > +
> > +       /* Set up element input buffer to tesselate a quad into
> > +        * triangles
> > +        */
> > +       unsigned int indices[6] = { 0, 1, 2, 0, 2, 3 };
> > +       GLuint element_buf;
> > +       glGenBuffers(1, &element_buf);
> > +       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, element_buf);
> > +       glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices,
> > +                    GL_STATIC_DRAW);
> > +}
> > +
> > +void
> > +draw_pattern_glsl(const Fbo *src_fbo, GLint samples)
> > +{
> > +       float vertex_data[4][4] = {
> > +               { -1, -1 },
> > +               { -1,  1 },
> > +               {  1,  1 },
> > +               {  1, -1 }};
> > +
> > +       glUseProgram(prog);
> > +       glBindVertexArray(vao);
> > +
> > +       /* Set up uniforms */
> > +       glUseProgram(prog);
> > +       glUniform1i(glGetUniformLocation(prog, "samples"), samples);
> > +
> > +       glBindBuffer(GL_ARRAY_BUFFER, vertex_buf);
> > +       glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_data), vertex_data,
> > +                    GL_STREAM_DRAW);
> > +       glDrawElements(GL_TRIANGLES, 6 , GL_UNSIGNED_INT, (void *) 0);
>
> Most of this is just reinventing piglit_draw_rect(). Using that would
> allow you to lose all the BO setup above, as well.
>
> You're right. I can get rid of BO setup by using piglit_draw_rect().

>  > +}
> > +
> > +void
> > +piglit_init(int argc, char **argv)
> > +{
> > +       if (argc != 2)
> > +               print_usage_and_exit(argv[0]);
> > +
> > +       /* 1st arg: num_samples */
> > +       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(21);
>
> This can go in the config block up the top.
>
> > +       piglit_require_extension("GL_ARB_vertex_array_object");
> > +       piglit_require_extension("GL_ARB_sample_shading");
> > +
> > +       /* 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);
> > +
> > +       singlesampled_fbo.setup(FboConfig(0,
> > +                                         pattern_width,
> > +                                         pattern_height));
> > +
> > +       FboConfig msConfig(num_samples, pattern_width, pattern_height);
> > +       multisampled_fbo.setup(msConfig);
> > +
> > +       compile_shader();
> > +       if (!piglit_check_gl_error(GL_NO_ERROR)) {
> > +               piglit_report_result(PIGLIT_FAIL);
> > +       }
> > +}
> > +
> > +bool test_ms_blit_scaled(Fbo ms_fbo)
>
> I think you forgot to rename this function?

copy-paste error :(

>  > +{
> > +       GLint samples;
> > +        GLfloat expected[4] = {0.0, 1.0, 0.0, 1.0};
> > +       bool pass = true;
> > +
> > +       /* Draw the test pattern into the framebuffer with texture
> > +        * attachment.
> > +        */
> > +       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, ms_fbo.handle);
> > +       glGetIntegerv(GL_SAMPLES, &samples);
> > +
> > +       glClear(GL_COLOR_BUFFER_BIT);
> > +       draw_pattern_glsl(&ms_fbo, samples);
> > +
> > +       glBindFramebuffer(GL_READ_FRAMEBUFFER, ms_fbo.handle);
> > +       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, singlesampled_fbo.handle);
>
> Why do you need this singlesampled_fbo? Just do the resolve into
> piglit_winsys_fbo.
>
This is from one of Paul's email on mesa-dev:
"when blitting from a multisample framebuffer to a single sample
framebuffer, the technique for combining the samples together depends on
whether the destination framebuffer is sRGB or linear.  When it is linear,
we do a simple average.  When it is sRGB, we convert the samples to linear,
then average them, then convert back to sRGB. This conversion happens
automatically in blorp".
So,comparing a resolve in winsys fbo (which is sRGB) with an expected color
(computed using simple average), will make the test to fail.

Blitting directly from multisample fbo to winsys fbo will work just in this
test case because we're assigning same color to all the samples. But,
builtin-gl-sample-id test will fail. I didn't blit directly to winsys fbo
to avoid such issues and to keep it uniform across all the tests.

>
> > +       glClear(GL_COLOR_BUFFER_BIT);
> > +       glBlitFramebuffer(0, 0,
> > +                         pattern_width, pattern_height,
> > +                         0, 0,
> > +                         pattern_width, pattern_height,
> > +                         GL_COLOR_BUFFER_BIT,
> > +                         GL_NEAREST);
> > +
> > +       glBindFramebuffer(GL_READ_FRAMEBUFFER, singlesampled_fbo.handle);
> > +       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, piglit_winsys_fbo);
> > +
> > +        pass = piglit_probe_rect_rgba(0, 0, pattern_width,
> pattern_width,
> > +                                       expected)  && pass;
>
> Second pattern_width should be pattern_height here.
>
> > +       glClear(GL_COLOR_BUFFER_BIT);
> > +       glBlitFramebuffer(0, 0,
> > +                         pattern_width, pattern_height,
> > +                         0, 0,
> > +                         pattern_width, pattern_height,
> > +                         GL_COLOR_BUFFER_BIT,
> > +                         GL_NEAREST);
> > +
> > +       piglit_present_results();
> > +       return pass;
> > +}
> > +
> > +enum piglit_result
> > +piglit_display()
> > +{
> > +       bool pass = true;
> > +       pass = test_ms_blit_scaled(multisampled_fbo)
> > +               && pass;
> > +       return pass ? PIGLIT_PASS : PIGLIT_FAIL;
> > +}
> > --
> > 1.8.1.4
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/piglit/attachments/20131104/dab14675/attachment-0001.html>


More information about the Piglit mailing list