[Piglit] [PATCH v2 2/2] nv_fill_rectangle: add tests

Lyude lyude at redhat.com
Thu Mar 30 21:38:53 UTC 2017


This adds a set of basic shader tests for the GL_NV_fill_rectangle
extension. These include:
- Testing NV_fill_rectangle with geometry shaders, tessellation
  evaluation shaders, and just plain tris. Also testing that it actually
  obeys the vertex data we give it.
- Testing that points, lines, and isolines coming from either the TES or
  the GS, or glDraw() calls are unaffected by NV_fill_rectangle
- Testing that we're not allowed to call glDraw() with only one of the
  front or back polygon modes set to GL_NV_fill_rectangle

Changes since v1:
- Use GL_TRIANGLES in basic test
- Use green for prims, 0.2 for clear
- Fix points used for relative probe rect rgb
- Add a lot more tests that imirkin requested

Signed-off-by: Lyude <lyude at redhat.com>
---
 tests/spec/CMakeLists.txt                          |  1 +
 tests/spec/nv_fill_rectangle/CMakeLists.gl.txt     | 13 ++++
 tests/spec/nv_fill_rectangle/CMakeLists.txt        |  1 +
 .../gs-lines-ignore-fill-rect.shader_test          | 43 ++++++++++++
 .../gs-points-ignore-fill-rect.shader_test         | 44 +++++++++++++
 .../execution/gs-tris-with-fill-rect.shader_test   | 42 ++++++++++++
 .../execution/lines-ignore-fill-rect.shader_test   | 29 ++++++++
 .../execution/points-ignore-fill-rect.shader_test  | 35 ++++++++++
 .../tes-isolines-ignore-fill-rect.shader_test      | 37 +++++++++++
 ...tris-in-point-mode-ignore-fill-rect.shader_test | 43 ++++++++++++
 .../execution/tes-tris-with-fill-rect.shader_test  | 41 ++++++++++++
 .../execution/tris-with-fill-rect.shader_test      | 30 +++++++++
 tests/spec/nv_fill_rectangle/invalid-draw-mode.c   | 77 ++++++++++++++++++++++
 13 files changed, 436 insertions(+)
 create mode 100644 tests/spec/nv_fill_rectangle/CMakeLists.gl.txt
 create mode 100644 tests/spec/nv_fill_rectangle/CMakeLists.txt
 create mode 100644 tests/spec/nv_fill_rectangle/execution/gs-lines-ignore-fill-rect.shader_test
 create mode 100644 tests/spec/nv_fill_rectangle/execution/gs-points-ignore-fill-rect.shader_test
 create mode 100644 tests/spec/nv_fill_rectangle/execution/gs-tris-with-fill-rect.shader_test
 create mode 100644 tests/spec/nv_fill_rectangle/execution/lines-ignore-fill-rect.shader_test
 create mode 100644 tests/spec/nv_fill_rectangle/execution/points-ignore-fill-rect.shader_test
 create mode 100644 tests/spec/nv_fill_rectangle/execution/tes-isolines-ignore-fill-rect.shader_test
 create mode 100644 tests/spec/nv_fill_rectangle/execution/tes-tris-in-point-mode-ignore-fill-rect.shader_test
 create mode 100644 tests/spec/nv_fill_rectangle/execution/tes-tris-with-fill-rect.shader_test
 create mode 100644 tests/spec/nv_fill_rectangle/execution/tris-with-fill-rect.shader_test
 create mode 100644 tests/spec/nv_fill_rectangle/invalid-draw-mode.c

diff --git a/tests/spec/CMakeLists.txt b/tests/spec/CMakeLists.txt
index 01a7935..31a57ed 100644
--- a/tests/spec/CMakeLists.txt
+++ b/tests/spec/CMakeLists.txt
@@ -89,6 +89,7 @@ add_subdirectory (ext_texture_swizzle)
 add_subdirectory (ext_timer_query)
 add_subdirectory (ext_transform_feedback)
 add_subdirectory (nv_conditional_render)
+add_subdirectory (nv_fill_rectangle)
 add_subdirectory (nv_image_formats)
 add_subdirectory (nv_texture_barrier)
 add_subdirectory (oes_compressed_etc1_rgb8_texture)
