diff options
author | Chad Versace <chad.versace@intel.com> | 2011-05-18 19:41:29 -0700 |
---|---|---|
committer | Chad Versace <chad@chad-versace.us> | 2011-06-01 19:13:22 -0700 |
commit | 60cf489a16ab2611d3e50b46ba6bd5f5a4bff717 (patch) | |
tree | 72dcf62642f3c44d8dd6a7c48b0dcc1250f16904 /tests/hiz | |
parent | 8b22896d56737b38476b483f219c07c521f3213c (diff) |
hiz: Add tests for stencil buffer reads
Add the following tests:
hiz-stencil-read-fbo-d0-s8.c
hiz-stencil-read-fbo-d24-s8.c
hiz-stencil-read-fbo-d24s8.c
hiz-stencil-read-window-depth0.c
hiz-stencil-read-window-depth1.c
These tests check that stencil reads work correctly when rendering to
various framebuffer configurations, including FBO's and window
framebuffers.
Signed-off-by: Chad Versace <chad.versace@intel.com>
Diffstat (limited to 'tests/hiz')
-rw-r--r-- | tests/hiz/CMakeLists.gl.txt | 5 | ||||
-rw-r--r-- | tests/hiz/hiz-stencil-read-fbo-d0-s8.c | 66 | ||||
-rw-r--r-- | tests/hiz/hiz-stencil-read-fbo-d24-s8.c | 67 | ||||
-rw-r--r-- | tests/hiz/hiz-stencil-read-fbo-d24s8.c | 66 | ||||
-rw-r--r-- | tests/hiz/hiz-stencil-read-window-depth0.c | 57 | ||||
-rw-r--r-- | tests/hiz/hiz-stencil-read-window-depth1.c | 57 | ||||
-rw-r--r-- | tests/hiz/hiz-util.c | 136 | ||||
-rw-r--r-- | tests/hiz/hiz-util.h | 31 |
8 files changed, 485 insertions, 0 deletions
diff --git a/tests/hiz/CMakeLists.gl.txt b/tests/hiz/CMakeLists.gl.txt index d9ba5b2bc..98222c58b 100644 --- a/tests/hiz/CMakeLists.gl.txt +++ b/tests/hiz/CMakeLists.gl.txt @@ -29,6 +29,11 @@ add_executable(hiz-depth-test-fbo-d24-s8 hiz-depth-test-fbo-d24-s8.c) add_executable(hiz-depth-test-fbo-d24s8 hiz-depth-test-fbo-d24s8.c) add_executable(hiz-depth-test-window-stencil0 hiz-depth-test-window-stencil0.c) add_executable(hiz-depth-test-window-stencil1 hiz-depth-test-window-stencil1.c) +add_executable(hiz-stencil-read-fbo-d0-s8 hiz-stencil-read-fbo-d0-s8.c) +add_executable(hiz-stencil-read-fbo-d24-s8 hiz-stencil-read-fbo-d24-s8.c) +add_executable(hiz-stencil-read-fbo-d24s8 hiz-stencil-read-fbo-d24s8.c) +add_executable(hiz-stencil-read-window-depth0 hiz-stencil-read-window-depth0.c) +add_executable(hiz-stencil-read-window-depth1 hiz-stencil-read-window-depth1.c) add_executable(hiz-stencil-test-fbo-d0-s8 hiz-stencil-test-fbo-d0-s8.c) add_executable(hiz-stencil-test-fbo-d24-s8 hiz-stencil-test-fbo-d24-s8.c) add_executable(hiz-stencil-test-fbo-d24s8 hiz-stencil-test-fbo-d24s8.c) diff --git a/tests/hiz/hiz-stencil-read-fbo-d0-s8.c b/tests/hiz/hiz-stencil-read-fbo-d0-s8.c new file mode 100644 index 000000000..20a143641 --- /dev/null +++ b/tests/hiz/hiz-stencil-read-fbo-d0-s8.c @@ -0,0 +1,66 @@ +/* + * Copyright © 2011 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. + * + * Authors: + * Chad Versace <chad.versace@intel.com> + */ + +/** + * \file hiz-stencil-read-fbo-d0-s8.c + * + * Check that 1) correct values are written to and that 2) expected values are + * read back from the stencil buffer when using an FBO with the following + * attachments: + * - GL_COLOR_ATTACHMENT0: GL_RGBA + * - GL_STENCIL_ATTACHMENT: GL_STENCIL_INDEX8 + * + * \author Chad Versace <chad.versace@intel.com> + */ + +#include "piglit-util.h" +#include "hiz/hiz-util.h" + +int piglit_width = 400; +int piglit_height = 400; +int piglit_window_mode = GLUT_RGB; + +struct hiz_fbo_options fbo_options = { + GL_RGBA, + 0, + GL_STENCIL_INDEX8, + 0, +}; + +void +piglit_init(int argc, char **argv) +{ + /* empty */ +} + +enum piglit_result +piglit_display() +{ + if (hiz_run_test_stencil_read_fbo(&fbo_options)) + return PIGLIT_PASS; + else + return PIGLIT_FAIL; +} diff --git a/tests/hiz/hiz-stencil-read-fbo-d24-s8.c b/tests/hiz/hiz-stencil-read-fbo-d24-s8.c new file mode 100644 index 000000000..fdee06573 --- /dev/null +++ b/tests/hiz/hiz-stencil-read-fbo-d24-s8.c @@ -0,0 +1,67 @@ +/* + * Copyright © 2011 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. + * + * Authors: + * Chad Versace <chad.versace@intel.com> + */ + +/** + * \file hiz-stencil-read-fbo-d24-s8.c + * + * Check that 1) correct values are written to and that 2) expected values are + * read back from the stencil buffer when using an FBO with the following + * attachments: + * - GL_COLOR_ATTACHMENT0: GL_RGBA + * - GL_DEPTH_ATTACHMENT: GL_DEPTH_COMPONENT24 + * - GL_STENCIL_ATTACHMENT: GL_STENCIL_INDEX8 + * + * \author Chad Versace <chad.versace@intel.com> + */ + +#include "piglit-util.h" +#include "hiz/hiz-util.h" + +int piglit_width = 400; +int piglit_height = 400; +int piglit_window_mode = GLUT_RGB; + +struct hiz_fbo_options fbo_options = { + GL_RGBA, + GL_DEPTH_COMPONENT24, + GL_STENCIL_INDEX8, + 0, +}; + +void +piglit_init(int argc, char **argv) +{ + /* empty */ +} + +enum piglit_result +piglit_display() +{ + if (hiz_run_test_stencil_read_fbo(&fbo_options)) + return PIGLIT_PASS; + else + return PIGLIT_FAIL; +} diff --git a/tests/hiz/hiz-stencil-read-fbo-d24s8.c b/tests/hiz/hiz-stencil-read-fbo-d24s8.c new file mode 100644 index 000000000..19d94923e --- /dev/null +++ b/tests/hiz/hiz-stencil-read-fbo-d24s8.c @@ -0,0 +1,66 @@ +/* + * Copyright © 2011 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. + * + * Authors: + * Chad Versace <chad.versace@intel.com> + */ + +/** + * \file hiz-stencil-read-fbo-d24s8.c + * + * Check that 1) correct values are written to and that 2) expected values are + * read back from the stencil buffer when using an FBO with the following + * attachments: + * - GL_COLOR_ATTACHMENT0: GL_RGBA + * - GL_DEPTH_STENCIL_ATTACHMENT: GL_DEPTH24_STENCIL8 + * + * \author Chad Versace <chad.versace@intel.com> + */ + +#include "piglit-util.h" +#include "hiz/hiz-util.h" + +int piglit_width = 400; +int piglit_height = 400; +int piglit_window_mode = GLUT_RGB; + +struct hiz_fbo_options fbo_options = { + GL_RGBA, + 0, + 0, + GL_DEPTH24_STENCIL8, +}; + +void +piglit_init(int argc, char **argv) +{ + /* empty */ +} + +enum piglit_result +piglit_display() +{ + if (hiz_run_test_stencil_read_fbo(&fbo_options)) + return PIGLIT_PASS; + else + return PIGLIT_FAIL; +} diff --git a/tests/hiz/hiz-stencil-read-window-depth0.c b/tests/hiz/hiz-stencil-read-window-depth0.c new file mode 100644 index 000000000..b4e21b21f --- /dev/null +++ b/tests/hiz/hiz-stencil-read-window-depth0.c @@ -0,0 +1,57 @@ +/* + * Copyright © 2011 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. + * + * Authors: + * Chad Versace <chad.versace@intel.com> + */ + +/** + * \file hiz-stencil-read-window-depth0.c + * + * Check that 1) correct values are written to and that 2) expected values are + * read back from the stencil buffer when using a window framebuffer for which + * no depth buffer was requested. + * + * \author Chad Versace <chad.versace@intel.com> + */ + +#include "piglit-util.h" +#include "hiz/hiz-util.h" + +int piglit_width = 400; +int piglit_height = 400; +int piglit_window_mode = GLUT_RGB | GLUT_ALPHA | GLUT_STENCIL; + +void +piglit_init(int argc, char **argv) +{ + /* empty */ +} + +enum piglit_result +piglit_display() +{ + if (hiz_run_test_stencil_read_window()) + return PIGLIT_PASS; + else + return PIGLIT_FAIL; +} diff --git a/tests/hiz/hiz-stencil-read-window-depth1.c b/tests/hiz/hiz-stencil-read-window-depth1.c new file mode 100644 index 000000000..c2650fc8e --- /dev/null +++ b/tests/hiz/hiz-stencil-read-window-depth1.c @@ -0,0 +1,57 @@ +/* + * Copyright © 2011 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. + * + * Authors: + * Chad Versace <chad.versace@intel.com> + */ + +/** + * \file hiz-stencil-read-window-depth0.c + * + * Check that 1) correct values are written to and that 2) expected values are + * read back from the stencil buffer when using a window framebuffer with a + * depth buffer. + * + * \author Chad Versace <chad.versace@intel.com> + */ + +#include "piglit-util.h" +#include "hiz/hiz-util.h" + +int piglit_width = 400; +int piglit_height = 400; +int piglit_window_mode = GLUT_RGB | GLUT_ALPHA | GLUT_STENCIL | GLUT_DEPTH; + +void +piglit_init(int argc, char **argv) +{ + /* empty */ +} + +enum piglit_result +piglit_display() +{ + if (hiz_run_test_stencil_read_window()) + return PIGLIT_PASS; + else + return PIGLIT_FAIL; +} diff --git a/tests/hiz/hiz-util.c b/tests/hiz/hiz-util.c index 60df8c968..0ef382e18 100644 --- a/tests/hiz/hiz-util.c +++ b/tests/hiz/hiz-util.c @@ -64,6 +64,12 @@ hiz_probe_depth_buffer(const float expected_depths[]) hiz_probe_common(piglit_probe_rect_depth, expected_depths); } +bool +hiz_probe_stencil_buffer(const unsigned expected_stencil[]) +{ + hiz_probe_common(piglit_probe_rect_stencil, expected_stencil); +} + GLuint hiz_make_fbo(const struct hiz_fbo_options *options) @@ -406,3 +412,133 @@ hiz_run_test_stencil_test_window() } /** \} */ + +/* ------------------------------------------------------------------------ */ + +/** + * \name hiz_run_stencil_read utilties + * + * Utilities for testing the reading of the stencil buffer. + * + * \{ + */ + +/** + * Common functionality needed by hiz_run_test_stencil_read_fbo() and + * hiz_run_test_stencil_read_window(). + */ +static bool +hiz_run_test_stencil_read_common() +{ + static const float *expected_colors[9] = { + hiz_green, + hiz_green, + hiz_grey, + + hiz_green, + hiz_blue, + hiz_grey, + + hiz_grey, + hiz_blue, + hiz_grey, + }; + + static const unsigned expected_stencil[9] = { + 5, + 5, + 3, + + 5, + 6, + 4, + + 4, + 5, + 4, + }; + + const float dx = piglit_width / 3.0; + const float dy = piglit_height / 3.0; + + /* Set up depth state. */ + glDisable(GL_DEPTH_TEST); + glClearDepth(hiz_clear_z); + + /* Set up stencil state. */ + glEnable(GL_STENCIL_TEST); + glClearStencil(3); /* 3 is a good canary. */ + glStencilFunc(GL_LESS, 3, ~0); + glStencilOp(GL_INCR, GL_INCR, GL_INCR); + + glClearColor(hiz_grey[0], hiz_grey[1], hiz_grey[2], hiz_grey[3]); + glClear(GL_COLOR_BUFFER_BIT + | GL_DEPTH_BUFFER_BIT + | GL_STENCIL_BUFFER_BIT); + + glViewport(0, 0, piglit_width, piglit_height); + piglit_ortho_projection(piglit_width, piglit_height, false); + + /* Draw rect 1. */ + glColor4fv(hiz_grey); + piglit_draw_rect(0 * dx, 0 * dy, /* x, y */ + 2 * dx, 3 * dy); /* w, h */ + + /* Draw rect 2. */ + glColor4fv(hiz_green); + piglit_draw_rect(0 * dx, 0 * dy, /* x, y */ + 2 * dx, 2 * dy); /* w, h */ + + /* Draw rect 3. */ + glColor4fv(hiz_blue); + piglit_draw_rect(1 * dx, 1 * dy, /* x, y */ + 2 * dx, 2 * dy); /* w, h */ + + assert(!glGetError()); + + if (!hiz_probe_color_buffer(expected_colors)) + return false; + return hiz_probe_stencil_buffer(expected_stencil); +} + +bool +hiz_run_test_stencil_read_fbo(const struct hiz_fbo_options *fbo_options) +{ + bool pass = true; + GLuint fbo = 0; + + piglit_require_extension("GL_ARB_framebuffer_object"); + + /* Create and bind FBO. */ + fbo = hiz_make_fbo(fbo_options); + assert(fbo != 0); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); + glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo); + + pass = hiz_run_test_stencil_read_common(); + + if (!piglit_automatic) { + /* Blit the FBO to the window FB so we can see the results. */ + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + glBlitFramebuffer(0, 0, piglit_width, piglit_height, + 0, 0, piglit_width, piglit_height, + GL_COLOR_BUFFER_BIT, GL_NEAREST); + glutSwapBuffers(); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); + } + + hiz_delete_fbo(fbo); + + return pass; +} + +bool +hiz_run_test_stencil_read_window() +{ + bool pass = hiz_run_test_stencil_read_common(); + if (!piglit_automatic) + glutSwapBuffers(); + return pass; +} + +/** \} */ diff --git a/tests/hiz/hiz-util.h b/tests/hiz/hiz-util.h index 1aac16f83..d2281e48d 100644 --- a/tests/hiz/hiz-util.h +++ b/tests/hiz/hiz-util.h @@ -71,6 +71,14 @@ bool hiz_probe_color_buffer(const float *expected_colors[]); */ bool hiz_probe_depth_buffer(const float expected_depths[]); +/** + * \brief Probe the stencil buffer. + * \param expected_stencil Array of 9 ints. + * \return True if all probes pass. + * \see hiz_probe_color_buffer() + */ +bool hiz_probe_stencil_buffer(const unsigned expected_stencil[]); + GLuint hiz_make_fbo(const struct hiz_fbo_options *options); /** @@ -118,3 +126,26 @@ bool hiz_run_test_stencil_test_fbo(const struct hiz_fbo_options *options); * \see hiz_run_test_stencil_test_fbo() */ bool hiz_run_test_stencil_test_window(); + +/** + * \brief Test reading the stencil buffer of an FBO. + * + * First, probe the color buffer to check that stencil testing worked as + * expected. If it did not, then immediately report test failure and do not + * probe the stencil buffer. If stencil testing misbehaved, we cannot expect + * the stencil buffer to hold the expected values. + * + * For this test, stencil test is enabled and depth test disabled. + * + * \param options Perform the test with an FBO with the given formats. + * \return True if test passed. + */ +bool hiz_run_test_stencil_read_fbo(const struct hiz_fbo_options *options); + +/** + * \brief Test reading the stencil buffer of the window framebuffer. + * + * \return True if test passed. + * \see hiz_run_test_stencil_read_fbo() + */ +bool hiz_run_test_stencil_read_window(); |