Commit 60cf489a authored by Chad Versace's avatar Chad Versace Committed by Chad Versace
Browse files

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: default avatarChad Versace <chad.versace@intel.com>
parent 8b22896d
......@@ -1053,6 +1053,11 @@ add_plain_test(hiz, 'hiz-depth-test-fbo-d24-s8')
add_plain_test(hiz, 'hiz-depth-test-fbo-d24s8')
add_plain_test(hiz, 'hiz-depth-test-window-stencil0')
add_plain_test(hiz, 'hiz-depth-test-window-stencil1')
add_plain_test(hiz, 'hiz-stencil-read-fbo-d0-s8')
add_plain_test(hiz, 'hiz-stencil-read-fbo-d24-s8')
add_plain_test(hiz, 'hiz-stencil-read-fbo-d24s8')
add_plain_test(hiz, 'hiz-stencil-read-window-depth0')
add_plain_test(hiz, 'hiz-stencil-read-window-depth1')
add_plain_test(hiz, 'hiz-stencil-test-fbo-d0-s8')
add_plain_test(hiz, 'hiz-stencil-test-fbo-d24-s8')
add_plain_test(hiz, 'hiz-stencil-test-fbo-d24s8')
......
......@@ -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)
......
/*
* 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;
}
/*
* 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;
}
/*
* 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;
}
/*
* 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;
}
/*
* 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;
}
......@@ -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;
}
/** \} */
......@@ -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();
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment