[Piglit] [PATCH v2] arb_fb_no_attach: Test with an odd sample count
Ilia Mirkin
imirkin at alum.mit.edu
Thu Feb 4 20:18:25 CET 2016
On Thu, Feb 4, 2016 at 11:08 AM, 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 and GL_SAMPLE_BUFFERS is 1. It also checks the
> value of gl_NumSamples in the shader by writing to an SSBO with the
> value to verify that it is the same as GL_SAMPLES.
>
> Currently using an odd sample count with no attachments triggers an
> assert in the i965 driver in Mesa.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=93957
> Cc: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
>
> It would be great if someone could confirm that GL_SAMPLES and
> GL_SAMPLE_BUFFERS is affected by the framebuffer default values on a
> non-Mesa driver.
Tested on a GK208 running NVIDIA 361.18. (It passes.) Thanks for
flipping it over to ssbo.
Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>
>
> tests/all.py | 1 +
> .../CMakeLists.gl.txt | 1 +
> .../roundup-samples.c | 165 +++++++++++++++++++++
> 3 files changed, 167 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..26ab300
> --- /dev/null
> +++ b/tests/spec/arb_framebuffer_no_attachments/roundup-samples.c
> @@ -0,0 +1,165 @@
> +/*
> + * 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_storage_buffer_object : require\n"
> + "\n"
> + "layout (std140, binding=0) buffer shader_data\n"
> + "{\n"
> + " int num_samples;\n"
> + "};\n"
> + "\n"
> + "void\n"
> + "main()\n"
> + "{\n"
> + " num_samples = gl_NumSamples;\n"
> + "}\n";
> +
> +enum piglit_result
> +piglit_display(void)
> +{
> + return PIGLIT_FAIL;
> +}
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> + GLuint fbo;
> + GLint prog;
> + GLuint ssbo;
> + bool pass = true;
> + GLint actual_n_samples, actual_sample_buffers;
> + GLint shader_n_samples = 0;
> +
> + piglit_require_gl_version(31);
> + piglit_require_extension("GL_ARB_framebuffer_no_attachments");
> + piglit_require_extension("GL_ARB_shader_storage_buffer_object");
> + 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,
> + 1);
> + glFramebufferParameteri(GL_FRAMEBUFFER,
> + GL_FRAMEBUFFER_DEFAULT_HEIGHT,
> + 1);
> + 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);
> +
> + glGenBuffers(1, &ssbo);
> + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, ssbo);
> + glBufferData(GL_SHADER_STORAGE_BUFFER,
> + sizeof (shader_n_samples),
> + &shader_n_samples,
> + GL_DYNAMIC_COPY);
> +
> + prog = piglit_build_simple_program(vs_source, fs_source);
> +
> + glUseProgram(prog);
> +
> + piglit_draw_rect(-1, -1, 2, 2);
> +
> + glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
> +
> + glGetIntegerv(GL_SAMPLES, &actual_n_samples);
> + glGetIntegerv(GL_SAMPLE_BUFFERS, &actual_sample_buffers);
> + glGetBufferSubData(GL_SHADER_STORAGE_BUFFER,
> + 0, /* offset */
> + sizeof (shader_n_samples),
> + &shader_n_samples);
> +
> + printf("Requested samples : %i\n"
> + "glGetIntegerv(GL_SAMPLES) : %i\n"
> + "glGetIntegerv(GL_SAMPLE_BUFFERS) : %i\n"
> + "gl_NumSamples from shader : %u\n",
> + REQUEST_N_SAMPLES,
> + actual_n_samples,
> + actual_sample_buffers,
> + shader_n_samples);
> +
> + if (actual_n_samples < REQUEST_N_SAMPLES) {
> + printf("FAIL: GL_SAMPLES is too small\n");
> + pass = false;
> + }
> +
> + if (actual_sample_buffers != 1) {
> + printf("FAIL: GL_SAMPLE_BUFFERS should be 1\n");
> + pass = false;
> + }
> +
> + if (shader_n_samples != actual_n_samples) {
> + printf("FAIL: GL_SAMPLES does not match gl_NumSamples\n");
> + pass = false;
> + }
> +
> + glDeleteBuffers(1, &ssbo);
> + glDeleteFramebuffers(1, &fbo);
> + glDeleteProgram(prog);
> +
> + piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL);
> +}
> --
> 2.5.0
>
More information about the Piglit
mailing list