[Piglit] =?y?q?=5BPATCH=5D=20polygon-mode-offset=3A=20test=20glPolygonMode=20+=20glPolygonOffset?=
Jose Fonseca
jfonseca at vmware.com
Thu Feb 21 10:52:44 PST 2013
Looks good to me.
Jose
----- Original Message -----
> ---
> 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit
>
More information about the Piglit
mailing list