new file mode 100644
@@ -0,0 +1,31 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * require_extensions: GL_ARB_arrays_of_arrays
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "It is legal to declare an array without a size and then later
+ * re-declare the same name as an array of the same type and specify a
+ * size."
+ */
+#version 120
+#extension GL_ARB_arrays_of_arrays: enable
+
+float a_function(float[3][2]);
+
+void main()
+{
+ float [][2] an_array;
+
+ an_array[0][1] = 0.0;
+ an_array[1][1] = 1.0;
+ an_array[2][0] = 2.0;
+
+ float [][2] an_array = float[][2](float[2](0.0, 1.0),
+ float[2](0.0, 1.0),
+ float[2](0.0, 1.0));
+
+ gl_Position = vec4(a_function(an_array));
+}
new file mode 100644
@@ -0,0 +1,29 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * require_extensions: GL_ARB_arrays_of_arrays
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "It is legal to declare an array without a size and then later
+ * re-declare the same name as an array of the same type and specify a
+ * size."
+ */
+#version 120
+#extension GL_ARB_arrays_of_arrays: enable
+
+float a_function(float[2][3]);
+
+void main()
+{
+ float [][3] an_array;
+
+ an_array[0][2] = 0.0;
+ an_array[1][2] = 1.0;
+ an_array[2][2] = 2.0;
+
+ float [2][3] an_array;
+
+ gl_Position = vec4(a_function(an_array));
+}
new file mode 100644
@@ -0,0 +1,23 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * require_extensions: GL_ARB_arrays_of_arrays
+ * [end config]
+ */
+#version 120
+#extension GL_ARB_arrays_of_arrays: enable
+
+float x[][2];
+
+void foo() { x[3][1] = 2.; }
+
+// The left most array must be at least 4 elements because of
+// the previous access to x[3][1].
+float x[][2] = float[][2](float[2](1., 2.),
+ float[2](1., 2.));
+
+void main()
+{
+ foo();
+ gl_Position = vec4(x[0][0]);
+}
new file mode 100644
@@ -0,0 +1,29 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * require_extensions: GL_ARB_arrays_of_arrays
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "It is legal to declare an array without a size and then later
+ * re-declare the same name as an array of the same type and specify a
+ * size."
+ */
+#version 120
+#extension GL_ARB_arrays_of_arrays: enable
+
+float a_function(float[3][3]);
+
+void main()
+{
+ float [][3] an_array;
+
+ an_array[0][2] = 0.0;
+ an_array[1][2] = 1.0;
+ an_array[2][2] = 2.0;
+
+ float [3][3] an_array;
+
+ gl_Position = vec4(a_function(an_array));
+}
new file mode 100644
@@ -0,0 +1,29 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * require_extensions: GL_ARB_arrays_of_arrays
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "It is legal to declare an array without a size and then later
+ * re-declare the same name as an array of the same type and specify a
+ * size."
+ */
+#version 120
+#extension GL_ARB_arrays_of_arrays: enable
+
+float x[][2];
+
+void foo() { x[1][1] = 2.; }
+
+// The left most array must be at least 2 elements because
+// of the previous access to x[2][1].
+float x[][2] = float[][2](float[2](1., 2.),
+ float[2](1., 2.));
+
+void main()
+{
+ foo();
+ gl_Position = vec4(x[0][0]);
+}
new file mode 100644
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.50
+ * require_extensions: GL_ARB_arrays_of_arrays
+ * require_extensions: GL_ARB_shader_subroutine
+ * require_extensions: GL_ARB_gpu_shader5
+ * [end config]
+ */
+#version 150
+#extension GL_ARB_arrays_of_arrays: enable
+#extension GL_ARB_shader_subroutine: enable
+#extension GL_ARB_gpu_shader5: enable
+
+subroutine vec4[3][2] basicSubRoutine();
+
+subroutine (basicSubRoutine) vec4[3][2] option1() {
+ vec4 a[3][2] = vec4[3][2](vec4[2](vec4(0.0), vec4(1.0)),
+ vec4[2](vec4(0.0), vec4(1.0)),
+ vec4[2](vec4(0.0), vec4(1.0)));
+ return a;
+}
+
+subroutine (basicSubRoutine) vec4[3][2] option2() {
+ vec4 a[3][2] = vec4[3][2](vec4[2](vec4(1.0), vec4(0.0)),
+ vec4[2](vec4(1.0), vec4(0.0)),
+ vec4[2](vec4(1.0), vec4(0.0)));
+ return a;
+}
+
+subroutine uniform basicSubRoutine subRoutineSelection;
+
+void main()
+{
+ vec4[3][2] a = subRoutineSelection();
+
+ gl_Position = a[0][0];
+}
Test results are from the following hardware/driver combinations: AMD Radeon HD 6670 - Catalyst 13.251 OpenGL 4.3 Nvidia GeForce 210 - NVIDIA 331.20 OpenGL 3.3 Intel Ivy Bridge - Mesa 10.1(815e064) with ARB_arrays_of_arrays enabled redeclaration-initializer.vert AMD: fail Nvida: pass Intel: pass redeclaration-too-small.vert AMD: pass Nvida: fail (Nvidia only warns for outofbounds) Intel: pass redeclaration-too-small2.vert AMD: pass Nvida: fail (Nvidia only warns for outofbounds) Intel: pass redeclaration.vert AMD: fail Nvida: pass Intel: pass redeclaration2.vert AMD: pass Nvida: pass Intel: pass subroutine.vert AMD: pass Nvida: skip Intel: skip Signed-off-by: Timothy Arceri <t_arceri@yahoo.com.au> --- .../compiler/redeclaration-initializer.vert | 31 ++++++++++++++++++ .../compiler/redeclaration-too-small.vert | 29 +++++++++++++++++ .../compiler/redeclaration-too-small2.vert | 23 ++++++++++++++ .../compiler/redeclaration.vert | 29 +++++++++++++++++ .../compiler/redeclaration2.vert | 29 +++++++++++++++++ .../arb_arrays_of_arrays/compiler/subroutine.vert | 37 ++++++++++++++++++++++ 6 files changed, 178 insertions(+) create mode 100644 tests/spec/arb_arrays_of_arrays/compiler/redeclaration-initializer.vert create mode 100644 tests/spec/arb_arrays_of_arrays/compiler/redeclaration-too-small.vert create mode 100644 tests/spec/arb_arrays_of_arrays/compiler/redeclaration-too-small2.vert create mode 100644 tests/spec/arb_arrays_of_arrays/compiler/redeclaration.vert create mode 100644 tests/spec/arb_arrays_of_arrays/compiler/redeclaration2.vert create mode 100644 tests/spec/arb_arrays_of_arrays/compiler/subroutine.vert