[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