[Piglit] [PATCH] Add a basic CopyTexImage test for packed depth/stencil formats.
Kenneth Graunke
kenneth at whitecape.org
Tue Feb 5 22:52:42 PST 2013
This test fills the window with expected depth/stencil values, and uses
CopyTexImage2D to copy those to a texture. It then reads back the
texture and verifies that both depth and stencil were successfully
copied.
This is particularly useful because on Sandybridge and later hardware,
we use a separate stencil buffer, which means that GPU CopyTexImage
paths can easily forget to copy stencil.
The existing copyteximage test includes packed depth/stencil formats,
but only validates the resulting depth values, not stencil.
Cc: Paul Berry <stereotype441 at gmail.com>
---
tests/all.tests | 1 +
tests/texturing/CMakeLists.gl.txt | 1 +
tests/texturing/copyteximage-depthstencil.c | 109 ++++++++++++++++++++++++++++
3 files changed, 111 insertions(+)
create mode 100644 tests/texturing/copyteximage-depthstencil.c
Sure enough, testing things catches bugs.
diff --git a/tests/all.tests b/tests/all.tests
index 2ffc6e1..6bc4d39 100644
--- a/tests/all.tests
+++ b/tests/all.tests
@@ -1618,6 +1618,7 @@ add_fbo_formats_tests('spec/EXT_packed_depth_stencil', 'GL_EXT_packed_depth_sten
add_texwrap_format_tests(ext_packed_depth_stencil, 'GL_EXT_packed_depth_stencil')
ext_packed_depth_stencil['readpixels-24_8'] = PlainExecTest(['ext_packed_depth_stencil-readpixels-24_8', '-auto'])
add_plain_test(ext_packed_depth_stencil, 'fbo-blit-d24s8')
+add_plain_test(ext_packed_depth_stencil, 'copyteximage-depthstencil')
# Note: the buffer sizes of 146, 292, 585, and 1024 hav been chosen to
# exercise all possible combinations of buffer alignments on i965.
for texture_size in (146, 292, 585, 1024):
diff --git a/tests/texturing/CMakeLists.gl.txt b/tests/texturing/CMakeLists.gl.txt
index c9e5d11..b78416b 100644
--- a/tests/texturing/CMakeLists.gl.txt
+++ b/tests/texturing/CMakeLists.gl.txt
@@ -18,6 +18,7 @@ piglit_add_executable (copytexsubimage copytexsubimage.c)
piglit_add_executable (copyteximage copyteximage.c)
piglit_add_executable (copyteximage-border copyteximage-border.c)
piglit_add_executable (copyteximage-clipping copyteximage-clipping.c)
+piglit_add_executable (copyteximage-depthstencil copyteximage-depthstencil.c)
piglit_add_executable (crossbar crossbar.c)
piglit_add_executable (cubemap cubemap.c)
piglit_add_executable (cubemap-shader cubemap-shader.c)
diff --git a/tests/texturing/copyteximage-depthstencil.c b/tests/texturing/copyteximage-depthstencil.c
new file mode 100644
index 0000000..65a9558
--- /dev/null
+++ b/tests/texturing/copyteximage-depthstencil.c
@@ -0,0 +1,109 @@
+/*
+ * 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 copyteximage-depthstencil.c
+ *
+ * A basic test that makes sure glCopyTexImage actually copies both depth
+ * and stencil data.
+ */
+
+#include "piglit-util-gl-common.h"
+
+#define TEX_WIDTH 128
+#define TEX_HEIGHT 4
+
+PIGLIT_GL_TEST_CONFIG_BEGIN
+
+ config.supports_gl_compat_version = 10;
+
+ config.window_width = TEX_WIDTH;
+ config.window_height = TEX_HEIGHT;
+ config.window_visual = PIGLIT_GL_VISUAL_DOUBLE |
+ PIGLIT_GL_VISUAL_RGB |
+ PIGLIT_GL_VISUAL_DEPTH |
+ PIGLIT_GL_VISUAL_STENCIL;
+
+PIGLIT_GL_TEST_CONFIG_END
+
+enum piglit_result
+piglit_display(void)
+{
+ return PIGLIT_FAIL;
+}
+
+void piglit_init(int argc, char **argv)
+{
+ GLuint tex;
+ GLfloat depth[TEX_WIDTH * TEX_HEIGHT];
+ GLuint ds[TEX_WIDTH * TEX_HEIGHT];
+ int i;
+
+ const float expected_depth = 0.7;
+ const int expected_stencil = 0x42;
+
+ bool pass = true;
+
+ piglit_require_extension("GL_EXT_packed_depth_stencil");
+
+ /* Fill the window with expected depth/stencil values */
+ glClearDepth(expected_depth);
+ glClearStencil(expected_stencil);
+ glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+
+ /* Copy the data to the texture */
+ glGenTextures(1, &tex);
+ glBindTexture(GL_TEXTURE_2D, tex);
+ glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8,
+ 0, 0, TEX_WIDTH, TEX_HEIGHT, 0);
+ piglit_check_gl_error(GL_NO_ERROR);
+
+ /* Read back the texture */
+ glGetTexImage(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, GL_FLOAT, depth);
+ piglit_check_gl_error(GL_NO_ERROR);
+
+ glGetTexImage(GL_TEXTURE_2D, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, ds);
+ piglit_check_gl_error(GL_NO_ERROR);
+
+ /* Check for expected values */
+ for (i = 0; i < TEX_WIDTH * TEX_HEIGHT; ++i) {
+ int x = i % TEX_WIDTH;
+ int y = i / TEX_WIDTH;
+
+ unsigned actual_stencil = ds[i] >> 24;
+ float actual_depth = depth[i];
+
+ if (actual_depth != expected_depth) {
+ printf("Depth at (%d, %d) = %.2f, expected %.2f\n",
+ x, y, actual_depth, expected_depth);
+ pass = false;
+ }
+ if (actual_stencil != expected_stencil) {
+ printf("Stencil at (%d, %d) = 0x%x, expected 0x%x\n",
+ x, y, actual_stencil, expected_stencil);
+ pass = false;
+ }
+ }
+
+ piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL);
+}
--
1.8.1.2
More information about the Piglit
mailing list