[Piglit] [PATCH v3] ext_polygon_offset_clamp: add simple draw test

Glenn Kennard glenn.kennard at gmail.com
Sun Feb 1 14:33:23 PST 2015


On Sun, 01 Feb 2015 23:19:57 +0100, Ilia Mirkin <imirkin at alum.mit.edu>  
wrote:

> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
>
> v2 -> v3:
>  *actually* include dlist.c
>
>  tests/all.py                                       |   5 +
>  tests/spec/CMakeLists.txt                          |   1 +
>  .../ext_polygon_offset_clamp/CMakeLists.gl.txt     |  14 ++
>  tests/spec/ext_polygon_offset_clamp/CMakeLists.txt |   1 +
>  tests/spec/ext_polygon_offset_clamp/dlist.c        | 149  
> ++++++++++++++++++
>  tests/spec/ext_polygon_offset_clamp/draw.c         | 173  
> +++++++++++++++++++++
>  6 files changed, 343 insertions(+)
>  create mode 100644 tests/spec/ext_polygon_offset_clamp/CMakeLists.gl.txt
>  create mode 100644 tests/spec/ext_polygon_offset_clamp/CMakeLists.txt
>  create mode 100644 tests/spec/ext_polygon_offset_clamp/dlist.c
>  create mode 100644 tests/spec/ext_polygon_offset_clamp/draw.c
>
> diff --git a/tests/all.py b/tests/all.py
> index bda939e..8ce970c 100644
> --- a/tests/all.py
> +++ b/tests/all.py
> @@ -3680,6 +3680,11 @@  
> import_glsl_parser_tests(spec['ARB_compute_shader'],
>                           ['compiler'])
>  arb_compute_shader['built-in constants'] =  
> PiglitGLTest(['built-in-constants', os.path.join(testsDir,  
> 'spec/arb_compute_shader/minimum-maximums.txt')], run_concurrent=True)
> +ext_polygon_offset_clamp = {}
> +spec['EXT_polygon_offset_clamp'] = ext_polygon_offset_clamp
> +add_concurrent_test(ext_polygon_offset_clamp,  
> 'ext_polygon_offset_clamp-draw')
> +add_concurrent_test(ext_polygon_offset_clamp,  
> 'ext_polygon_offset_clamp-dlist')
> +
>  # group glslparsertest  
> ------------------------------------------------------
>  glslparsertest = {}
>  # Add all shader source files in the directories below.
> diff --git a/tests/spec/CMakeLists.txt b/tests/spec/CMakeLists.txt
> index 1a3960c..0934080 100644
> --- a/tests/spec/CMakeLists.txt
> +++ b/tests/spec/CMakeLists.txt
> @@ -115,3 +115,4 @@ add_subdirectory (arb_blend_func_extended)
>  add_subdirectory (ext_unpack_subimage)
>  add_subdirectory (arb_vertex_array_object)
>  add_subdirectory (oes_texture_float)
> +add_subdirectory (ext_polygon_offset_clamp)
> diff --git a/tests/spec/ext_polygon_offset_clamp/CMakeLists.gl.txt  
> b/tests/spec/ext_polygon_offset_clamp/CMakeLists.gl.txt
> new file mode 100644
> index 0000000..db68249
> --- /dev/null
> +++ b/tests/spec/ext_polygon_offset_clamp/CMakeLists.gl.txt
> @@ -0,0 +1,14 @@
> +include_directories(
> +	${GLEXT_INCLUDE_DIR}
> +	${OPENGL_INCLUDE_PATH}
> +)
> +
> +link_libraries (
> +	piglitutil_${piglit_target_api}
> +	${OPENGL_gl_LIBRARY}
> +)
> +
> +piglit_add_executable (ext_polygon_offset_clamp-draw draw.c)
> +piglit_add_executable (ext_polygon_offset_clamp-dlist dlist.c)
> +
> +# vim: ft=cmake:
> diff --git a/tests/spec/ext_polygon_offset_clamp/CMakeLists.txt  
> b/tests/spec/ext_polygon_offset_clamp/CMakeLists.txt
> new file mode 100644
> index 0000000..144a306
> --- /dev/null
> +++ b/tests/spec/ext_polygon_offset_clamp/CMakeLists.txt
> @@ -0,0 +1 @@
> +piglit_include_target_api()
> diff --git a/tests/spec/ext_polygon_offset_clamp/dlist.c  
> b/tests/spec/ext_polygon_offset_clamp/dlist.c
> new file mode 100644
> index 0000000..9625cfe
> --- /dev/null
> +++ b/tests/spec/ext_polygon_offset_clamp/dlist.c
> @@ -0,0 +1,149 @@
> +/*
> + * Copyright (C) 2015 Ilia Mirkin
> + *
> + * 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 dlist.c
> + *
> + * Test that glPolygonOffsetClampEXT works inside of a call list. See
> + * draw.c for testing technique comments.
> + */
> +
> +#include "piglit-util-gl.h"
> +
> +PIGLIT_GL_TEST_CONFIG_BEGIN
> +
> +	config.supports_gl_compat_version = 21;
> +	config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_DEPTH |  
> PIGLIT_GL_VISUAL_DOUBLE;
> +
> +PIGLIT_GL_TEST_CONFIG_END
> +
> +GLint prog, color;
> +
> +enum piglit_result
> +piglit_display(void)
> +{
> +	static const float blue[4] = {0, 0, 1, 1};
> +	static const float red[4] = {1, 0, 0, 1};
> +	static const float green[4] = {0, 1, 0, 1};
> +
> +	GLuint list;
> +	bool passa = true, passb = true;
> +
> +	glUseProgram(prog);
> +
> +	glViewport(0, 0, piglit_width, piglit_height);
> +	glEnable(GL_DEPTH_TEST);
> +	glEnable(GL_POLYGON_OFFSET_FILL);
> +
> +	glClearColor(0, 0, 1, 1);
> +	glClearDepth(0.5);
> +	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
> +
> +	list = glGenLists(2);
> +
> +	/* Draw red rectangle that slopes between 1 and 0.1. Use a
> +	 * polygon offset with a high factor but small clamp
> +	 */
> +	glNewList(list, GL_COMPILE_AND_EXECUTE);
> +	glPolygonOffsetClampEXT(-1000, 0, -0.05);
> +	glUniform4fv(color, 1, red);
> +	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
> +	glEndList();
> +
> +	if (!piglit_probe_rect_rgba(0, 0, piglit_width, piglit_height, blue)) {
> +		printf("  FAIL: red rect peeks over blue rect\n");
> +		passa = false;
> +	}
> +
> +	/* And now set the clamp such that all parts of the polygon
> +	 * can pass the depth test.
> +	 */
> +	glNewList(list + 1, GL_COMPILE_AND_EXECUTE);
> +	glPolygonOffsetClampEXT(-1000, 0, -0.51);
> +	glUniform4fv(color, 1, green);
> +	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
> +	glEndList();
> +
> +	if (!piglit_probe_rect_rgba(0, 0, piglit_width, piglit_height, green))  
> {
> +		printf("  FAIL: green rect does not cover blue rect\n");
> +		passa = false;
> +	}
> +
> +	piglit_report_subtest_result(passa ? PIGLIT_PASS : PIGLIT_FAIL,
> +				     "compile and execute");
> +	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
> +
> +	glCallList(list);
> +	if (!piglit_probe_rect_rgba(0, 0, piglit_width, piglit_height, blue)) {
> +		printf("  FAIL: red rect peeks over blue rect\n");
> +		passb = false;
> +	}
> +
> +	glCallList(list + 1);
> +	if (!piglit_probe_rect_rgba(0, 0, piglit_width, piglit_height, green))  
> {
> +		printf("  FAIL: green rect does not cover blue rect\n");
> +		passb = false;
> +	}
> +
> +	piglit_report_subtest_result(passb ? PIGLIT_PASS : PIGLIT_FAIL,
> +				     "call");
> +
> +	piglit_present_results();
> +
> +	return (passa && passb) ? PIGLIT_PASS : PIGLIT_FAIL;
> +}
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> +	static const float verts[4][4] = {
> +		/* x   y   z   w */
> +		{ -1, -1, 1.0, 1 },
> +		{  1, -1, 1.0, 1 },
> +		{ -1,  1, 0.1, 1 },
> +		{  1,  1, 0.1, 1 }
> +	};
> +
> +	GLuint vao, bo;
> +
> +	piglit_require_extension("GL_EXT_polygon_offset_clamp");
> +
> +	prog = piglit_build_simple_program(
> +			"#version 120\n"
> +			"uniform float zflip;\n"
> +			"void main() { gl_Position = gl_Vertex; }\n",
> +
> +			"#version 120\n"
> +			"uniform vec4 color;\n"
> +			"void main() { gl_FragColor = color; }\n");
> +	color = glGetUniformLocation(prog, "color");
> +
> +	glGenVertexArrays(1, &vao);
> +	glBindVertexArray(vao);
> +
> +	glEnableVertexAttribArray(0);
> +	glGenBuffers(1, &bo);
> +	glBindBuffer(GL_ARRAY_BUFFER, bo);
> +	glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
> +	glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid const *)0);
> +}
> diff --git a/tests/spec/ext_polygon_offset_clamp/draw.c  
> b/tests/spec/ext_polygon_offset_clamp/draw.c
> new file mode 100644
> index 0000000..324f7bc
> --- /dev/null
> +++ b/tests/spec/ext_polygon_offset_clamp/draw.c
> @@ -0,0 +1,173 @@
> +/*
> + * Copyright (C) 2015 Ilia Mirkin
> + *
> + * 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 draw.c
> + *
> + * Test that GL_EXT_polygon_offset_clamp actually applies the
> + * clamp. The polygon is set up between z = 1 and z = 0.1 (so under
> + * depth = 0.5).
> + *
> + * 1. Clear the depth buffer to 0.5 (leaving the depth func as LESS)
> + * 2. Draw the polygon with red, clamping the offset to -0.05. This
> + *    ensures that even the z=0.1 end (i.e. depth = 0.55) does not go
> + *    below the value in the depth buffer.
> + * 3. Draw the polygon again with green, clamping the offset at -0.51,
> + *    ensuring that every point of the polygon can end up being offset  
> to
> + *    a depth value below 0.5.
> + */
> +
> +#include "piglit-util-gl.h"
> +
> +PIGLIT_GL_TEST_CONFIG_BEGIN
> +
> +	config.supports_gl_compat_version = 21;
> +	config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_DEPTH |  
> PIGLIT_GL_VISUAL_DOUBLE;
> +
> +PIGLIT_GL_TEST_CONFIG_END
> +
> +GLint prog, color, zflip;
> +
> +enum piglit_result
> +piglit_display(void)
> +{
> +	static const float blue[4] = {0, 0, 1, 1};
> +	static const float red[4] = {1, 0, 0, 1};
> +	static const float green[4] = {0, 1, 0, 1};
> +
> +	bool passa = true, passb = true;
> +
> +	glUseProgram(prog);
> +
> +	glViewport(0, 0, piglit_width, piglit_height);
> +	glEnable(GL_DEPTH_TEST);
> +	glEnable(GL_POLYGON_OFFSET_FILL);
> +
> +	glUniform1f(zflip, 1.0);
> +	glClearColor(0, 0, 1, 1);
> +	glClearDepth(0.5);
> +	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
> +
> +	/* NOTE: It appears that at least nvidia hw will end up
> +	 * wrapping around if the final z value goes below 0 (or
> +	 * something). This can come up when testing without the
> +	 * clamp.
> +	 */
> +
> +	/* Draw red rectangle that slopes between 1 and 0.1. Use a
> +	 * polygon offset with a high factor but small clamp
> +	 */
> +	glPolygonOffsetClampEXT(-1000, 0, -0.05);
> +	glUniform4fv(color, 1, red);
> +	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
> +	if (!piglit_probe_rect_rgba(0, 0, piglit_width, piglit_height, blue)) {
> +		printf("  FAIL: red rect peeks over blue rect\n");
> +		passa = false;
> +	}
> +
> +	/* And now set the clamp such that all parts of the polygon
> +	 * can pass the depth test.
> +	 */
> +	glPolygonOffsetClampEXT(-1000, 0, -0.51);
> +	glUniform4fv(color, 1, green);
> +	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
> +	if (!piglit_probe_rect_rgba(0, 0, piglit_width, piglit_height, green))  
> {
> +		printf("  FAIL: green rect does not cover blue rect\n");
> +		passa = false;
> +	}
> +
> +	piglit_report_subtest_result(passa ? PIGLIT_PASS : PIGLIT_FAIL,
> +				     "negative clamp");
> +
> +	/* Now try this again with the inverse approach and a positive
> +	 * clamp value. The polygon will now slope between -1 and
> +	 * -0.1. Everything is reversed, so just negate all the
> +	 * previous values.
> +	 */
> +
> +	glUniform1f(zflip, -1.0);
> +	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
> +	glDepthFunc(GL_GREATER);
> +
> +	glPolygonOffsetClampEXT(1000, 0, 0.05);
> +	glUniform4fv(color, 1, red);
> +	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
> +	if (!piglit_probe_rect_rgba(0, 0, piglit_width, piglit_height, blue)) {
> +		printf("  FAIL: red rect peeks over blue rect\n");
> +		passb = false;
> +	}
> +
> +	/* And now set the clamp so that all parts of the polygon pass
> +	 * the depth test.
> +	 */
> +	glPolygonOffsetClampEXT(1000, 0, 0.51);
> +	glUniform4fv(color, 1, green);
> +	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
> +	if (!piglit_probe_rect_rgba(0, 0, piglit_width, piglit_height, green))  
> {
> +		printf("  FAIL: green rect does not cover blue rect\n");
> +		passb = false;
> +	}
> +
> +	piglit_report_subtest_result(passb ? PIGLIT_PASS : PIGLIT_FAIL,
> +				     "positive clamp");
> +
> +	piglit_present_results();
> +
> +	return (passa && passb) ? PIGLIT_PASS : PIGLIT_FAIL;
> +}
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> +	static const float verts[4][4] = {
> +		/* x   y   z   w */
> +		{ -1, -1, 1.0, 1 },
> +		{  1, -1, 1.0, 1 },
> +		{ -1,  1, 0.1, 1 },
> +		{  1,  1, 0.1, 1 }
> +	};
> +
> +	GLuint vao, bo;
> +
> +	piglit_require_extension("GL_EXT_polygon_offset_clamp");
> +
> +	prog = piglit_build_simple_program(
> +			"#version 120\n"
> +			"uniform float zflip;\n"
> +			"void main() { gl_Position = gl_Vertex * vec4(1, 1, zflip, 1); }\n",
> +
> +			"#version 120\n"
> +			"uniform vec4 color;\n"
> +			"void main() { gl_FragColor = color; }\n");
> +	color = glGetUniformLocation(prog, "color");
> +	zflip = glGetUniformLocation(prog, "zflip");
> +
> +	glGenVertexArrays(1, &vao);
> +	glBindVertexArray(vao);
> +
> +	glEnableVertexAttribArray(0);
> +	glGenBuffers(1, &bo);
> +	glBindBuffer(GL_ARRAY_BUFFER, bo);
> +	glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
> +	glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid const *)0);
> +}

With the cmake conflicts fixed up, patch is
Reviewed-by: Glenn Kennard <glenn.kennard at gmail.com>


More information about the Piglit mailing list