On Fri, 2015-11-27 at 14:58 +0200, Tapani Pälli wrote: > Test fails on current Mesa (i965 BDW) but passes on NVIDIA binary > driver version 355.11 and AMD binary driver version 15.201.1151. > > v2: - add error checks > - modify to render points > - make it possible to use regular program (makes test pass on > Mesa) > > v3: - bump up glsl version to 1.50 and redeclare gl_Position in vs > (makes the vs compile and test pass on AMD) > > v4: - simplify and modify test to make sure to draw all pixels > (makes the test pass on NVIDIA, previously likely all pixels > just got clipped away) > > v5: - doh, do not free objects in piglit_display(), it can get called > multiple times .. > > Signed-off-by: Tapani Pälli <tapani.pa...@intel.com> > --- > tests/all.py | 2 + > .../arb_separate_shader_objects/CMakeLists.gl.txt | 1 + > .../arb_separate_shader_objects/atomic-counter.c | 153 > +++++++++++++++++++++ > 3 files changed, 156 insertions(+) > create mode 100644 tests/spec/arb_separate_shader_objects/atomic > -counter.c > > diff --git a/tests/all.py b/tests/all.py > index 7689796..8d1b9f7 100644 > --- a/tests/all.py > +++ b/tests/all.py > @@ -2175,6 +2175,8 @@ with profile.group_manager( > '400 combinations by name', run_concurrent=False) > g(['arb_separate_shader_object-active-sampler-conflict'], > 'active sampler conflict') > + g(['arb_separate_shader_object-atomic-counter'], > + 'atomic counter') > > # Group ARB_sampler_objects > with profile.group_manager( > diff --git a/tests/spec/arb_separate_shader_objects/CMakeLists.gl.txt > b/tests/spec/arb_separate_shader_objects/CMakeLists.gl.txt > index db5f7c8..3a55130 100644 > --- a/tests/spec/arb_separate_shader_objects/CMakeLists.gl.txt > +++ b/tests/spec/arb_separate_shader_objects/CMakeLists.gl.txt > @@ -23,3 +23,4 @@ piglit_add_executable (arb_separate_shader_object > -rendezvous_by_name rendezvous_ > piglit_add_executable (arb_separate_shader_object > -rendezvous_by_name_interpolation rendezvous_by_name_interpolation.c > sso-common.c) > piglit_add_executable (arb_separate_shader_object-UseProgramStages > -non-separable UseProgramStages-non-separable.c) > piglit_add_executable (arb_separate_shader_object > -ValidateProgramPipeline ValidateProgramPipeline.c) > +piglit_add_executable (arb_separate_shader_object-atomic-counter > atomic-counter.c) > diff --git a/tests/spec/arb_separate_shader_objects/atomic-counter.c > b/tests/spec/arb_separate_shader_objects/atomic-counter.c > new file mode 100644 > index 0000000..ca3c7d7 > --- /dev/null > +++ b/tests/spec/arb_separate_shader_objects/atomic-counter.c > @@ -0,0 +1,153 @@ > +/* > + * Copyright © 2015 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 atomic-counter.c > + * > + * Test incrementing atomic counter in a separable program. A debug > define > + * REGULAR_PROGRAM can be used to test same program without SSO when > debugging.
If we are going to include the code anyway and its usedfull for debugging why not just make it a subtest? > + */ > + > +#include "piglit-util-gl.h" > + > +PIGLIT_GL_TEST_CONFIG_BEGIN > + > + config.supports_gl_core_version = 31; > + config.window_visual = PIGLIT_GL_VISUAL_RGB | > PIGLIT_GL_VISUAL_DOUBLE; > + > +PIGLIT_GL_TEST_CONFIG_END > + > +const char *vs_source = > + "#version 150\n" > + "in vec4 vertex;\n" > + "out gl_PerVertex { vec4 gl_Position; }; \n" > + "void main() {\n" > + " gl_Position = vertex;\n" > + "}\n"; > + > +const char *fs_source = > + "#version 150\n" > + "#extension GL_ARB_shader_atomic_counters : enable\n" > + "layout(binding = 0, offset = 0) uniform atomic_uint > counter;\n" > + "out vec4 color;\n" > + "void main() {\n" > + " atomicCounterIncrement(counter);\n" > + " uint c = atomicCounter(counter);\n" > + " color = vec4(0.0, c, 0.0, 1.0);\n" > + "}\n"; > + > +GLuint buffer; > +#ifdef REGULAR_PROGRAM > +GLuint prog; > +#else > +GLuint vs, fs, pipe; > +#endif > + > +enum piglit_result > +piglit_display(void) > +{ > + bool pass = true; > + uint32_t *data; > + > + glViewport(0, 0, piglit_width, piglit_height); > + glClear(GL_COLOR_BUFFER_BIT); > + > + piglit_draw_rect(-1, -1, 2, 2); > + > + piglit_present_results(); > + > + if (!piglit_check_gl_error(GL_NO_ERROR)) { > + fprintf(stderr, "error while drawing\n"); > + piglit_report_result(PIGLIT_FAIL); > + } > + > + /* Verify that all the pixels are green. */ > + const float green[] = { 0.0, 1.0, 0.0}; > + pass = pass && > + piglit_probe_rect_rgb(0, 0, piglit_width, > piglit_height, green); > + if (!pass) > + fprintf(stderr, "noise in rendering results\n"); > + > + /* Check that counter was incremented. */ > + glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, buffer); > + glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT); > + data = glMapBufferRange(GL_ATOMIC_COUNTER_BUFFER, 0, > sizeof(uint32_t), > + GL_MAP_READ_BIT); > + pass = pass && *data == piglit_width * piglit_height; > + if (*data != piglit_width * piglit_height) > + fprintf(stderr, "atomic buffer data %u, expected > %u\n", > + *data, piglit_width * piglit_height); > + glUnmapBuffer(GL_ATOMIC_COUNTER_BUFFER); > + glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, 0); > + > + return pass ? PIGLIT_PASS : PIGLIT_FAIL; > +} > + > +void > +piglit_init(int argc, char **argv) > +{ > + bool pass = true; > + uint32_t counter = 0; > + > + piglit_require_gl_version(31); > + piglit_require_extension("GL_ARB_shader_atomic_counters"); > + piglit_require_extension("GL_ARB_separate_shader_objects"); > + > +#ifdef REGULAR_PROGRAM > + /* Just a regular program. */ > + prog = piglit_build_simple_program(vs_source, fs_source); > + glUseProgram(prog); > +#else > + /* Create program pipeline. */ > + glGenProgramPipelines(1, &pipe); > + glBindProgramPipeline(pipe); > + > + vs = glCreateShaderProgramv(GL_VERTEX_SHADER, 1, > &vs_source); > + pass = piglit_link_check_status(vs) && pass; > + > + fs = glCreateShaderProgramv(GL_FRAGMENT_SHADER, 1, > &fs_source); > + pass = piglit_link_check_status(fs) && pass; > + > + glUseProgramStages(pipe, GL_VERTEX_SHADER_BIT, vs); > + glUseProgramStages(pipe, GL_FRAGMENT_SHADER_BIT, fs); > + > + glBindProgramPipeline(pipe); > + glValidateProgramPipeline(pipe); > +#endif > + > + if (!pass || !piglit_check_gl_error(GL_NO_ERROR)) { > + fprintf(stderr, "error building > program/pipeline\n"); > + piglit_report_result(PIGLIT_FAIL); > + } > + > + /* Create atomic counter buffer. */ > + glGenBuffers(1, &buffer); > + glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, buffer); > + glBufferData(GL_ATOMIC_COUNTER_BUFFER, > + sizeof(uint32_t), &counter, GL_DYNAMIC_DRAW); > + > + if (!piglit_check_gl_error(GL_NO_ERROR)) { > + fprintf(stderr, "error creating atomic buffer\n"); > + piglit_report_result(PIGLIT_FAIL); > + } > +} _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/piglit