summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancisco Jerez <currojerez@riseup.net>2013-10-07 16:29:44 -0700
committerFrancisco Jerez <currojerez@riseup.net>2013-10-07 18:16:03 -0700
commit0c3ba755efe84636fbf896f267f5ac96f8bba798 (patch)
tree28de499407bb586f07f72568ccbe1082ad52d1a3
parent25ce3b6c7469dfb35be57045af8451812921a286 (diff)
arb_shader_atomic_counters: Test the buffer binding API functions.
-rw-r--r--tests/all.tests1
-rw-r--r--tests/spec/arb_shader_atomic_counters/CMakeLists.gl.txt1
-rw-r--r--tests/spec/arb_shader_atomic_counters/buffer-binding.c159
3 files changed, 161 insertions, 0 deletions
diff --git a/tests/all.tests b/tests/all.tests
index b9ec52bd6..171f3050e 100644
--- a/tests/all.tests
+++ b/tests/all.tests
@@ -3172,6 +3172,7 @@ import_glsl_parser_tests(spec['ARB_shader_atomic_counters'],
[''])
arb_shader_atomic_counters['active-counters'] = concurrent_test('arb_shader_atomic_counters-active-counters')
arb_shader_atomic_counters['array-indexing'] = concurrent_test('arb_shader_atomic_counters-array-indexing')
+arb_shader_atomic_counters['buffer-binding'] = concurrent_test('arb_shader_atomic_counters-buffer-binding')
profile.tests['hiz'] = hiz
profile.tests['fast_color_clear'] = fast_color_clear
diff --git a/tests/spec/arb_shader_atomic_counters/CMakeLists.gl.txt b/tests/spec/arb_shader_atomic_counters/CMakeLists.gl.txt
index 83e38ecea..93dec7d16 100644
--- a/tests/spec/arb_shader_atomic_counters/CMakeLists.gl.txt
+++ b/tests/spec/arb_shader_atomic_counters/CMakeLists.gl.txt
@@ -12,5 +12,6 @@ link_libraries (
add_executable (arb_shader_atomic_counters-active-counters active-counters.c common.c)
add_executable (arb_shader_atomic_counters-array-indexing array-indexing.c common.c)
+add_executable (arb_shader_atomic_counters-buffer-binding buffer-binding.c common.c)
# vim: ft=cmake:
diff --git a/tests/spec/arb_shader_atomic_counters/buffer-binding.c b/tests/spec/arb_shader_atomic_counters/buffer-binding.c
new file mode 100644
index 000000000..89af96167
--- /dev/null
+++ b/tests/spec/arb_shader_atomic_counters/buffer-binding.c
@@ -0,0 +1,159 @@
+/*
+ * 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 buffer-binding.c
+ *
+ * Test that glBindBufferBase() and glBindBufferRange() have the
+ * necessary error checking for atomic counter buffers and that they
+ * update the buffer metadata correctly.
+ */
+
+#include "common.h"
+
+#define L 1
+
+PIGLIT_GL_TEST_CONFIG_BEGIN
+
+ config.supports_gl_core_version = 31;
+
+ config.window_width = L;
+ config.window_height = L;
+ config.window_visual = PIGLIT_GL_VISUAL_DOUBLE | PIGLIT_GL_VISUAL_RGBA;
+
+PIGLIT_GL_TEST_CONFIG_END
+
+static bool
+run_test_bind_at(unsigned i)
+{
+ GLuint buffer;
+
+ glGenBuffers(1, &buffer);
+
+ glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, i, buffer);
+ if (glGetError())
+ return false;
+
+ glBufferData(GL_ATOMIC_COUNTER_BUFFER, 4, NULL, GL_STATIC_DRAW);
+ glDeleteBuffers(1, &buffer);
+
+ return !glGetError();
+}
+
+static bool
+run_test_bind_range(unsigned i)
+{
+ GLuint buffer;
+ GLint binding;
+ GLint start, size;
+
+ glGenBuffers(1, &buffer);
+
+ glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, i, buffer);
+ if (!piglit_check_gl_error(GL_NO_ERROR)) {
+ printf("Initial buffer binding failed.\n");
+ return false;
+ }
+
+ glBufferData(GL_ATOMIC_COUNTER_BUFFER, 16, NULL, GL_STATIC_DRAW);
+
+ glBindBufferRange(GL_ATOMIC_COUNTER_BUFFER, i, buffer, 6, 5);
+ if (!piglit_check_gl_error(GL_INVALID_VALUE)) {
+ printf("Misaligned buffer range binding didn't generate a"
+ " GL_INVALID_VALUE error.\n");
+ return false;
+ }
+
+ glBindBufferRange(GL_ATOMIC_COUNTER_BUFFER, i, buffer, 8, 5);
+ if (!piglit_check_gl_error(GL_NO_ERROR)) {
+ printf("Buffer range binding failed.\n");
+ return false;
+ }
+
+ glGetIntegerv(GL_ATOMIC_COUNTER_BUFFER_BINDING, &binding);
+ if (!piglit_check_gl_error(GL_NO_ERROR) ||
+ binding != buffer) {
+ printf("Unexpected generic counter buffer binding: 0x%x.\n",
+ binding);
+ return false;
+ }
+
+ glGetIntegeri_v(GL_ATOMIC_COUNTER_BUFFER_BINDING, i, &binding);
+ if (!piglit_check_gl_error(GL_NO_ERROR) ||
+ binding != buffer) {
+ printf("Unexpected counter buffer binding %d: 0x%x.\n",
+ i, binding);
+ return false;
+ }
+
+ glGetIntegeri_v(GL_ATOMIC_COUNTER_BUFFER_START, i, &start);
+ if (!piglit_check_gl_error(GL_NO_ERROR) ||
+ start != 8) {
+ printf("Unexpected counter buffer offset 0x%x.\n",
+ (unsigned)start);
+ return false;
+ }
+
+ glGetIntegeri_v(GL_ATOMIC_COUNTER_BUFFER_SIZE, i, &size);
+ if (!piglit_check_gl_error(GL_NO_ERROR) ||
+ size != 5) {
+ printf("Unexpected counter buffer size: 0x%x.\n",
+ (unsigned)size);
+ return false;
+ }
+
+ glDeleteBuffers(1, &buffer);
+
+ return true;
+}
+
+void
+piglit_init(int argc, char **argv)
+{
+ struct atomic_counters_limits ls = atomic_counters_get_limits();
+ enum piglit_result status = PIGLIT_PASS;
+
+ piglit_require_gl_version(31);
+ piglit_require_extension("GL_ARB_shader_atomic_counters");
+
+ atomic_counters_subtest(&status, GL_NONE,
+ "Atomic buffer binding below the "
+ "implementation limit",
+ run_test_bind_at, ls.bindings - 1);
+
+ atomic_counters_subtest(&status, GL_NONE,
+ "Atomic buffer binding above the "
+ "implementation limit",
+ !run_test_bind_at, ls.bindings);
+
+ atomic_counters_subtest(&status, GL_NONE,
+ "Atomic buffer range binding",
+ run_test_bind_range, ls.bindings - 1);
+
+ piglit_report_result(status);
+}
+
+enum piglit_result
+piglit_display(void)
+{
+ return PIGLIT_PASS;
+}