Add some tests that basically check that the compiler doesn't confuse the two
array dimensions.
---
 .../arb_geometry_shader4/compiler/2darray02.geom   | 29 ++++++++
 .../arb_geometry_shader4/compiler/2darray03.geom   | 29 ++++++++
 .../arb_geometry_shader4/compiler/2darray04.geom   | 30 ++++++++
 .../linker/2darray02.shader_test                   | 85 ++++++++++++++++++++++
 .../linker/2darray03.shader_test                   | 62 ++++++++++++++++
 5 files changed, 235 insertions(+)
 create mode 100644 tests/spec/arb_geometry_shader4/compiler/2darray02.geom
 create mode 100644 tests/spec/arb_geometry_shader4/compiler/2darray03.geom
 create mode 100644 tests/spec/arb_geometry_shader4/compiler/2darray04.geom
 create mode 100644 tests/spec/arb_geometry_shader4/linker/2darray02.shader_test
 create mode 100644 tests/spec/arb_geometry_shader4/linker/2darray03.shader_test

diff --git a/tests/spec/arb_geometry_shader4/compiler/2darray02.geom 
b/tests/spec/arb_geometry_shader4/compiler/2darray02.geom
new file mode 100644
index 0000000..03ef6b4
--- /dev/null
+++ b/tests/spec/arb_geometry_shader4/compiler/2darray02.geom
@@ -0,0 +1,29 @@
+// [config]
+// expect_result: fail
+// glsl_version: 1.20
+// require_extensions: GL_ARB_geometry_shader4
+// [end config]
+
+#version 120
+#extension GL_ARB_geometry_shader4: enable
+
+varying in float gs_input[3][1];
+
+varying out float gs_out;
+
+void main()
+{
+       /* Constant indexing of arrays with known size should do a bounds check.
+        * The bounds check on this to operation would fail if the compiler
+        * checked the index against the wrong array dimension.
+        */
+       float s = gs_input[0][1];
+
+       for (int i = 0; i < gl_VerticesIn; i++) {
+               gs_out = s;
+
+               gl_Position = gl_PositionIn[i];
+               EmitVertex();
+       }
+}
+
diff --git a/tests/spec/arb_geometry_shader4/compiler/2darray03.geom 
b/tests/spec/arb_geometry_shader4/compiler/2darray03.geom
new file mode 100644
index 0000000..14e2824
--- /dev/null
+++ b/tests/spec/arb_geometry_shader4/compiler/2darray03.geom
@@ -0,0 +1,29 @@
+// [config]
+// expect_result: fail
+// glsl_version: 1.20
+// require_extensions: GL_ARB_geometry_shader4
+// [end config]
+
+#version 120
+#extension GL_ARB_geometry_shader4: enable
+
+varying in float gs_input[3][4];
+
+varying out float gs_out;
+
+void main()
+{
+       /* Constant indexing of arrays with known size should do a bounds check.
+        * The bounds check on this to operation would fail if the compiler
+        * checked the index against the wrong array dimension.
+        */
+       float s = gs_input[3][0];
+
+       for (int i = 0; i < gl_VerticesIn; i++) {
+               gs_out = s;
+
+               gl_Position = gl_PositionIn[i];
+               EmitVertex();
+       }
+}
+
diff --git a/tests/spec/arb_geometry_shader4/compiler/2darray04.geom 
b/tests/spec/arb_geometry_shader4/compiler/2darray04.geom
new file mode 100644
index 0000000..9c268e3
--- /dev/null
+++ b/tests/spec/arb_geometry_shader4/compiler/2darray04.geom
@@ -0,0 +1,30 @@
+// [config]
+// expect_result: fail
+// glsl_version: 1.20
+// require_extensions: GL_ARB_geometry_shader4
+// [end config]
+
+#version 120
+#extension GL_ARB_geometry_shader4: enable
+
+varying in float gs_input[3][1];
+
+varying out float gs_out;
+
+void main()
+{
+       /* Assignment operations of arrays should fail if the arrays don't have
+        * the same size.
+        * This check would pass if the compiler incorrectly checked the size
+        * a against the outer dimension of gs_input (both 3).
+        */
+       float a[3] = gs_input[0];
+
+       for (int i = 0; i < gl_VerticesIn; i++) {
+               gs_out = a[0];
+
+               gl_Position = gl_PositionIn[i];
+               EmitVertex();
+       }
+}
+
diff --git a/tests/spec/arb_geometry_shader4/linker/2darray02.shader_test 
b/tests/spec/arb_geometry_shader4/linker/2darray02.shader_test
new file mode 100644
index 0000000..1d20aec
--- /dev/null
+++ b/tests/spec/arb_geometry_shader4/linker/2darray02.shader_test
@@ -0,0 +1,85 @@
+#Test bounds checking of 2d array indexing.
+#Also test length validation of the inner array of 2d arrays.
+[require]
+GL >= 2.0
+GLSL >= 1.20
+GL_ARB_geometry_shader4
+
+[vertex shader]
+#version 120
+
+attribute vec4 vertex;
+
+varying float gs_input1[1];
+varying float gs_input4[4];
+
+void main()
+{
+       gs_input1[0] = 0.5;
+       for (int i = 0; i < 4; i++)
+               gs_input4[i] = 0.5;
+       gl_Position = vertex;
+}
+
+[geometry shader]
+#version 120
+#extension GL_ARB_geometry_shader4: enable
+
+varying in float gs_input1[3][1];
+varying in float gs_input4[3][4];
+
+varying out vec4 gs_out;
+
+void main()
+{
+       /* Constant indexing of arrays with known size should do a bounds check.
+        * The bounds check on these to operations would fail if the compiler
+        * checked the index against the wrong array dimension.
+        */
+       float s1 = gs_input1[1][0];
+       float s2 = gs_input4[0][3];
+
+       /* Assignment operations of arrays should fail if the arrays don't have
+        * the same size.
+        * The assignment operations would fail if the compiler incorrectly
+        * compared the size of the local arrays a* (1 and 4, respectively) to
+        * the size of the outer dimension of the input arrays gs_input* (3).
+        */
+       float a1[1] = gs_input1[0];
+       float a4[4] = gs_input4[0];
+
+       for (int i = 0; i < gl_VerticesIn; i++) {
+               gs_out = vec4(s1, s2, a1[0], a4[0]);
+
+               gl_Position = gl_PositionIn[i];
+               EmitVertex();
+       }
+}
+
+[geometry layout]
+input type GL_TRIANGLES
+output type GL_TRIANGLE_STRIP
+vertices out 3
+
+[fragment shader]
+#version 120
+
+const int gs_VerticesIn = 3;
+
+varying vec4 gs_out;
+
+void main()
+{
+  gl_FragColor = gs_out;
+}
+
+[vertex data]
+vertex/float/2
+-1.0 -1.0
+ 1.0 -1.0
+ 1.0  1.0
+-1.0  1.0
+
+[test]
+draw arrays GL_TRIANGLE_FAN 0 4
+probe all rgba 0.5 0.5 0.5 0.5
diff --git a/tests/spec/arb_geometry_shader4/linker/2darray03.shader_test 
b/tests/spec/arb_geometry_shader4/linker/2darray03.shader_test
new file mode 100644
index 0000000..f4c807a
--- /dev/null
+++ b/tests/spec/arb_geometry_shader4/linker/2darray03.shader_test
@@ -0,0 +1,62 @@
+#Test that constant array indexing of gs input arrays is bounds checked at 
link time.
+[require]
+GL >= 2.0
+GLSL >= 1.20
+GL_ARB_geometry_shader4
+
+[vertex shader]
+#version 120
+
+attribute vec4 vertex;
+
+varying float gs_input[4];
+
+void main()
+{
+       for (int i = 0; i < 4; i++)
+               gs_input[i] = 0.5;
+       gl_Position = vertex;
+}
+
+[geometry shader]
+#version 120
+#extension GL_ARB_geometry_shader4: enable
+
+varying in float gs_input[][4];
+
+varying out float gs_out;
+
+void main()
+{
+       /* This sould fail at link time once the size of the outer dimension of
+        * gs_input (3) is known.
+        */
+       float s = gs_input[3][0];
+
+       for (int i = 0; i < gl_VerticesIn; i++) {
+               gs_out = s;
+
+               gl_Position = gl_PositionIn[i];
+               EmitVertex();
+       }
+}
+
+[geometry layout]
+input type GL_TRIANGLES
+output type GL_TRIANGLE_STRIP
+vertices out 3
+
+[fragment shader]
+#version 120
+
+const int gs_VerticesIn = 3;
+
+varying float gs_out;
+
+void main()
+{
+  gl_FragColor = vec4(gs_out);
+}
+
+[test]
+link error
-- 
1.8.1.2

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

Reply via email to