--- tests/all.tests | 1 + tests/general/CMakeLists.gl.txt | 1 + tests/general/polygon-mode-offset.c | 317 +++++++++++++++++++++++++++++++++++ 3 files changed, 319 insertions(+), 0 deletions(-) create mode 100644 tests/general/polygon-mode-offset.c
diff --git a/tests/all.tests b/tests/all.tests index 4b7e076..77461fe 100644 --- a/tests/all.tests +++ b/tests/all.tests @@ -502,6 +502,7 @@ add_plain_test(gl11, 'longprim') add_concurrent_test(gl11, 'masked-clear') add_plain_test(gl11, 'point-line-no-cull') add_plain_test(gl11, 'polygon-mode') +add_concurrent_test(gl11, 'polygon-mode-offset') add_concurrent_test(gl11, 'push-pop-texture-state') add_concurrent_test(gl11, 'quad-invariance') add_plain_test(gl11, 'read-front') diff --git a/tests/general/CMakeLists.gl.txt b/tests/general/CMakeLists.gl.txt index c3a0748..e1eb3e3 100644 --- a/tests/general/CMakeLists.gl.txt +++ b/tests/general/CMakeLists.gl.txt @@ -90,6 +90,7 @@ piglit_add_executable (pbo-teximage pbo-teximage.c) piglit_add_executable (pbo-teximage-tiling pbo-teximage-tiling.c) piglit_add_executable (pbo-teximage-tiling-2 pbo-teximage-tiling-2.c) piglit_add_executable (point-line-no-cull point-line-no-cull.c) +piglit_add_executable (polygon-mode-offset polygon-mode-offset.c) piglit_add_executable (polygon-mode polygon-mode.c) piglit_add_executable (primitive-restart primitive-restart.c) piglit_add_executable (provoking-vertex provoking-vertex.c) diff --git a/tests/general/polygon-mode-offset.c b/tests/general/polygon-mode-offset.c new file mode 100644 index 0000000..3832df2 --- /dev/null +++ b/tests/general/polygon-mode-offset.c @@ -0,0 +1,317 @@ +/* + * Copyright ?? 2013 VMware, 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 + * 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. + * + */ + + +/** + * Test glPolygonMode + glPolygonOffset. + * + * Brian Paul + * Feb 2013 + */ + + +#include "piglit-util-gl-common.h" + + +PIGLIT_GL_TEST_CONFIG_BEGIN + config.supports_gl_compat_version = 10; + config.window_visual = (PIGLIT_GL_VISUAL_RGB | + PIGLIT_GL_VISUAL_DOUBLE | + PIGLIT_GL_VISUAL_DEPTH); +PIGLIT_GL_TEST_CONFIG_END + + + +/** + * Check that we drew a white outline around the blue polygon + */ +static bool +check_lines_visible(int number) +{ + static const float white[3] = {1, 1, 1}; + static const float blue[3] = {0, 0, 1}; + const int w = piglit_width, h = piglit_height; + const int mx = w / 2, my = h / 2; + float p[4]; + bool pass = true; + + /* probe bottom */ + if (!piglit_probe_pixel_rgb_silent(mx, 1, white, p)) { + piglit_report_subtest_result(PIGLIT_FAIL, + "config %d: Expected white pixel on bottom edge", + number); + pass = false; + } + + /* probe top */ + if (!piglit_probe_pixel_rgb_silent(mx, h-2, white, p)) { + piglit_report_subtest_result(PIGLIT_FAIL, + "config %d: Expected white pixel on top edge", + number); + pass = false; + } + + /* probe left */ + if (!piglit_probe_pixel_rgb_silent(1, my, white, p)) { + piglit_report_subtest_result(PIGLIT_FAIL, + "config %d: Expected white pixel on left edge", + number); + pass = false; + } + + /* probe right */ + if (!piglit_probe_pixel_rgb_silent(w-2, my, white, p)) { + piglit_report_subtest_result(PIGLIT_FAIL, + "config %d: Expected white pixel on right edge", + number); + pass = false; + } + + /* probe center */ + if (!piglit_probe_pixel_rgb_silent(mx, my, blue, p)) { + piglit_report_subtest_result(PIGLIT_FAIL, + "config %d: Expected blue pixel in center", + number); + pass = false; + } + + return pass; +} + + +/** Draw rect with clockwise vertices */ +static void +rect_cw(float coords[2][2]) +{ + glBegin(GL_POLYGON); + glVertex2f(coords[0][0], coords[0][0]); + glVertex2f(coords[0][0], coords[1][0]); + glVertex2f(coords[1][0], coords[1][0]); + glVertex2f(coords[1][0], coords[0][0]); + glEnd(); +} + + +/** Draw rect with counter clockwise vertices */ +static void +rect_ccw(float coords[2][2]) +{ + glBegin(GL_POLYGON); + glVertex2f(coords[0][0], coords[0][0]); + glVertex2f(coords[1][0], coords[0][0]); + glVertex2f(coords[1][0], coords[1][0]); + glVertex2f(coords[0][0], coords[1][0]); + glEnd(); +} + + +enum color { WHITE, BLUE }; + +struct test_config { + GLenum offsetEnable; + float offsetFactor, offsetUnits; + /* first prim: */ + GLenum frontMode1, backMode1; + enum color color1; + GLenum winding1; + /* second prim: */ + GLenum frontMode2, backMode2; + enum color color2; + GLenum winding2; +}; + + +/** + * For all these test configurations, we should wind up drawing a + * blue filled quad with a white outline. + */ +static const struct test_config configs[] = { + { + GL_POLYGON_OFFSET_FILL, 1.0, 1.0, + /* first prim */ + GL_LINE, GL_LINE, WHITE, GL_CCW, + /* second prim */ + GL_FILL, GL_FILL, BLUE, GL_CCW + }, + { + GL_POLYGON_OFFSET_FILL, 1.0, 1.0, + /* first prim */ + GL_FILL, GL_FILL, BLUE, GL_CCW, + /* second prim */ + GL_LINE, GL_LINE, WHITE, GL_CCW + }, + { + GL_POLYGON_OFFSET_FILL, 1.0, 1.0, + /* first prim */ + GL_FILL, GL_LINE, BLUE, GL_CCW, + /* second prim */ + GL_FILL, GL_LINE, WHITE, GL_CW + }, + { + GL_POLYGON_OFFSET_FILL, 1.0, 1.0, + /* first prim */ + GL_LINE, GL_FILL, WHITE, GL_CCW, + /* second prim */ + GL_LINE, GL_FILL, BLUE, GL_CW + }, + { + GL_POLYGON_OFFSET_LINE, 1.0, -1.0, + /* first prim */ + GL_LINE, GL_FILL, WHITE, GL_CCW, + /* second prim */ + GL_LINE, GL_FILL, BLUE, GL_CW + }, + { + GL_POLYGON_OFFSET_LINE, 1.0, -1.0, + /* first prim */ + GL_LINE, GL_FILL, BLUE, GL_CW, + /* second prim */ + GL_LINE, GL_FILL, WHITE, GL_CCW + }, + { + GL_POLYGON_OFFSET_LINE, 1.0, -1.0, + /* first prim */ + GL_FILL, GL_LINE, BLUE, GL_CCW, + /* second prim */ + GL_FILL, GL_LINE, WHITE, GL_CW + } +}; + + +/** Test one configuration */ +static bool +test(int config_number) +{ + const struct test_config *config = &configs[config_number]; + bool pass; + float white_coords[2][2], blue_coords[2][2], (*coords)[2]; + + /* for drawing the filled quad (cover the whole window) */ + blue_coords[0][0] = 0; + blue_coords[0][1] = 0; + blue_coords[1][0] = piglit_width; + blue_coords[1][1] = piglit_height; + + /* for drawing the outline (2 pixels smaller than the window size) */ + white_coords[0][0] = 1; + white_coords[0][1] = 1; + white_coords[1][0] = piglit_width - 2; + white_coords[1][1] = piglit_height - 2; + + assert(config->offsetEnable == GL_POLYGON_OFFSET_FILL || + config->offsetEnable == GL_POLYGON_OFFSET_LINE || + config->offsetEnable == GL_POLYGON_OFFSET_POINT); + + assert(config->frontMode1 == GL_LINE || + config->frontMode1 == GL_FILL || + config->frontMode1 == GL_POINT); + + assert(config->backMode1 == GL_LINE || + config->backMode1 == GL_FILL || + config->backMode1 == GL_POINT); + + assert(config->winding1 == GL_CW || + config->winding1 == GL_CCW); + + assert(config->winding2 == GL_CW || + config->winding2 == GL_CCW); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glEnable(config->offsetEnable); + glPolygonOffset(config->offsetFactor, config->offsetUnits); + + /* draw first prim */ + glPolygonMode(GL_FRONT, config->frontMode1); + glPolygonMode(GL_BACK, config->backMode1); + if (config->color1 == WHITE) { + glColor3f(1, 1, 1); + coords = white_coords; + } + else { + glColor3f(0, 0, 1); + coords = blue_coords; + } + + if (config->winding1 == GL_CW) + rect_cw(coords); + else + rect_ccw(coords); + + /* draw second prim */ + glPolygonMode(GL_FRONT, config->frontMode2); + glPolygonMode(GL_BACK, config->backMode2); + if (config->color2 == WHITE) { + glColor3f(1, 1, 1); + coords = white_coords; + } + else { + glColor3f(0, 0, 1); + coords = blue_coords; + } + + if (config->winding2 == GL_CW) + rect_cw(coords); + else + rect_ccw(coords); + + /* check results */ + pass = check_lines_visible(config_number); + + piglit_present_results(); + + glDisable(config->offsetEnable); + + return pass; +} + + +enum piglit_result +piglit_display(void) +{ + int i; + bool pass = true; + + piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE); + + /* Sub-pixel translation so that lines hit specific pixels */ + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0.375, 0.375, 0.0); + + for (i = 0; i < ARRAY_SIZE(configs); i++) { + pass = test(i) && pass; + } + + return pass ? PIGLIT_PASS : PIGLIT_FAIL; +} + + +void +piglit_init(int argc, char **argv) +{ + glClearColor(1, 0, 0, 0); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); +} -- 1.7.3.4
_______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/piglit