[Piglit] [PATCH] arb_fb_no_attach: Test with an odd sample count

Ilia Mirkin imirkin at alum.mit.edu
Wed Feb 3 19:19:07 CET 2016


On Wed, Feb 3, 2016 at 1:04 PM, Neil Roberts <neil at linux.intel.com> wrote:
> Adds a test that creates a framebuffer with no attachments and sets
> the default sample count to 3. It then verifies that GL_SAMPLES for
> the fbo is at least 3. It also checks the value of gl_NumSamples in
> the shader by doing an image store with the value to verify that it
> has the same value.
>
> Currently using multisampling with no attachments seems to break the
> i965 driver in Mesa.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=93957
> Cc: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
>  tests/all.py                                       |   1 +
>  .../CMakeLists.gl.txt                              |   1 +
>  .../roundup-samples.c                              | 173 +++++++++++++++++++++
>  3 files changed, 175 insertions(+)
>  create mode 100644 tests/spec/arb_framebuffer_no_attachments/roundup-samples.c
>
> diff --git a/tests/all.py b/tests/all.py
> index 59f20fa..2912d1f 100644
> --- a/tests/all.py
> +++ b/tests/all.py
> @@ -2425,6 +2425,7 @@ with profile.group_manager(
>      g(['arb_framebuffer_no_attachments-params'])
>      g(['arb_framebuffer_no_attachments-atomic'])
>      g(['arb_framebuffer_no_attachments-query'])
> +    g(['arb_framebuffer_no_attachments-roundup-samples'])
>
>  # Group ARB_explicit_uniform_location
>  with profile.group_manager(
> diff --git a/tests/spec/arb_framebuffer_no_attachments/CMakeLists.gl.txt b/tests/spec/arb_framebuffer_no_attachments/CMakeLists.gl.txt
> index bbc3177..38fc9e1 100755
> --- a/tests/spec/arb_framebuffer_no_attachments/CMakeLists.gl.txt
> +++ b/tests/spec/arb_framebuffer_no_attachments/CMakeLists.gl.txt
> @@ -12,3 +12,4 @@ piglit_add_executable (arb_framebuffer_no_attachments-minmax minmax.c)
>  piglit_add_executable (arb_framebuffer_no_attachments-params params.c)
>  piglit_add_executable (arb_framebuffer_no_attachments-atomic atomic.c)
>  piglit_add_executable (arb_framebuffer_no_attachments-query query.c)
> +piglit_add_executable (arb_framebuffer_no_attachments-roundup-samples roundup-samples.c)
> diff --git a/tests/spec/arb_framebuffer_no_attachments/roundup-samples.c b/tests/spec/arb_framebuffer_no_attachments/roundup-samples.c
> new file mode 100644
> index 0000000..8fecc9c
> --- /dev/null
> +++ b/tests/spec/arb_framebuffer_no_attachments/roundup-samples.c
> @@ -0,0 +1,173 @@
> +/*
> + * Copyright © 2016 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 roundup-samples.c
> + *
> + * Tests that requesting an odd number of samples doesn't break
> + * anything. The implementation should round this up to the next
> + * supported value. Technically the implementation is probably allowed
> + * to support the odd number of samples so it doesn't report this as a
> + * failure.
> + *
> + * Bug #93957
> + */
> +
> +#include "piglit-util-gl.h"
> +
> +PIGLIT_GL_TEST_CONFIG_BEGIN
> +
> +       config.supports_gl_core_version = 31;
> +
> +PIGLIT_GL_TEST_CONFIG_END
> +
> +#define REQUEST_N_SAMPLES 3
> +
> +const char *vs_source =
> +       "#version 140\n"
> +       "\n"
> +       "in vec4 piglit_vertex;\n"
> +       "\n"
> +       "void\n"
> +       "main()\n"
> +       "{\n"
> +       "        gl_Position = piglit_vertex;\n"
> +       "}\n";
> +
> +const char *fs_source =
> +       "#version 140\n"
> +       "#extension GL_ARB_sample_shading : require\n"
> +       "#extension GL_ARB_shader_image_load_store : require\n"
> +       "\n"
> +       "writeonly uniform uimage2D img;\n"
> +       "\n"
> +       "void\n"
> +       "main()\n"
> +       "{\n"
> +       "        imageStore(img,\n"
> +       "                   ivec2(gl_FragCoord.xy),\n"
> +       "                   uvec4(gl_NumSamples));\n"

Could I convince you to use ssbo instead? Not only is it supported by
nouveau [unlike images... for now], but I think it's a better match as
well :) Probably just a single integer and a 1x1 framebuffer.

> +       "}\n";
> +
> +enum piglit_result
> +piglit_display(void)
> +{
> +       return PIGLIT_FAIL;
> +}
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> +       GLuint fbo;
> +       GLint prog;
> +       GLuint tex;
> +       bool pass = true;
> +       uint32_t *tex_data;
> +       GLint actual_n_samples;
> +
> +       piglit_require_gl_version(31);
> +       piglit_require_extension("GL_ARB_framebuffer_no_attachments");
> +       piglit_require_extension("GL_ARB_shader_image_load_store");
> +       piglit_require_extension("GL_ARB_sample_shading");
> +
> +       /* Create fbo with no attachments. */
> +       glGenFramebuffers(1, &fbo);
> +       glBindFramebuffer(GL_FRAMEBUFFER, fbo);
> +
> +       /* Setup default width, height and number of samples */
> +       glFramebufferParameteri(GL_FRAMEBUFFER,
> +                               GL_FRAMEBUFFER_DEFAULT_WIDTH,
> +                               piglit_width);
> +       glFramebufferParameteri(GL_FRAMEBUFFER,
> +                               GL_FRAMEBUFFER_DEFAULT_HEIGHT,
> +                               piglit_height);
> +       glFramebufferParameteri(GL_FRAMEBUFFER,
> +                               GL_FRAMEBUFFER_DEFAULT_SAMPLES,
> +                               REQUEST_N_SAMPLES);
> +
> +       /* Check that fbo is marked complete. */
> +       if (glCheckFramebufferStatus(GL_FRAMEBUFFER) !=
> +           GL_FRAMEBUFFER_COMPLETE)
> +               piglit_report_result(PIGLIT_SKIP);
> +
> +       glGenTextures(1, &tex);
> +       glBindTexture(GL_TEXTURE_2D, tex);
> +       glTexImage2D(GL_TEXTURE_2D,
> +                    0, /* level */
> +                    GL_R32UI,
> +                    piglit_width, piglit_height,
> +                    0, /* border */
> +                    GL_RGBA_INTEGER, GL_UNSIGNED_INT,
> +                    NULL /* data */);
> +       glBindImageTexture(0, /* unit */
> +                          tex,
> +                          0, /* level */
> +                          GL_FALSE, /* layered */
> +                          0, /* layer */
> +                          GL_WRITE_ONLY,
> +                          GL_R32UI);
> +
> +       prog = piglit_build_simple_program(vs_source, fs_source);
> +
> +       glUseProgram(prog);
> +
> +       piglit_draw_rect(-1, -1, 2, 2);
> +
> +       glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
> +
> +       tex_data = malloc(sizeof (*tex_data) * piglit_width * piglit_height);
> +       memset(tex_data, 0, sizeof (*tex_data) * piglit_width * piglit_height);
> +
> +       glGetIntegerv(GL_SAMPLES, &actual_n_samples);

Oh interesting. I was trying to use glGetFramebufferParameteriv and
turns out it only does GL_SAMPLES for GL 4.5 :( How sure are you that
this is supposed to work?

> +
> +       printf("Requested samples = %i\n"
> +              "glGetIntegerv(GL_SAMPLES) == %i\n",
> +              REQUEST_N_SAMPLES,
> +              actual_n_samples);
> +
> +       if (actual_n_samples < REQUEST_N_SAMPLES) {
> +               printf("FAIL: GL_SAMPLES is too small\n");
> +               pass = false;
> +       }
> +
> +       glGetTexImage(GL_TEXTURE_2D,
> +                     0, /* level */
> +                     GL_RED_INTEGER, GL_UNSIGNED_INT,
> +                     tex_data);
> +
> +       printf("gl_NumSamples from shader == %u\n",
> +              *tex_data);
> +
> +       if (*tex_data != actual_n_samples) {
> +               printf("FAIL: GL_SAMPLES does not match gl_NumSamples\n");
> +               pass = false;
> +       }
> +
> +       free(tex_data);
> +
> +       glDeleteTextures(1, &tex);
> +       glDeleteFramebuffers(1, &fbo);
> +       glDeleteProgram(prog);
> +
> +       piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL);
> +}
> --
> 2.5.0
>


More information about the Piglit mailing list