[Piglit] [PATCH] arb_invalidate_subdata: add test for glInvalidateBuffer(Sub)Data
Nicolai Hähnle
nhaehnle at gmail.com
Mon Jan 11 20:04:21 PST 2016
From: Nicolai Hähnle <nicolai.haehnle at amd.com>
Since no-op is a valid implementation, this only checks the error conditions.
Mesa currently fails this, I have a patch in the pipeline.
Signed-off-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
---
tests/all.py | 6 +
tests/spec/CMakeLists.txt | 1 +
.../spec/arb_invalidate_subdata/CMakeLists.gl.txt | 12 ++
tests/spec/arb_invalidate_subdata/CMakeLists.txt | 1 +
tests/spec/arb_invalidate_subdata/buffer.c | 179 +++++++++++++++++++++
5 files changed, 199 insertions(+)
create mode 100644 tests/spec/arb_invalidate_subdata/CMakeLists.gl.txt
create mode 100644 tests/spec/arb_invalidate_subdata/CMakeLists.txt
create mode 100644 tests/spec/arb_invalidate_subdata/buffer.c
diff --git a/tests/all.py b/tests/all.py
index 8982d22..1c8d87b 100644
--- a/tests/all.py
+++ b/tests/all.py
@@ -4592,5 +4592,11 @@ with profile.group_manager(
g(['arb_indirect_parameters-tf-count-arrays'], 'tf-count-arrays')
g(['arb_indirect_parameters-tf-count-elements'], 'tf-count-elements')
+# Group ARB_invalidate_subdata
+with profile.group_manager(
+ PiglitGLTest,
+ grouptools.join('spec', 'ARB_invalidate_subdata')) as g:
+ g(['arb_invalidate_subdata-buffer'], 'buffer')
+
if platform.system() is 'Windows':
profile.filter_tests(lambda p, _: not p.startswith('glx'))
diff --git a/tests/spec/CMakeLists.txt b/tests/spec/CMakeLists.txt
index 383cd60..fb1269b 100644
--- a/tests/spec/CMakeLists.txt
+++ b/tests/spec/CMakeLists.txt
@@ -30,6 +30,7 @@ add_subdirectory (arb_gpu_shader5)
add_subdirectory (arb_gpu_shader_fp64)
add_subdirectory (arb_instanced_arrays)
add_subdirectory (arb_internalformat_query)
+add_subdirectory (arb_invalidate_subdata)
add_subdirectory (arb_map_buffer_alignment)
add_subdirectory (arb_map_buffer_range)
add_subdirectory (arb_multisample)
diff --git a/tests/spec/arb_invalidate_subdata/CMakeLists.gl.txt b/tests/spec/arb_invalidate_subdata/CMakeLists.gl.txt
new file mode 100644
index 0000000..22574f7
--- /dev/null
+++ b/tests/spec/arb_invalidate_subdata/CMakeLists.gl.txt
@@ -0,0 +1,12 @@
+include_directories(
+ ${GLEXT_INCLUDE_DIR}
+ ${OPENGL_INCLUDE_PATH}
+ ${piglit_SOURCE_DIR}/tests/mesa/util
+)
+
+link_libraries (
+ piglitutil_${piglit_target_api}
+ ${OPENGL_gl_LIBRARY}
+)
+
+piglit_add_executable (arb_invalidate_subdata-buffer buffer.c)
diff --git a/tests/spec/arb_invalidate_subdata/CMakeLists.txt b/tests/spec/arb_invalidate_subdata/CMakeLists.txt
new file mode 100644
index 0000000..144a306
--- /dev/null
+++ b/tests/spec/arb_invalidate_subdata/CMakeLists.txt
@@ -0,0 +1 @@
+piglit_include_target_api()
diff --git a/tests/spec/arb_invalidate_subdata/buffer.c b/tests/spec/arb_invalidate_subdata/buffer.c
new file mode 100644
index 0000000..637596a
--- /dev/null
+++ b/tests/spec/arb_invalidate_subdata/buffer.c
@@ -0,0 +1,179 @@
+/*
+ * Copyright 2016 Advanced Micro Devices, Inc.
+ *
+ * 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
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, 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 NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS 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.
+ *
+ * Authors:
+ * Nicolai Hähnle <nicolai.haehnle at amd.com>
+ */
+
+/*
+ * No-op is a conforming implementation of glInvalidateBuffer(Sub)Data, so
+ * this test only checks error conditions.
+ */
+
+#include "piglit-util-gl.h"
+
+PIGLIT_GL_TEST_CONFIG_BEGIN
+
+ config.supports_gl_core_version = 31;
+ config.window_visual = PIGLIT_GL_VISUAL_RGBA | PIGLIT_GL_VISUAL_DOUBLE;
+
+PIGLIT_GL_TEST_CONFIG_END
+
+/*
+ * Section 6.5 (Invalidating Buffer Data) of the OpenGL 4.5 (Compatibility
+ * Profile) spec:
+ *
+ * * An INVALID_VALUE error is generated if buffer is zero or is not the
+ * name of an existing buffer object.
+ * * An INVALID_VALUE error is generated if offset or length is negative,
+ * or if offset + length is greater than the value of BUFFER_SIZE for
+ * buffer.
+ * * An INVALID_OPERATION error is generated if buffer is currently mapped
+ * by MapBuffer or if the invalidate range intersects the range currently
+ * mapped by MapBufferRange, unless it was mapped with MAP_PERSISTENT_BIT
+ * set in the MapBufferRange access flags.
+ */
+static bool
+check_errors_subdata()
+{
+ GLuint buffer;
+ bool pass = true;
+
+ glGenBuffers(1, &buffer);
+
+ pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+ glInvalidateBufferSubData(buffer, 0, 0);
+ pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass;
+
+ glBindBuffer(GL_ARRAY_BUFFER, buffer);
+ glInvalidateBufferSubData(buffer, 0, 0);
+ pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+
+ glBufferData(GL_ARRAY_BUFFER, 1024, NULL, GL_STREAM_DRAW);
+ glInvalidateBufferSubData(buffer, 0, 1024);
+ pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+
+ glInvalidateBufferSubData(buffer, -1, 0);
+ pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass;
+
+ glInvalidateBufferSubData(buffer, 0, -1);
+ pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass;
+
+ glInvalidateBufferSubData(buffer, 1023, 2);
+ pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass;
+
+ glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
+
+ pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+ glInvalidateBufferSubData(buffer, 0, 1);
+ pass = piglit_check_gl_error(GL_INVALID_OPERATION) && pass;
+
+ glUnmapBuffer(GL_ARRAY_BUFFER);
+
+ glMapBufferRange(GL_ARRAY_BUFFER, 256, 256, GL_MAP_WRITE_BIT);
+
+ glInvalidateBufferSubData(buffer, 0, 256);
+ pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+
+ glInvalidateBufferSubData(buffer, 512, 512);
+ pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+
+ glInvalidateBufferSubData(buffer, 240, 100);
+ pass = piglit_check_gl_error(GL_INVALID_OPERATION) && pass;
+
+ glUnmapBuffer(GL_ARRAY_BUFFER);
+
+ if (piglit_is_extension_supported("GL_ARB_buffer_storage")) {
+ glBufferStorage(GL_ARRAY_BUFFER, 1024, NULL,
+ GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT);
+
+ glMapBufferRange(GL_ARRAY_BUFFER, 256, 256,
+ GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT);
+
+ glInvalidateBufferSubData(buffer, 240, 100);
+ pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+
+ glUnmapBuffer(GL_ARRAY_BUFFER);
+ }
+
+ glDeleteBuffers(1, &buffer);
+
+ return pass;
+}
+
+static bool
+check_errors_data()
+{
+ GLuint buffer;
+ bool pass = true;
+
+ glGenBuffers(1, &buffer);
+
+ pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+ glInvalidateBufferData(buffer);
+ pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass;
+
+ glBindBuffer(GL_ARRAY_BUFFER, buffer);
+ glInvalidateBufferData(buffer);
+ pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+
+ glBufferData(GL_ARRAY_BUFFER, 1024, NULL, GL_STREAM_DRAW);
+ glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
+
+ pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+ glInvalidateBufferData(buffer);
+ pass = piglit_check_gl_error(GL_INVALID_OPERATION) && pass;
+
+ glUnmapBuffer(GL_ARRAY_BUFFER);
+
+ if (piglit_is_extension_supported("GL_ARB_buffer_storage")) {
+ glBufferStorage(GL_ARRAY_BUFFER, 1024, NULL,
+ GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT);
+
+ glMapBufferRange(GL_ARRAY_BUFFER, 256, 256, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT);
+ glInvalidateBufferData(buffer);
+ pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+
+ glUnmapBuffer(GL_ARRAY_BUFFER);
+ }
+
+ glDeleteBuffers(1, &buffer);
+
+ return pass;
+}
+
+enum piglit_result
+piglit_display(void)
+{
+ bool pass = true;
+
+ pass = check_errors_subdata() && pass;
+ pass = check_errors_data() && pass;
+
+ return pass ? PIGLIT_PASS : PIGLIT_FAIL;
+}
+
+void
+piglit_init(int argc, char **argv)
+{
+ piglit_require_extension("GL_ARB_invalidate_subdata");
+}
--
2.5.0
More information about the Piglit
mailing list