[Piglit] [PATCH 18/18] arb_geometry_shader4: Test that gl_VerticesIn is const.

Fabian Bieler fabianbieler at fastmail.fm
Fri May 31 05:56:48 PDT 2013


Test that gl_VerticesIn can be used as a valid constant expression.

Also test that it evaluates to 3 for triangles.
---
 .../compiler/verticesin-const-expression.geom      | 31 ++++++++
 .../compiler/verticesin-const.geom                 | 31 ++++++++
 .../linker/verticesin-const.shader_test            | 91 ++++++++++++++++++++++
 3 files changed, 153 insertions(+)
 create mode 100644 tests/spec/arb_geometry_shader4/compiler/verticesin-const-expression.geom
 create mode 100644 tests/spec/arb_geometry_shader4/compiler/verticesin-const.geom
 create mode 100644 tests/spec/arb_geometry_shader4/linker/verticesin-const.shader_test

diff --git a/tests/spec/arb_geometry_shader4/compiler/verticesin-const-expression.geom b/tests/spec/arb_geometry_shader4/compiler/verticesin-const-expression.geom
new file mode 100644
index 0000000..f4b77f7
--- /dev/null
+++ b/tests/spec/arb_geometry_shader4/compiler/verticesin-const-expression.geom
@@ -0,0 +1,31 @@
+// [config]
+// expect_result: pass
+// glsl_version: 1.30
+// require_extensions: GL_ARB_geometry_shader4
+// [end config]
+
+#version 130
+#extension GL_ARB_geometry_shader4: enable
+
+uniform int idx;
+uniform sampler2D tex;
+uniform sampler2D tex_array[10];
+
+void main()
+{
+	//All quotes are from the glsl 1.3 specification.
+
+	//"Samplers aggregated into arrays within a shader [...] can only be indexed with integral constant expressions"
+	texture(tex_array[gl_VerticesIn * 2 - 2], vec2(0, 0));
+
+	//"When an array size is specified in a declaration, it must be an integral constant expression"
+	float array[gl_VerticesIn * 2 - 2];
+	array[idx];
+
+	//"Initializers for const declarations must be constant expression"
+	const int var = gl_VerticesIn * 2 - 2;
+
+	//"The offset value must be a constant expression."
+	textureOffset(tex, vec2(0, 0), ivec2(gl_VerticesIn * 2 - 2));
+}
+
diff --git a/tests/spec/arb_geometry_shader4/compiler/verticesin-const.geom b/tests/spec/arb_geometry_shader4/compiler/verticesin-const.geom
new file mode 100644
index 0000000..f7aec2a
--- /dev/null
+++ b/tests/spec/arb_geometry_shader4/compiler/verticesin-const.geom
@@ -0,0 +1,31 @@
+// [config]
+// expect_result: pass
+// glsl_version: 1.30
+// require_extensions: GL_ARB_geometry_shader4
+// [end config]
+
+#version 130
+#extension GL_ARB_geometry_shader4: enable
+
+uniform int idx;
+uniform sampler2D tex;
+uniform sampler2D tex_array[7];
+
+void main()
+{
+	//All quotes are from the glsl 1.3 specification.
+
+	//"Samplers aggregated into arrays within a shader [...] can only be indexed with integral constant expressions"
+	texture(tex_array[gl_VerticesIn], vec2(0, 0));
+
+	//"When an array size is specified in a declaration, it must be an integral constant expression"
+	float array[gl_VerticesIn];
+	array[idx];
+
+	//"Initializers for const declarations must be constant expression"
+	const int var = gl_VerticesIn;
+
+	//"The offset value must be a constant expression."
+	textureOffset(tex, vec2(0, 0), ivec2(gl_VerticesIn));
+}
+
diff --git a/tests/spec/arb_geometry_shader4/linker/verticesin-const.shader_test b/tests/spec/arb_geometry_shader4/linker/verticesin-const.shader_test
new file mode 100644
index 0000000..5f697ee
--- /dev/null
+++ b/tests/spec/arb_geometry_shader4/linker/verticesin-const.shader_test
@@ -0,0 +1,91 @@
+[require]
+GL >= 2.0
+GLSL >= 1.30
+GL_ARB_geometry_shader4
+
+[vertex shader]
+#version 130
+
+in vec4 vertex;
+
+out float gs_input[6];
+void main()
+{
+	for (int i = 0; i < 6; i++)
+		gs_input[i] = 0.5;
+	gl_Position = vertex;
+}
+
+[geometry shader]
+#version 130
+#extension GL_ARB_geometry_shader4: enable
+#line 22
+
+uniform int zero;
+uniform sampler2D tex;
+uniform sampler2D tex_array[7];
+
+in float gs_input[][6];
+
+out vec4 color;
+
+void main()
+{
+	for (int i = 0; i < gl_VerticesIn; i++) {
+		vec4 c = vec4(0, 0, 0, 1);
+		c.x = texture(tex_array[gl_VerticesIn], vec2(0.5, 0.5)).x;
+
+		const int three = gl_VerticesIn;
+		if (three == 3)
+			c.y = 1.0;
+		else
+			c.y = 0.0;
+
+		//We sample from a row of 8 pixels, the left 4 blue and the right 4 white.
+		//Since we only use the red channel, the left 4 are 0, and the right 4 are 1.
+		//sample twice from the fith pixel in the row:
+		c.z = textureOffset(tex, vec2(3.0/16.0, 0.75), ivec2(gl_VerticesIn, 0)).x;
+		c.z *= textureOffset(tex, vec2(15.0/16.0, 0.75), ivec2(gl_VerticesIn, 0)).x;
+
+		gl_Position = gl_PositionIn[i];
+		color = c;
+		EmitVertex();
+	}
+}
+
+[geometry layout]
+input type GL_TRIANGLES
+output type GL_TRIANGLE_STRIP
+vertices out 3
+
+[fragment shader]
+#version 130
+
+in vec4 color;
+
+void main()
+{
+  gl_FragColor = color;
+}
+
+[vertex data]
+vertex/float/2
+-1.0 -1.0
+ 1.0 -1.0
+ 1.0  1.0
+-1.0  1.0
+
+[test]
+uniform int tex_array[0] 1
+uniform int tex_array[1] 1
+uniform int tex_array[2] 1
+uniform int tex_array[3] 2
+uniform int tex_array[4] 1
+uniform int tex_array[5] 1
+uniform int tex_array[6] 1
+uniform int tex 0
+texture rgbw 0 (8, 8)
+texture checkerboard 1 0 (8, 8) (0.0, 0.0, 0.0, 0.0) (0.0, 0.0, 0.0, 0.0)
+texture checkerboard 2 0 (8, 8) (1.0, 1.0, 1.0, 1.0) (1.0, 1.0, 1.0, 1.0)
+draw arrays GL_TRIANGLE_FAN 0 4
+probe all rgb 1.0 1.0 1.0
-- 
1.8.1.2



More information about the Piglit mailing list