diff --git a/tests/spec/nv_fill_rectangle/CMakeLists.gl.txt b/tests/spec/nv_fill_rectangle/CMakeLists.gl.txt
new file mode 100644
index 0000000..f9219f5
--- /dev/null
+++ b/tests/spec/nv_fill_rectangle/CMakeLists.gl.txt
@@ -0,0 +1,13 @@
+include_directories(
+	${GLEXT_INCLUDE_DIR}
+	${OPENGL_INCLUDE_PATH}
+)
+
+link_libraries(
+	piglitutil_${piglit_target_api}
+	${OPENGL_gl_LIBRARY}
+)
+
+piglit_add_executable(nv_fill_rectangle-invalid-draw-mode invalid-draw-mode.c)
+
+# vim: ft=cmake:
diff --git a/tests/spec/nv_fill_rectangle/CMakeLists.txt b/tests/spec/nv_fill_rectangle/CMakeLists.txt
new file mode 100644
index 0000000..144a306
--- /dev/null
+++ b/tests/spec/nv_fill_rectangle/CMakeLists.txt
@@ -0,0 +1 @@
+piglit_include_target_api()
diff --git a/tests/spec/nv_fill_rectangle/execution/gs-lines-ignore-fill-rect.shader_test b/tests/spec/nv_fill_rectangle/execution/gs-lines-ignore-fill-rect.shader_test
new file mode 100644
index 0000000..e8e79a8
--- /dev/null
+++ b/tests/spec/nv_fill_rectangle/execution/gs-lines-ignore-fill-rect.shader_test
@@ -0,0 +1,43 @@
+# Tests that lines output from the geometry shader are not affected by
+# GL_NV_fill_rectangle
+[require]
+GLSL >= 1.50
+GL_ARB_tessellation_shader
+GL_NV_fill_rectangle
+
+[vertex shader passthrough]
+
+[geometry shader]
+layout(points) in;
+layout(line_strip, max_vertices=3) out;
+
+void main()
+{
+	for (int i = 0; i < 3; i++) {
+		gl_Position = gl_in[i].gl_Position;
+		EmitVertex();
+	}
+	EndPrimitive();
+}
+
+[fragment shader]
+void main()
+{
+	gl_FragColor = vec4(0, 1, 0, 1);
+}
+
+[vertex data]
+piglit_vertex/float/3
+ 0.0  1.0  0.0
+ 1.0 -1.0  0.0
+-1.0 -1.0  0.0
+
+[test]
+clear color 0.2 0.2 0.2 0.2
+clear
+
+polygon mode GL_FRONT_AND_BACK GL_FILL_RECTANGLE_NV
+draw arrays GL_POINTS 0 3
+
+probe rgb  0 0 0.0 1.0 0.0
+probe rgb 10 5 0.2 0.2 0.2
diff --git a/tests/spec/nv_fill_rectangle/execution/gs-points-ignore-fill-rect.shader_test b/tests/spec/nv_fill_rectangle/execution/gs-points-ignore-fill-rect.shader_test
new file mode 100644
index 0000000..9874b52
--- /dev/null
+++ b/tests/spec/nv_fill_rectangle/execution/gs-points-ignore-fill-rect.shader_test
@@ -0,0 +1,44 @@
+# Tests that points output from the geometry shader are not effected by
+# GL_NV_fill_rectangle
+[require]
+GLSL >= 1.50
+GL_NV_fill_rectangle
+
+[vertex shader passthrough]
+
+[geometry shader]
+layout(points) in;
+layout(points, max_vertices=3) out;
+
+void main()
+{
+	for (int i = 0; i < 3; i++) {
+		gl_Position = gl_in[i].gl_Position;
+		gl_PointSize = 5.0;
+		EmitVertex();
+	}
+	EndPrimitive();
+}
+
+[fragment shader]
+void main()
+{
+	gl_FragColor = vec4(0, 1, 0, 1);
+}
+
+[vertex data]
+piglit_vertex/float/3
+ 0.0  1.0  0.0
+ 1.0 -1.0  0.0
+-1.0 -1.0  0.0
+
+[test]
+clear color 0.2 0.2 0.2 0.2
+clear
+
+enable GL_PROGRAM_POINT_SIZE
+polygon mode GL_FRONT_AND_BACK GL_FILL_RECTANGLE_NV
+draw arrays GL_POINTS 0 3
+
+probe rgb  0 0 0.0 1.0 0.0
+probe rgb 10 0 0.2 0.2 0.2
diff --git a/tests/spec/nv_fill_rectangle/execution/gs-tris-with-fill-rect.shader_test b/tests/spec/nv_fill_rectangle/execution/gs-tris-with-fill-rect.shader_test
new file mode 100644
index 0000000..decd8ab
--- /dev/null
+++ b/tests/spec/nv_fill_rectangle/execution/gs-tris-with-fill-rect.shader_test
@@ -0,0 +1,42 @@
+# Tests that triangles output from the geometry shader are correctly rasterized
+# as rectangles when GL_NV_fill_rectangle is used
+[require]
+GLSL >= 1.50
+GL_NV_fill_rectangle
+
+[vertex shader passthrough]
+
+[geometry shader]
+layout(points) in;
+layout(triangle_strip, max_vertices=3) out;
+
+void main()
+{
+	for (int i = 0; i < 3; i++) {
+		gl_Position = gl_in[i].gl_Position;
+		EmitVertex();
+	}
+	EndPrimitive();
+}
+
+[fragment shader]
+void main()
+{
+	gl_FragColor = vec4(0, 1, 0, 1);
+}
+
+[vertex data]
+piglit_vertex/float/3
+ 0.0  0.5  0.0
+ 0.5 -0.5  0.0
+-0.5 -0.5  0.0
+
+[test]
+clear color 0.2 0.2 0.2 0.2
+clear
+
+polygon mode GL_FRONT_AND_BACK GL_FILL_RECTANGLE_NV
+draw arrays GL_POINTS 0 3
+
+relative probe rect rgb (0.26, 0.26, 0.48, 0.48) (0.0, 1.0, 0.0, 1.0)
+probe rgb 0 0 0.2 0.2 0.2
diff --git a/tests/spec/nv_fill_rectangle/execution/lines-ignore-fill-rect.shader_test b/tests/spec/nv_fill_rectangle/execution/lines-ignore-fill-rect.shader_test
new file mode 100644
index 0000000..069715f
--- /dev/null
+++ b/tests/spec/nv_fill_rectangle/execution/lines-ignore-fill-rect.shader_test
@@ -0,0 +1,29 @@
+# Tests that setting the glPolygonMode to GL_FILL_RECTANGLE_NV has no effect on
+# rasterization when the primitive to be rasterized is of type GL_LINES.
+[require]
+GLSL >= 1.10
+GL_NV_fill_rectangle
+
+[vertex shader passthrough]
+
+[fragment shader]
+void main()
+{
+	gl_FragColor = vec4(0, 1, 0, 1);
+}
+
+[vertex data]
+piglit_vertex/float/3
+-1.0 -1.0  0.0
+ 1.0  1.0  0.0
+ 1.0 -1.0  0.0
+
+[test]
+clear color 0.2 0.2 0.2 0.2
+clear
+
+polygon mode GL_FRONT_AND_BACK GL_FILL_RECTANGLE_NV
+draw arrays GL_LINES 0 3
+
+probe rgb  0 0 0.0 1.0 0.0
+probe rgb 10 0 0.2 0.2 0.2
diff --git a/tests/spec/nv_fill_rectangle/execution/points-ignore-fill-rect.shader_test b/tests/spec/nv_fill_rectangle/execution/points-ignore-fill-rect.shader_test
new file mode 100644
index 0000000..2142bf4
--- /dev/null
+++ b/tests/spec/nv_fill_rectangle/execution/points-ignore-fill-rect.shader_test
@@ -0,0 +1,35 @@
+# Tests that GL_NV_fill_rectangle has no effect when drawing in GL_POINTS mode
+[require]
+GLSL >= 1.30
+GL_NV_fill_rectangle
+
+[vertex shader]
+in vec4 vertex;
+void main()
+{
+	gl_Position = vertex;
+	gl_PointSize = 5.0; /* so the points are always inside the window */
+}
+
+[fragment shader]
+void main()
+{
+	gl_FragColor = vec4(0, 1, 0, 1);
+}
+
+[vertex data]
+vertex/float/3
+ 0.0  1.0  0.0
+ 1.0 -1.0  0.0
+-1.0 -1.0  0.0
+
+[test]
+clear color 0.2 0.2 0.2 0.2
+clear
+
+enable GL_PROGRAM_POINT_SIZE
+polygon mode GL_FRONT_AND_BACK GL_FILL_RECTANGLE_NV
+draw arrays GL_POINTS 0 3
+
+probe rgb  0 0 0.0 1.0 0.0
+probe rgb 10 0 0.2 0.2 0.2
diff --git a/tests/spec/nv_fill_rectangle/execution/tes-isolines-ignore-fill-rect.shader_test b/tests/spec/nv_fill_rectangle/execution/tes-isolines-ignore-fill-rect.shader_test
new file mode 100644
index 0000000..e89c9b2
--- /dev/null
+++ b/tests/spec/nv_fill_rectangle/execution/tes-isolines-ignore-fill-rect.shader_test
@@ -0,0 +1,37 @@
+# Tests that isolines are not effected by GL_NV_fill_rectangle
+[require]
+GLSL >= 1.50
+GL_ARB_tessellation_shader
+GL_NV_fill_rectangle
+
+[vertex shader]
+void main()
+{
+}
+
+[tessellation evaluation shader]
+#extension GL_ARB_tessellation_shader: require
+layout(isolines, equal_spacing) in;
+
+void main()
+{
+	gl_Position = vec4(gl_TessCoord.xy * 2.0 - 1.0, 0.0, 1.0);
+}
+
+[fragment shader]
+void main()
+{
+	gl_FragColor = vec4(0, 1, 0, 1);
+}
+
+[test]
+clear color 0.2 0.2 0.2 0.2
+clear
+
+patch parameter vertices 2
+patch parameter default level outer 1 1 0 0
+polygon mode GL_FRONT_AND_BACK GL_FILL_RECTANGLE_NV
+draw arrays GL_PATCHES 0 2
+
+probe rgb 0 0 0.0 1.0 0.0
+probe rgb 5 5 0.2 0.2 0.2
diff --git a/tests/spec/nv_fill_rectangle/execution/tes-tris-in-point-mode-ignore-fill-rect.shader_test b/tests/spec/nv_fill_rectangle/execution/tes-tris-in-point-mode-ignore-fill-rect.shader_test
new file mode 100644
index 0000000..b7dac2c
--- /dev/null
+++ b/tests/spec/nv_fill_rectangle/execution/tes-tris-in-point-mode-ignore-fill-rect.shader_test
@@ -0,0 +1,43 @@
+# Tests that triangles coming out of the TES in point_mode don't get rasterized
+# as triangles when drawing in GL_NV_fill_rectangle mode
+[require]
+GLSL >= 1.50
+GL_NV_fill_rectangle
+GL_ARB_tessellation_shader
+
+[vertex shader passthrough]
+
+[tessellation evaluation shader]
+#extension GL_ARB_tessellation_shader: require
+layout(triangles, point_mode) in;
+
+void main()
+{
+	gl_Position = gl_in[0].gl_Position * gl_TessCoord[0]
+	            + gl_in[1].gl_Position * gl_TessCoord[1]
+	            + gl_in[2].gl_Position * gl_TessCoord[2];
+	gl_PointSize = 5.0;
+}
+
+[fragment shader]
+void main()
+{
+	gl_FragColor = vec4(0, 1, 0, 1);
+}
+
+[vertex data]
+piglit_vertex/float/3
+ 0.0  1.0  0.0
+ 1.0 -1.0  0.0
+-1.0 -1.0  0.0
+
+[test]
+clear color 0.2 0.2 0.2 0.2
+clear
+
+enable GL_PROGRAM_POINT_SIZE
+polygon mode GL_FRONT_AND_BACK GL_FILL_RECTANGLE_NV
+draw arrays GL_PATCHES 0 3
+
+probe rgb  0  0 0.0 1.0 0.0
+probe rgb 15 15 0.2 0.2 0.2
diff --git a/tests/spec/nv_fill_rectangle/execution/tes-tris-with-fill-rect.shader_test b/tests/spec/nv_fill_rectangle/execution/tes-tris-with-fill-rect.shader_test
new file mode 100644
index 0000000..efab19b
--- /dev/null
+++ b/tests/spec/nv_fill_rectangle/execution/tes-tris-with-fill-rect.shader_test
@@ -0,0 +1,41 @@
+# Tests that we can output a triangle from the TES and have it rasterized as a
+# rectangle with GL_NV_fill_rectangle
+[require]
+GLSL >= 1.50
+GL_NV_fill_rectangle
+GL_ARB_tessellation_shader
+
+[vertex shader passthrough]
+
+[tessellation evaluation shader]
+#extension GL_ARB_tessellation_shader: require
+layout(triangles) in;
+
+void main()
+{
+	gl_Position = gl_in[0].gl_Position * gl_TessCoord[0]
+	            + gl_in[1].gl_Position * gl_TessCoord[1]
+	            + gl_in[2].gl_Position * gl_TessCoord[2];
+}
+
+[fragment shader]
+void main()
+{
+	gl_FragColor = vec4(0, 1, 0, 1);
+}
+
+[vertex data]
+piglit_vertex/float/3
+ 0.0  0.5  0.0
+ 0.5 -0.5  0.0
+-0.5 -0.5  0.0
+
+[test]
+clear color 0.2 0.2 0.2 0.2
+clear
+
+polygon mode GL_FRONT_AND_BACK GL_FILL_RECTANGLE_NV
+draw arrays GL_PATCHES 0 3
+
+relative probe rect rgb (0.26, 0.26, 0.48, 0.48) (0.0, 1.0, 0.0, 1.0)
+probe rgb 0 0 0.2 0.2 0.2
diff --git a/tests/spec/nv_fill_rectangle/execution/tris-with-fill-rect.shader_test b/tests/spec/nv_fill_rectangle/execution/tris-with-fill-rect.shader_test
new file mode 100644
index 0000000..153c9cd
--- /dev/null
+++ b/tests/spec/nv_fill_rectangle/execution/tris-with-fill-rect.shader_test
@@ -0,0 +1,30 @@
+# Tests whether or not we can properly rasterize triangles as rectangles using
+# the GL_NV_fill_rectangle extension, and whether or not the rectangles obey the
+# vertex data we use
+[require]
+GLSL >= 1.10
+GL_NV_fill_rectangle
+
+[vertex shader passthrough]
+
+[fragment shader]
+void main()
+{
+	gl_FragColor = vec4(0, 1, 0, 1);
+}
+
+[vertex data]
+piglit_vertex/float/3
+ 0.0  0.5  0.0
+ 0.5 -0.5  0.0
+-0.5 -0.5  0.0
+
+[test]
+clear color 0.2 0.2 0.2 0.2
+clear
+
+polygon mode GL_FRONT_AND_BACK GL_FILL_RECTANGLE_NV
+draw arrays GL_TRIANGLES 0 3
+
+relative probe rect rgb (0.26, 0.26, 0.48, 0.48) (0.0, 1.0, 0.0, 1.0)
+probe rgb 0 0 0.2 0.2 0.2
diff --git a/tests/spec/nv_fill_rectangle/invalid-draw-mode.c b/tests/spec/nv_fill_rectangle/invalid-draw-mode.c
new file mode 100644
index 0000000..48fffbc
--- /dev/null
+++ b/tests/spec/nv_fill_rectangle/invalid-draw-mode.c
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2017 Red Hat 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.
+ */
+
+/**
+ * \file invalid-draw-mode.c
+ *
+ * Additions to OpenGL 4.3 Compatibility Profile, section 14.6.4 ref:
+ *    "An INVALID_OPERATION error is generated by Begin or any Draw command if
+ *     only one of the front and back polygon mode is FILL_RECTANGLE_NV."
+ */
+
+#include "piglit-util-gl.h"
+
+PIGLIT_GL_TEST_CONFIG_BEGIN
+
+config.supports_gl_compat_version = 13;
+
+PIGLIT_GL_TEST_CONFIG_END
+
+GLint prog;
+
+void
+piglit_init(int argc, char **argv)
+{
+        bool pass = true;
+
+        piglit_require_extension("GL_NV_fill_rectangle");
+
+        prog = piglit_build_simple_program(
+            "#version 110\n"
+            "attribute vec4 vertex;\n"
+            "void main() { gl_Position = vertex; }\n",
+            "#version 110\n"
+            "void main() { }\n");
+
+        glUseProgram(prog);
+        glViewport(0, 0, piglit_width, piglit_height);
+        glPolygonMode(GL_FRONT, GL_FILL_RECTANGLE_NV);
+
+        /* Since we haven't set the mode for GL_BACK, it defaults to
+         * GL_FILL
+         */
+
+        piglit_draw_triangle(0, 0, 0, 0, 0, 0);
+
+        if (piglit_check_gl_error(GL_NO_ERROR))
+                pass = false;
+
+        piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL);
+}
+
+enum piglit_result
+piglit_display(void)
+{
+        /* UNREACHED */
+        return PIGLIT_FAIL;
+}
-- 
2.9.3



More information about the Piglit mailing list