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

_______________________________________________
Piglit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to