diff options
author | Alejandro PiƱeiro <apinheiro@igalia.com> | 2015-08-01 18:24:23 +0200 |
---|---|---|
committer | Timothy Arceri <t_arceri@yahoo.com.au> | 2015-08-02 12:40:53 +1000 |
commit | 25f58b2ef0ef80a9dbcb43e6976927fdcb28b617 (patch) | |
tree | 9e93f7e6556953aea6bfb3874ea65fc0805c1063 | |
parent | 1613114272d43bf6016ed8e3ac57a460c5928a14 (diff) |
arb_shader_atomic_counters-semantics: test different binding points
Piglit was only checking the expected effects using binding point 0.
With this commit, all the values between 0 and
GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS are checked.
It also checks that the binding point used on the shader and the one
returned by
glGetActiveAtomicCounterBufferiv(..., ...,
GL_ATOMIC_COUNTER_BUFFER_BINDING, ...) is the same.
This test detects mesa bug:
https://bugs.freedesktop.org/show_bug.cgi?id=90175
-rw-r--r-- | tests/spec/arb_shader_atomic_counters/semantics.c | 154 |
1 files changed, 111 insertions, 43 deletions
diff --git a/tests/spec/arb_shader_atomic_counters/semantics.c b/tests/spec/arb_shader_atomic_counters/semantics.c index 694f1fe5d..921c0e839 100644 --- a/tests/spec/arb_shader_atomic_counters/semantics.c +++ b/tests/spec/arb_shader_atomic_counters/semantics.c @@ -24,7 +24,8 @@ /** @file semantics.c * * Tests that the atomic built-in functions have the expected effects - * on memory and return the expected results. + * on memory and return the expected results, with different binding + * points. */ #include "common.h" @@ -40,7 +41,91 @@ PIGLIT_GL_TEST_CONFIG_BEGIN PIGLIT_GL_TEST_CONFIG_END static bool -run_test_vertex(void) +atomic_counters_expected_binding(GLuint prog, + GLuint binding) +{ + GLint param; + + glGetActiveAtomicCounterBufferiv(prog, 0, + GL_ATOMIC_COUNTER_BUFFER_BINDING, + ¶m); + if (binding != param) + printf ("Unexpected binding point found, %i expected, %i found\n", + binding, param); + + return binding == param; +} + +/* + * @vs_source, @fs_source, @gs_source will be considered a template based on + * @stage. + */ +static bool +test_shader(GLint max_bindings, + GLuint stage, + const char *vs_source, + const char *fs_source, + const char *gs_source, + const uint32_t *start_buffer, + const uint32_t *expected_buffer, + const uint32_t *expected_color) +{ + GLuint prog; + bool ret = true; + GLuint buffer; + char *stage_source; + int i; + int asprintf_ret; + + glGenBuffers(1, &buffer); + for (i = 0; i < max_bindings; i++) { + prog = glCreateProgram(); + glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, i, buffer); + + switch (stage) { + case GL_VERTEX_SHADER: + asprintf_ret = asprintf(&stage_source, vs_source, i); + assert(asprintf_ret > 0); + ret = atomic_counters_compile(prog, GL_FRAGMENT_SHADER, fs_source) && + atomic_counters_compile(prog, GL_VERTEX_SHADER, stage_source); + break; + case GL_FRAGMENT_SHADER: + asprintf_ret = asprintf(&stage_source, fs_source, i); + assert(asprintf_ret > 0); + ret = atomic_counters_compile(prog, GL_FRAGMENT_SHADER, stage_source) && + atomic_counters_compile(prog, GL_VERTEX_SHADER, vs_source); + break; + case GL_GEOMETRY_SHADER: + asprintf_ret = asprintf(&stage_source, gs_source, i); + assert(asprintf_ret > 0); + ret = atomic_counters_compile(prog, GL_FRAGMENT_SHADER, fs_source) && + atomic_counters_compile(prog, GL_VERTEX_SHADER, vs_source) && + atomic_counters_compile(prog, GL_GEOMETRY_SHADER, stage_source); + break; + default: + printf("Unsupported stage %i\n", stage); + return false; + } + + ret = ret && atomic_counters_draw_point(prog, 1, start_buffer) && + piglit_probe_rect_rgba_uint(0, 0, 1, 1, expected_color) && + atomic_counters_probe_buffer(0, 1, expected_buffer) && + atomic_counters_expected_binding(prog, i); + + free(stage_source); + glDeleteProgram(prog); + + if (!ret) + break; + } + + glDeleteBuffers(1, &buffer); + + return ret; +} + +static bool +run_test_vertex(GLint max_bindings) { const char *fs_source = "#version 140\n" "flat in ivec4 vcolor;\n" @@ -48,10 +133,10 @@ run_test_vertex(void) "void main() {\n" " fcolor = vcolor;\n" "}\n"; - const char *vs_source = "#version 140\n" + const char *vs_template = "#version 140\n" "#extension GL_ARB_shader_atomic_counters : enable\n" "\n" - "layout(binding = 0, offset = 0) uniform atomic_uint x;\n" + "layout(binding = %i, offset = 0) uniform atomic_uint x;\n" "in vec4 piglit_vertex;\n" "flat out ivec4 vcolor;\n" "\n" @@ -66,26 +151,20 @@ run_test_vertex(void) const uint32_t expected_buffer[] = { 0x0 }; const uint32_t expected_color[] = { 0xfffffffe, 0xfffffffe, 0xffffffff, 0x0 }; - GLuint prog = glCreateProgram(); - bool ret = - atomic_counters_compile(prog, GL_FRAGMENT_SHADER, fs_source) && - atomic_counters_compile(prog, GL_VERTEX_SHADER, vs_source) && - atomic_counters_draw_point(prog, 1, start_buffer) && - piglit_probe_rect_rgba_uint(0, 0, 1, 1, expected_color) && - atomic_counters_probe_buffer(0, 1, expected_buffer); - glDeleteProgram(prog); - return ret; + return test_shader(max_bindings, GL_VERTEX_SHADER, + vs_template, fs_source, NULL, + start_buffer, expected_buffer, expected_color); } static bool -run_test_fragment(void) +run_test_fragment(GLint max_bindings) { - const char *fs_source = "#version 140\n" + const char *fs_template = "#version 140\n" "#extension GL_ARB_shader_atomic_counters : enable\n" "\n" "out ivec4 fcolor;\n" - "layout(binding = 0, offset = 0) uniform atomic_uint x;\n" + "layout(binding = %i, offset = 0) uniform atomic_uint x;\n" "\n" "void main() {\n" " fcolor.x = int(atomicCounterDecrement(x));\n" @@ -105,20 +184,14 @@ run_test_fragment(void) const uint32_t expected_buffer[] = { 0x0 }; const uint32_t expected_color[] = { 0xfffffffe, 0xfffffffe, 0xffffffff, 0x0 }; - GLuint prog = glCreateProgram(); - bool ret = - atomic_counters_compile(prog, GL_FRAGMENT_SHADER, fs_source) && - atomic_counters_compile(prog, GL_VERTEX_SHADER, vs_source) && - atomic_counters_draw_point(prog, 1, start_buffer) && - piglit_probe_rect_rgba_uint(0, 0, 1, 1, expected_color) && - atomic_counters_probe_buffer(0, 1, expected_buffer); - glDeleteProgram(prog); - return ret; + return test_shader(max_bindings, GL_FRAGMENT_SHADER, + vs_source, fs_template, NULL, + start_buffer, expected_buffer, expected_color); } static bool -run_test_geometry(void) +run_test_geometry(GLint max_bindings) { const char *fs_source = "#version 140\n" "flat in ivec4 gcolor;\n" @@ -126,7 +199,7 @@ run_test_geometry(void) "void main() {\n" " fcolor = gcolor;\n" "}\n"; - const char *gs_source = "#version 150\n" + const char *gs_template = "#version 150\n" "#extension GL_ARB_shader_atomic_counters : enable\n" "\n" "layout(points) in;\n" @@ -134,7 +207,7 @@ run_test_geometry(void) "\n" "flat out ivec4 gcolor;\n" "\n" - "layout(binding = 0, offset = 0) uniform atomic_uint x;\n" + "layout(binding = %i, offset = 0) uniform atomic_uint x;\n" "\n" "void main() {\n" " gl_Position = gl_in[0].gl_Position;\n" @@ -156,17 +229,10 @@ run_test_geometry(void) const uint32_t expected_buffer[] = { 0x0 }; const uint32_t expected_color[] = { 0xfffffffe, 0xfffffffe, 0xffffffff, 0x0 }; - GLuint prog = glCreateProgram(); - bool ret = - atomic_counters_compile(prog, GL_FRAGMENT_SHADER, fs_source) && - atomic_counters_compile(prog, GL_GEOMETRY_SHADER, gs_source) && - atomic_counters_compile(prog, GL_VERTEX_SHADER, vs_source) && - atomic_counters_draw_point(prog, 1, start_buffer) && - piglit_probe_rect_rgba_uint(0, 0, 1, 1, expected_color) && - atomic_counters_probe_buffer(0, 1, expected_buffer); - glDeleteProgram(prog); - return ret; + return test_shader(max_bindings, GL_GEOMETRY_SHADER, + vs_source, fs_source, gs_template, + start_buffer, expected_buffer, expected_color); } static bool @@ -331,6 +397,7 @@ piglit_init(int argc, char **argv) { GLuint fb, rb, buffer; enum piglit_result status = PIGLIT_PASS; + GLint max_bindings; piglit_require_extension("GL_ARB_shader_atomic_counters"); @@ -345,21 +412,22 @@ piglit_init(int argc, char **argv) glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb); - glGenBuffers(1, &buffer); - glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, buffer); + glGetIntegerv(GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS, &max_bindings); atomic_counters_subtest(&status, GL_FRAGMENT_SHADER, "Fragment shader atomic built-in semantics", - run_test_fragment); + run_test_fragment, max_bindings); atomic_counters_subtest(&status, GL_VERTEX_SHADER, "Vertex shader atomic built-in semantics", - run_test_vertex); + run_test_vertex, max_bindings); atomic_counters_subtest(&status, GL_GEOMETRY_SHADER, "Geometry shader atomic built-in semantics", - run_test_geometry); + run_test_geometry, max_bindings); + glGenBuffers(1, &buffer); + glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, buffer); atomic_counters_subtest(&status, GL_TESS_CONTROL_SHADER, "Tessellation control shader atomic built-in " "semantics", |