aboutsummaryrefslogtreecommitdiff
path: root/tests/spec/glsl-es-1.00
diff options
context:
space:
mode:
Diffstat (limited to 'tests/spec/glsl-es-1.00')
-rw-r--r--tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-bool.vert10
-rw-r--r--tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-bvec2.vert10
-rw-r--r--tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-bvec3.vert10
-rw-r--r--tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-bvec4.vert10
-rw-r--r--tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-float.vert10
-rw-r--r--tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-int.vert10
-rwxr-xr-xtests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-invalid-parameters.sh24
-rw-r--r--tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat2.vert10
-rw-r--r--tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat2x2.vert10
-rw-r--r--tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat2x3.vert10
-rw-r--r--tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat2x4.vert10
-rw-r--r--tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat3.vert10
-rw-r--r--tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat3x2.vert10
-rw-r--r--tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat3x3.vert10
-rw-r--r--tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat3x4.vert10
-rw-r--r--tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat4.vert10
-rw-r--r--tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat4x2.vert10
-rw-r--r--tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat4x3.vert10
-rw-r--r--tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat4x4.vert10
-rw-r--r--tests/spec/glsl-es-1.00/compiler/clipping/clip-distance-unavailable.frag17
-rw-r--r--tests/spec/glsl-es-1.00/compiler/clipping/clip-distance-unavailable.vert18
-rw-r--r--tests/spec/glsl-es-1.00/compiler/storage-qualifiers/static-write-attribute-01.vert17
-rw-r--r--tests/spec/glsl-es-1.00/compiler/storage-qualifiers/static-write-attribute-02.vert19
-rw-r--r--tests/spec/glsl-es-1.00/compiler/storage-qualifiers/static-write-point-coord.frag18
-rw-r--r--tests/spec/glsl-es-1.00/compiler/storage-qualifiers/static-write-varying-01.frag14
-rw-r--r--tests/spec/glsl-es-1.00/compiler/storage-qualifiers/static-write-varying-02.frag19
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-add.vert26
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bool-float.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bool-int.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec2-ivec2.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec2-vec2.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec3-ivec3.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec3-vec3.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec4-ivec4.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec4-vec4.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-float-bool.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-float-int.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-int-bool.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-int-float.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec2-bvec2.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec2-vec2.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec3-bvec3.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec3-vec3.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec4-bvec4.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec4-vec4.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec2-bvec2.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec2-ivec2.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec3-bvec3.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec3-ivec3.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec4-bvec4.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec4-ivec4.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-size.vert23
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign.vert30
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-attribute.vert19
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-constant-index-implicit-size.vert22
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-constant-index-negative.vert19
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-constant-index-too-large.vert20
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bool-float.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bool-int.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec2-ivec2.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec2-vec2.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec3-ivec3.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec3-vec3.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec4-ivec4.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec4-vec4.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-float-bool.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-float-int.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-int-bool.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-int-float.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec2-bvec2.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec2-vec2.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec3-bvec3.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec3-vec3.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec4-bvec4.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec4-vec4.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec2-bvec2.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec2-ivec2.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec3-bvec3.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec3-ivec3.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec4-bvec4.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec4-ivec4.vert37
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-mismatched-size.vert16
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor.vert17
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-divide.vert26
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal-implicit-size.vert28
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal-matrix.vert22
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal-mismatched-base-type.vert22
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal-mismatched-size.vert22
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal-vector.vert22
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal.vert22
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-function-parameter-implicit-size.vert29
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-function-parameter-unsized.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-function-return-unsized.vert31
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-function-return.vert31
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-greater-equal.vert25
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-greater.vert25
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-length-implicit-size.vert21
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-length-with-argument.vert14
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-length.vert24
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-less-equal.vert25
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-less.vert25
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-logical-and.vert25
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-logical-not.vert25
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-logical-or.vert25
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-logical-xor.vert25
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-multidimensional-new-syntax.vert18
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-multidimensional.vert18
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-multiply.vert26
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-negate.vert25
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal-implicit-size.vert28
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal-matrix.vert22
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal-mismatched-base-type.vert22
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal-mismatched-size.vert22
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal-vertor.vert22
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal.vert22
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-any-type.vert44
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-function-parameter-declaration.frag20
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-function-parameter-declaration.vert20
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-function-parameter-definition.frag23
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-function-parameter-definition.vert23
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-structure-field.frag22
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-structure-field.vert22
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-struct-of-array.vert28
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-struct.vert22
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-positive.vert25
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-postdecrement.vert24
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-postincrement.vert24
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-predecrement.vert24
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-preincrement.vert24
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-redeclaration-01.vert31
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-redeclaration-initializer.vert28
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-redeclaration-too-small.vert28
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-redeclaration-wrong-base-type.vert29
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-selection.vert24
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-sequence.vert25
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-shadow-redeclaration.vert29
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-bool.vert17
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-bvec2.vert17
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-bvec3.vert17
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-bvec4.vert17
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-constant-cast.vert18
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-constant-relational.vert162
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-float.vert17
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-int.vert17
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-ivec2.vert17
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-ivec3.vert17
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-ivec4.vert17
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-length.vert18
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-negative.vert17
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-non-builtin-function.vert19
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-not-constant.vert18
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-selection.vert23
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-sequence-in-parenthesis.vert33
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-sequence.vert33
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-vec2.vert17
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-vec3.vert17
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-vec4.vert17
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-with-side-effect.vert20
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-zero.vert17
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-subtract.vert26
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-variable-index-implicit-size-global.vert24
-rw-r--r--tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-variable-index-implicit-size-local.vert29
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/clipping/clipping.out0
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/clipping/fixed-clip-enables.shader_test141
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-const-accept.shader_test42
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-const-reject.shader_test42
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-different-from-position.shader_test62
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-enables.shader_test147
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-equal-to-position.shader_test57
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-homogeneity.shader_test69
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-assign-varied-struct.shader_test36
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2-ivec.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2.shader_test34
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x2-ivec.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x2.shader_test34
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x3-ivec.shader_test56
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x3.shader_test35
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x4-ivec.shader_test56
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x4.shader_test36
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3-ivec.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3.shader_test34
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x2-ivec.shader_test56
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x2.shader_test36
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x3-ivec.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x3.shader_test34
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x4-ivec.shader_test56
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x4.shader_test36
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4-ivec.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4.shader_test34
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x2-ivec.shader_test56
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x2.shader_test36
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x3-ivec.shader_test56
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x3.shader_test36
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x4-ivec.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x4.shader_test34
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2-ivec.shader_test74
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x2-ivec.shader_test74
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x2.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x3-ivec.shader_test76
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x3.shader_test56
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x4-ivec.shader_test76
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x4.shader_test56
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3-ivec.shader_test74
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x2-ivec.shader_test76
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x2.shader_test56
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x3-ivec.shader_test74
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x3.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x4-ivec.shader_test76
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x4.shader_test56
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4-ivec.shader_test74
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x2-ivec.shader_test76
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x2.shader_test56
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x3-ivec.shader_test76
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x3.shader_test56
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x4-ivec.shader_test74
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x4.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxClipPlanes.shader_test28
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxCombinedTextureImageUnits.shader_test28
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxDrawBuffers.shader_test28
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxFragmentUniformComponents.shader_test28
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxLights.shader_test28
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxTextureCoords.shader_test28
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxTextureImageUnits.shader_test28
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxTextureUnits.shader_test28
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxVaryingFloats.shader_test28
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxVertexAttribs.shader_test28
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxVertexTextureImageUnits.shader_test28
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxVertexUniformComponents.shader_test28
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/maximums/maximums.out0
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/outerProduct-const.sh221
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/outerProduct.sh217
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/qualifiers/qualifiers.out0
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/qualifiers/vs-out-conversion-int-int-float-to-float-float-float-return.shader_test46
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/qualifiers/vs-out-conversion-int-to-float-return.shader_test41
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/qualifiers/vs-out-conversion-int-to-float.shader_test40
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/uniform-initializer/fs-structure-array.shader_test48
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/uniform-initializer/fs-structure.shader_test44
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/uniform-initializer/uniform-initializer.out0
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/uniform-initializer/vs-structure-array.shader_test48
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/uniform-initializer/vs-structure.shader_test42
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-col-rd.shader_test46
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-col-row-rd.shader_test60
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-col-row-wr.shader_test75
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-col-wr.shader_test56
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-col-rd.shader_test71
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-col-row-rd.shader_test109
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-col-row-wr.shader_test146
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-col-wr.shader_test91
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-rd.shader_test51
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-row-rd.shader_test71
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-row-wr.shader_test92
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-wr.shader_test64
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-rd.shader_test38
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-row-rd.shader_test46
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-row-wr.shader_test57
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-wr.shader_test47
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-col-rd.shader_test51
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-col-row-rd.shader_test86
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-col-row-wr.shader_test116
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-col-wr.shader_test64
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-col-rd.shader_test86
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-col-row-rd.shader_test187
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-col-row-wr.shader_test269
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-col-wr.shader_test115
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-rd.shader_test51
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-row-rd.shader_test86
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-row-wr.shader_test116
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-wr.shader_test64
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-rd.shader_test38
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-row-rd.shader_test51
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-row-wr.shader_test65
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-wr.shader_test47
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat4-col-rd.shader_test56
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat4-col-row-rd.shader_test122
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat4-col-row-wr.shader_test173
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat4-col-wr.shader_test72
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat4-index-col-rd.shader_test101
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat4-index-col-row-rd.shader_test295
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat4-index-col-row-wr.shader_test440
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat4-index-col-wr.shader_test139
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat4-index-rd.shader_test51
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat4-index-row-rd.shader_test101
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat4-index-row-wr.shader_test140
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat4-index-wr.shader_test64
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat4-rd.shader_test38
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat4-row-rd.shader_test56
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat4-row-wr.shader_test73
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat4-wr.shader_test47
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat2-col-rd.shader_test43
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat2-col-row-rd.shader_test57
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat2-col-row-wr.shader_test70
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat2-col-wr.shader_test51
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat2-rd.shader_test35
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat2-row-rd.shader_test43
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat2-row-wr.shader_test52
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat2-wr.shader_test42
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat3-col-rd.shader_test48
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat3-col-row-rd.shader_test83
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat3-col-row-wr.shader_test111
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat3-col-wr.shader_test59
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat3-rd.shader_test35
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat3-row-rd.shader_test48
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat3-row-wr.shader_test60
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat3-wr.shader_test42
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat4-col-rd.shader_test53
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat4-col-row-rd.shader_test119
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat4-col-row-wr.shader_test168
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat4-col-wr.shader_test67
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat4-rd.shader_test35
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat4-row-rd.shader_test53
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat4-row-wr.shader_test68
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-mat4-wr.shader_test42
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat2-col-rd.shader_test49
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat2-col-row-rd.shader_test63
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat2-index-col-rd.shader_test74
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat2-index-col-row-rd.shader_test112
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat2-index-rd.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat2-index-row-rd.shader_test74
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat2-rd.shader_test41
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat2-row-rd.shader_test49
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat3-col-rd.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat3-col-row-rd.shader_test89
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat3-index-col-rd.shader_test89
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat3-index-col-row-rd.shader_test190
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat3-index-rd.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat3-index-row-rd.shader_test89
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat3-rd.shader_test41
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat3-row-rd.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat4-col-rd.shader_test59
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat4-col-row-rd.shader_test125
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat4-index-col-rd.shader_test104
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat4-index-col-row-rd.shader_test298
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat4-index-rd.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat4-index-row-rd.shader_test104
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat4-rd.shader_test41
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-array-mat4-row-rd.shader_test59
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-mat2-col-rd.shader_test43
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-mat2-col-row-rd.shader_test57
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-mat2-rd.shader_test35
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-mat2-row-rd.shader_test43
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-mat3-col-rd.shader_test48
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-mat3-col-row-rd.shader_test83
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-mat3-rd.shader_test35
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-mat3-row-rd.shader_test48
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-mat4-col-rd.shader_test53
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-mat4-col-row-rd.shader_test119
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-mat4-rd.shader_test35
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-uniform-mat4-row-rd.shader_test53
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat2-col-rd.shader_test47
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat2-col-row-rd.shader_test61
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat2-index-col-rd.shader_test72
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat2-index-col-row-rd.shader_test110
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat2-index-rd.shader_test52
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat2-index-row-rd.shader_test72
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat2-rd.shader_test39
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat2-row-rd.shader_test47
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat3-col-rd.shader_test52
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat3-col-row-rd.shader_test87
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat3-index-col-rd.shader_test87
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat3-index-col-row-rd.shader_test188
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat3-index-rd.shader_test52
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat3-index-row-rd.shader_test87
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat3-rd.shader_test39
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat3-row-rd.shader_test52
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat4-col-rd.shader_test57
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat4-col-row-rd.shader_test123
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat4-index-col-rd.shader_test102
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat4-index-col-row-rd.shader_test296
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat4-index-rd.shader_test52
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat4-index-row-rd.shader_test102
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat4-rd.shader_test39
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-array-mat4-row-rd.shader_test57
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-mat2-col-rd.shader_test45
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-mat2-col-row-rd.shader_test59
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-mat2-rd.shader_test37
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-mat2-row-rd.shader_test45
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-mat3-col-rd.shader_test50
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-mat3-col-row-rd.shader_test85
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-mat3-rd.shader_test37
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-mat3-row-rd.shader_test50
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-mat4-col-rd.shader_test55
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-mat4-col-row-rd.shader_test121
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-mat4-rd.shader_test37
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-varying-mat4-row-rd.shader_test55
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/variable-indexing.out0
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat2-col-rd.shader_test47
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat2-col-row-rd.shader_test61
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat2-col-row-wr.shader_test79
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat2-col-wr.shader_test60
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat2-index-col-rd.shader_test72
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat2-index-col-row-rd.shader_test110
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat2-index-col-row-wr.shader_test150
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat2-index-col-wr.shader_test95
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat2-index-rd.shader_test52
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat2-index-row-rd.shader_test72
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat2-index-row-wr.shader_test96
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat2-index-wr.shader_test68
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat2-rd.shader_test39
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat2-row-rd.shader_test47
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat2-row-wr.shader_test61
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat2-wr.shader_test51
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat3-col-rd.shader_test52
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat3-col-row-rd.shader_test87
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat3-col-row-wr.shader_test120
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat3-col-wr.shader_test68
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat3-index-col-rd.shader_test87
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat3-index-col-row-rd.shader_test188
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat3-index-col-row-wr.shader_test273
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat3-index-col-wr.shader_test119
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat3-index-rd.shader_test52
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat3-index-row-rd.shader_test87
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat3-index-row-wr.shader_test120
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat3-index-wr.shader_test68
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat3-rd.shader_test39
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat3-row-rd.shader_test52
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat3-row-wr.shader_test69
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat3-wr.shader_test51
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat4-col-rd.shader_test57
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat4-col-row-rd.shader_test123
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat4-col-row-wr.shader_test177
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat4-col-wr.shader_test76
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat4-index-col-rd.shader_test102
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat4-index-col-row-rd.shader_test296
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat4-index-col-row-wr.shader_test444
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat4-index-col-wr.shader_test143
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat4-index-rd.shader_test52
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat4-index-row-rd.shader_test102
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat4-index-row-wr.shader_test144
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat4-index-wr.shader_test68
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat4-rd.shader_test39
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat4-row-rd.shader_test57
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat4-row-wr.shader_test77
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-array-mat4-wr.shader_test51
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat2-col-rd.shader_test44
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat2-col-row-rd.shader_test58
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat2-col-row-wr.shader_test74
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat2-col-wr.shader_test55
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat2-rd.shader_test36
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat2-row-rd.shader_test44
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat2-row-wr.shader_test56
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat2-wr.shader_test46
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat3-col-rd.shader_test49
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat3-col-row-rd.shader_test84
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat3-col-row-wr.shader_test115
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat3-col-wr.shader_test63
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat3-rd.shader_test36
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat3-row-rd.shader_test49
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat3-row-wr.shader_test64
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat3-wr.shader_test46
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat4-col-rd.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat4-col-row-rd.shader_test120
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat4-col-row-wr.shader_test172
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat4-col-wr.shader_test71
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat4-rd.shader_test36
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat4-row-rd.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat4-row-wr.shader_test72
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-temp-mat4-wr.shader_test46
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat2-col-rd.shader_test50
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat2-col-row-rd.shader_test64
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat2-index-col-rd.shader_test75
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat2-index-col-row-rd.shader_test113
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat2-index-rd.shader_test55
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat2-index-row-rd.shader_test75
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat2-rd.shader_test42
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat2-row-rd.shader_test50
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat3-col-rd.shader_test55
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat3-col-row-rd.shader_test90
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat3-index-col-rd.shader_test90
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat3-index-col-row-rd.shader_test191
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat3-index-rd.shader_test55
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat3-index-row-rd.shader_test90
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat3-rd.shader_test42
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat3-row-rd.shader_test55
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat4-col-rd.shader_test60
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat4-col-row-rd.shader_test126
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat4-index-col-rd.shader_test105
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat4-index-col-row-rd.shader_test299
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat4-index-rd.shader_test55
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat4-index-row-rd.shader_test105
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat4-rd.shader_test42
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-array-mat4-row-rd.shader_test60
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-mat2-col-rd.shader_test44
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-mat2-col-row-rd.shader_test58
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-mat2-rd.shader_test36
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-mat2-row-rd.shader_test44
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-mat3-col-rd.shader_test49
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-mat3-col-row-rd.shader_test84
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-mat3-rd.shader_test36
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-mat3-row-rd.shader_test49
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-mat4-col-rd.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-mat4-col-row-rd.shader_test120
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-mat4-rd.shader_test36
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-uniform-mat4-row-rd.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat2-col-rd.shader_test63
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat2-col-row-rd.shader_test77
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat2-col-row-wr.shader_test90
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat2-col-wr.shader_test70
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat2-index-col-rd.shader_test88
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat2-index-col-row-rd.shader_test126
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat2-index-col-row-wr.shader_test161
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat2-index-col-wr.shader_test105
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat2-index-rd.shader_test68
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat2-index-row-rd.shader_test88
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat2-index-row-wr.shader_test107
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat2-index-wr.shader_test78
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat2-rd.shader_test55
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat2-row-rd.shader_test63
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat2-row-wr.shader_test72
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat2-wr.shader_test61
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat3-col-rd.shader_test68
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat3-col-row-rd.shader_test103
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat3-col-row-wr.shader_test131
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat3-col-wr.shader_test78
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat3-index-col-rd.shader_test103
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat3-index-col-row-rd.shader_test204
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat3-index-col-row-wr.shader_test284
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat3-index-col-wr.shader_test129
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat3-index-rd.shader_test68
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat3-index-row-rd.shader_test103
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat3-index-row-wr.shader_test131
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat3-index-wr.shader_test78
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat3-rd.shader_test55
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat3-row-rd.shader_test68
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat3-row-wr.shader_test80
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat3-wr.shader_test61
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat4-col-rd.shader_test73
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat4-col-row-rd.shader_test139
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat4-col-row-wr.shader_test188
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat4-col-wr.shader_test86
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat4-index-col-rd.shader_test118
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat4-index-col-row-rd.shader_test312
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat4-index-col-row-wr.shader_test455
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat4-index-col-wr.shader_test153
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat4-index-rd.shader_test68
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat4-index-row-rd.shader_test118
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat4-index-row-wr.shader_test155
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat4-index-wr.shader_test78
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat4-rd.shader_test55
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat4-row-rd.shader_test73
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat4-row-wr.shader_test88
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-array-mat4-wr.shader_test61
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat2-col-rd.shader_test61
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat2-col-row-rd.shader_test75
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat2-col-row-wr.shader_test83
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat2-col-wr.shader_test63
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat2-rd.shader_test53
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat2-row-rd.shader_test61
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat2-row-wr.shader_test65
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat2-wr.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat3-col-rd.shader_test66
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat3-col-row-rd.shader_test101
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat3-col-row-wr.shader_test124
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat3-col-wr.shader_test71
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat3-rd.shader_test53
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat3-row-rd.shader_test66
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat3-row-wr.shader_test73
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat3-wr.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat4-col-rd.shader_test71
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat4-col-row-rd.shader_test137
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat4-col-row-wr.shader_test181
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat4-col-wr.shader_test79
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat4-rd.shader_test53
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat4-row-rd.shader_test71
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat4-row-wr.shader_test81
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/vs-varying-mat4-wr.shader_test54
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-all-equal-bool-array.shader_test39
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-assign-varied-struct.shader_test39
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat2-ivec.shader_test57
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat2.shader_test37
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat2x2-ivec.shader_test57
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat2x2.shader_test37
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat2x3-ivec.shader_test59
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat2x3.shader_test39
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat2x4-ivec.shader_test59
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat2x4.shader_test39
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat3-ivec.shader_test57
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat3.shader_test37
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat3x2-ivec.shader_test59
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat3x2.shader_test39
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat3x3-ivec.shader_test57
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat3x3.shader_test37
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat3x4-ivec.shader_test59
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat3x4.shader_test39
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat4-ivec.shader_test57
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat4.shader_test37
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat4x2-ivec.shader_test59
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat4x2.shader_test39
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat4x3-ivec.shader_test59
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat4x3.shader_test39
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat4x4-ivec.shader_test57
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-const-mat4x4.shader_test37
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat2-ivec.shader_test77
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat2.shader_test57
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat2x2-ivec.shader_test77
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat2x2.shader_test57
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat2x3-ivec.shader_test79
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat2x3.shader_test59
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat2x4-ivec.shader_test79
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat2x4.shader_test59
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat3-ivec.shader_test77
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat3.shader_test57
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat3x2-ivec.shader_test79
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat3x2.shader_test59
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat3x3-ivec.shader_test77
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat3x3.shader_test57
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat3x4-ivec.shader_test79
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat3x4.shader_test59
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat4-ivec.shader_test77
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat4.shader_test57
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat4x2-ivec.shader_test79
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat4x2.shader_test59
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat4x3-ivec.shader_test79
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat4x3.shader_test59
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat4x4-ivec.shader_test77
-rw-r--r--tests/spec/glsl-es-1.00/execution/1.20/vs-outerProduct-mat4x4.shader_test57
618 files changed, 38572 insertions, 0 deletions
diff --git a/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-bool.vert b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-bool.vert
new file mode 100644
index 00000000..fb8d655e
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-bool.vert
@@ -0,0 +1,10 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ */
+void main () {
+ gl_Position = vec4(0);
+ outerProduct(bool(0), bool(0));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-bvec2.vert b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-bvec2.vert
new file mode 100644
index 00000000..3ec5fadc
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-bvec2.vert
@@ -0,0 +1,10 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ */
+void main () {
+ gl_Position = vec4(0);
+ outerProduct(bvec2(0), bvec2(0));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-bvec3.vert b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-bvec3.vert
new file mode 100644
index 00000000..25c7e677
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-bvec3.vert
@@ -0,0 +1,10 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ */
+void main () {
+ gl_Position = vec4(0);
+ outerProduct(bvec3(0), bvec3(0));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-bvec4.vert b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-bvec4.vert
new file mode 100644
index 00000000..2aa4cfe0
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-bvec4.vert
@@ -0,0 +1,10 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ */
+void main () {
+ gl_Position = vec4(0);
+ outerProduct(bvec4(0), bvec4(0));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-float.vert b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-float.vert
new file mode 100644
index 00000000..f7632cee
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-float.vert
@@ -0,0 +1,10 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ */
+void main () {
+ gl_Position = vec4(0);
+ outerProduct(float(0), float(0));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-int.vert b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-int.vert
new file mode 100644
index 00000000..e2bb80ac
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-int.vert
@@ -0,0 +1,10 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ */
+void main () {
+ gl_Position = vec4(0);
+ outerProduct(int(0), int(0));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-invalid-parameters.sh b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-invalid-parameters.sh
new file mode 100755
index 00000000..e9ffae9a
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-invalid-parameters.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+function emit_vs
+{
+ t=$1
+
+ cat > outerProduct-$t.vert <<EOF
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ */
+void main () {
+ gl_Position = vec4(0);
+ outerProduct(${t}(0), ${t}(0));
+}
+EOF
+}
+
+for i in int float bool bvec2 bvec3 bvec4 mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4
+do
+ emit_vs $i
+done
diff --git a/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat2.vert b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat2.vert
new file mode 100644
index 00000000..09d06bb7
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat2.vert
@@ -0,0 +1,10 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ */
+void main () {
+ gl_Position = vec4(0);
+ outerProduct(mat2(0), mat2(0));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat2x2.vert b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat2x2.vert
new file mode 100644
index 00000000..94921f70
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat2x2.vert
@@ -0,0 +1,10 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ */
+void main () {
+ gl_Position = vec4(0);
+ outerProduct(mat2x2(0), mat2x2(0));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat2x3.vert b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat2x3.vert
new file mode 100644
index 00000000..f55e8876
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat2x3.vert
@@ -0,0 +1,10 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ */
+void main () {
+ gl_Position = vec4(0);
+ outerProduct(mat2x3(0), mat2x3(0));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat2x4.vert b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat2x4.vert
new file mode 100644
index 00000000..9620135a
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat2x4.vert
@@ -0,0 +1,10 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ */
+void main () {
+ gl_Position = vec4(0);
+ outerProduct(mat2x4(0), mat2x4(0));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat3.vert b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat3.vert
new file mode 100644
index 00000000..8eb8f991
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat3.vert
@@ -0,0 +1,10 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ */
+void main () {
+ gl_Position = vec4(0);
+ outerProduct(mat3(0), mat3(0));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat3x2.vert b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat3x2.vert
new file mode 100644
index 00000000..a2c23355
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat3x2.vert
@@ -0,0 +1,10 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ */
+void main () {
+ gl_Position = vec4(0);
+ outerProduct(mat3x2(0), mat3x2(0));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat3x3.vert b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat3x3.vert
new file mode 100644
index 00000000..fbfd900f
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat3x3.vert
@@ -0,0 +1,10 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ */
+void main () {
+ gl_Position = vec4(0);
+ outerProduct(mat3x3(0), mat3x3(0));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat3x4.vert b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat3x4.vert
new file mode 100644
index 00000000..a31db9e8
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat3x4.vert
@@ -0,0 +1,10 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ */
+void main () {
+ gl_Position = vec4(0);
+ outerProduct(mat3x4(0), mat3x4(0));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat4.vert b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat4.vert
new file mode 100644
index 00000000..4fa6c07a
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat4.vert
@@ -0,0 +1,10 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ */
+void main () {
+ gl_Position = vec4(0);
+ outerProduct(mat4(0), mat4(0));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat4x2.vert b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat4x2.vert
new file mode 100644
index 00000000..2ca45390
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat4x2.vert
@@ -0,0 +1,10 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ */
+void main () {
+ gl_Position = vec4(0);
+ outerProduct(mat4x2(0), mat4x2(0));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat4x3.vert b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat4x3.vert
new file mode 100644
index 00000000..e45e5f90
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat4x3.vert
@@ -0,0 +1,10 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ */
+void main () {
+ gl_Position = vec4(0);
+ outerProduct(mat4x3(0), mat4x3(0));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat4x4.vert b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat4x4.vert
new file mode 100644
index 00000000..e63a8a5e
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/built-in-functions/outerProduct-mat4x4.vert
@@ -0,0 +1,10 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ */
+void main () {
+ gl_Position = vec4(0);
+ outerProduct(mat4x4(0), mat4x4(0));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/clipping/clip-distance-unavailable.frag b/tests/spec/glsl-es-1.00/compiler/clipping/clip-distance-unavailable.frag
new file mode 100644
index 00000000..e72eb045
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/clipping/clip-distance-unavailable.frag
@@ -0,0 +1,17 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * check_link: true
+ * [end config]
+ *
+ * This test verifies that the fragment shader special variable
+ * gl_ClipDistance (defined in GLSL 1.30) is not available when the
+ * GLSL version is 1.20.
+ */
+
+varying float gl_ClipDistance[2];
+
+void main()
+{
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/clipping/clip-distance-unavailable.vert b/tests/spec/glsl-es-1.00/compiler/clipping/clip-distance-unavailable.vert
new file mode 100644
index 00000000..108f9122
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/clipping/clip-distance-unavailable.vert
@@ -0,0 +1,18 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * check_link: true
+ * [end config]
+ *
+ * This test verifies that the vertex shader special variable
+ * gl_ClipDistance (defined in GLSL 1.30) is not available when the
+ * GLSL version is 1.20.
+ */
+
+varying float gl_ClipDistance[2];
+
+void main()
+{
+ gl_Position = vec4(0.0);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/storage-qualifiers/static-write-attribute-01.vert b/tests/spec/glsl-es-1.00/compiler/storage-qualifiers/static-write-attribute-01.vert
new file mode 100644
index 00000000..7ebd324a
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/storage-qualifiers/static-write-attribute-01.vert
@@ -0,0 +1,17 @@
+// [config]
+// expect_result: fail
+// glsl_version: 1.20
+// glsles_version: 1.00
+// [end config]
+//
+// From section 4.3.4 of the GLSL 1.20 spec:
+// Attribute variables are read-only as far as the vertex shader is
+// concerned.
+
+
+attribute float x;
+
+float f() {
+ x = 0.0;
+ return x;
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/storage-qualifiers/static-write-attribute-02.vert b/tests/spec/glsl-es-1.00/compiler/storage-qualifiers/static-write-attribute-02.vert
new file mode 100644
index 00000000..1182d7ce
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/storage-qualifiers/static-write-attribute-02.vert
@@ -0,0 +1,19 @@
+// [config]
+// expect_result: fail
+// glsl_version: 1.20
+// glsles_version: 1.00
+// [end config]
+//
+// From section 4.3.4 of the GLSL 1.20 spec:
+// Attribute variables are read-only as far as the vertex shader is
+// concerned.
+
+attribute float x;
+
+void f(out float y) {
+ y = 0.0;
+}
+
+void g() {
+ f(x);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/storage-qualifiers/static-write-point-coord.frag b/tests/spec/glsl-es-1.00/compiler/storage-qualifiers/static-write-point-coord.frag
new file mode 100644
index 00000000..b909f94b
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/storage-qualifiers/static-write-point-coord.frag
@@ -0,0 +1,18 @@
+// [config]
+// expect_result: fail
+// glsl_version: 1.20
+// glsles_version: 1.00
+// [end config]
+//
+// From section 4.3.6 of the GLSL 1.20 spec:
+// A fragment shader can not write to a varying variable.
+//
+// From section 7.6 of the GLSL 1.20 spec:
+// The following varying variables are available to read from in a fragment shader.
+// ...
+// varying vec2 gl_PointCoord;
+
+
+void g() {
+ gl_PointCoord = vec2(0.0);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/storage-qualifiers/static-write-varying-01.frag b/tests/spec/glsl-es-1.00/compiler/storage-qualifiers/static-write-varying-01.frag
new file mode 100644
index 00000000..c2f320ce
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/storage-qualifiers/static-write-varying-01.frag
@@ -0,0 +1,14 @@
+// [config]
+// expect_result: fail
+// glsl_version: 1.20
+// glsles_version: 1.00
+// [end config]
+//
+// From section 4.3.6 of the GLSL 1.20 spec:
+// A fragment shader can not write to a varying variable.
+
+varying float x;
+
+void g() {
+ x = 0.0;
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/storage-qualifiers/static-write-varying-02.frag b/tests/spec/glsl-es-1.00/compiler/storage-qualifiers/static-write-varying-02.frag
new file mode 100644
index 00000000..1907ba04
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/storage-qualifiers/static-write-varying-02.frag
@@ -0,0 +1,19 @@
+// [config]
+// expect_result: fail
+// glsl_version: 1.20
+// glsles_version: 1.00
+// [end config]
+//
+// From section 4.3.6 of the GLSL 1.20 spec:
+// A fragment shader can not write to a varying variable.
+
+
+varying float x;
+
+void f(out float y) {
+ y = 0.0;
+}
+
+void g() {
+ f(x);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-add.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-add.vert
new file mode 100644
index 00000000..0ed5a818
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-add.vert
@@ -0,0 +1,26 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In total, only the following operators are allowed to operate on
+ * arrays and structures as whole entities:
+ *
+ * field or method selector .
+ * equality == !=
+ * assignment =
+ * indexing (arrays only) []"
+ */
+
+
+uniform vec4 a[2];
+uniform vec4 b[2];
+
+void main()
+{
+ vec4 c[2] = a + b;
+ gl_Position = c[0];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bool-float.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bool-float.vert
new file mode 100644
index 00000000..06a298e0
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bool-float.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform bool a[2];
+
+void main()
+{
+ float b[2];
+ b = a;
+ gl_Position = vec4(b[0], b[0], b[1], b[1]);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bool-int.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bool-int.vert
new file mode 100644
index 00000000..be1d8beb
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bool-int.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform bool a[2];
+
+void main()
+{
+ int b[2];
+ b = a;
+ gl_Position = vec4(b[0], b[0], b[1], b[1]);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec2-ivec2.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec2-ivec2.vert
new file mode 100644
index 00000000..cda2e5d9
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec2-ivec2.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform bvec2 a[2];
+
+void main()
+{
+ ivec2 b[2];
+ b = a;
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec2-vec2.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec2-vec2.vert
new file mode 100644
index 00000000..97ad3887
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec2-vec2.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform bvec2 a[2];
+
+void main()
+{
+ vec2 b[2];
+ b = a;
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec3-ivec3.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec3-ivec3.vert
new file mode 100644
index 00000000..f192fbf3
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec3-ivec3.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform bvec3 a[2];
+
+void main()
+{
+ ivec3 b[2];
+ b = a;
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec3-vec3.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec3-vec3.vert
new file mode 100644
index 00000000..26ea54ae
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec3-vec3.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform bvec3 a[2];
+
+void main()
+{
+ vec3 b[2];
+ b = a;
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec4-ivec4.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec4-ivec4.vert
new file mode 100644
index 00000000..c3e2a29e
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec4-ivec4.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform bvec4 a[2];
+
+void main()
+{
+ ivec4 b[2];
+ b = a;
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec4-vec4.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec4-vec4.vert
new file mode 100644
index 00000000..35e891be
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-bvec4-vec4.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform bvec4 a[2];
+
+void main()
+{
+ vec4 b[2];
+ b = a;
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-float-bool.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-float-bool.vert
new file mode 100644
index 00000000..028c8458
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-float-bool.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform float a[2];
+
+void main()
+{
+ bool b[2];
+ b = a;
+ gl_Position = vec4(b[0], b[0], b[1], b[1]);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-float-int.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-float-int.vert
new file mode 100644
index 00000000..7a00b1a6
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-float-int.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform float a[2];
+
+void main()
+{
+ int b[2];
+ b = a;
+ gl_Position = vec4(b[0], b[0], b[1], b[1]);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-int-bool.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-int-bool.vert
new file mode 100644
index 00000000..5bbe87eb
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-int-bool.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform int a[2];
+
+void main()
+{
+ bool b[2];
+ b = a;
+ gl_Position = vec4(b[0], b[0], b[1], b[1]);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-int-float.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-int-float.vert
new file mode 100644
index 00000000..dfc4846e
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-int-float.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform int a[2];
+
+void main()
+{
+ float b[2];
+ b = a;
+ gl_Position = vec4(b[0], b[0], b[1], b[1]);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec2-bvec2.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec2-bvec2.vert
new file mode 100644
index 00000000..5483a5c6
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec2-bvec2.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform ivec2 a[2];
+
+void main()
+{
+ bvec2 b[2];
+ b = a;
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec2-vec2.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec2-vec2.vert
new file mode 100644
index 00000000..93aaf4fc
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec2-vec2.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform ivec2 a[2];
+
+void main()
+{
+ vec2 b[2];
+ b = a;
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec3-bvec3.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec3-bvec3.vert
new file mode 100644
index 00000000..a2816323
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec3-bvec3.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform ivec3 a[2];
+
+void main()
+{
+ bvec3 b[2];
+ b = a;
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec3-vec3.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec3-vec3.vert
new file mode 100644
index 00000000..7dfbcf94
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec3-vec3.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform ivec3 a[2];
+
+void main()
+{
+ vec3 b[2];
+ b = a;
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec4-bvec4.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec4-bvec4.vert
new file mode 100644
index 00000000..d5320891
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec4-bvec4.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform ivec4 a[2];
+
+void main()
+{
+ bvec4 b[2];
+ b = a;
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec4-vec4.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec4-vec4.vert
new file mode 100644
index 00000000..e05cefbf
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-ivec4-vec4.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform ivec4 a[2];
+
+void main()
+{
+ vec4 b[2];
+ b = a;
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec2-bvec2.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec2-bvec2.vert
new file mode 100644
index 00000000..4123c104
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec2-bvec2.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform vec2 a[2];
+
+void main()
+{
+ bvec2 b[2];
+ b = a;
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec2-ivec2.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec2-ivec2.vert
new file mode 100644
index 00000000..b8e00e14
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec2-ivec2.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform vec2 a[2];
+
+void main()
+{
+ ivec2 b[2];
+ b = a;
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec3-bvec3.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec3-bvec3.vert
new file mode 100644
index 00000000..f4743515
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec3-bvec3.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform vec3 a[2];
+
+void main()
+{
+ bvec3 b[2];
+ b = a;
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec3-ivec3.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec3-ivec3.vert
new file mode 100644
index 00000000..34763c18
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec3-ivec3.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform vec3 a[2];
+
+void main()
+{
+ ivec3 b[2];
+ b = a;
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec4-bvec4.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec4-bvec4.vert
new file mode 100644
index 00000000..9f2248ac
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec4-bvec4.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform vec4 a[2];
+
+void main()
+{
+ bvec4 b[2];
+ b = a;
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec4-ivec4.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec4-ivec4.vert
new file mode 100644
index 00000000..5fb50015
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-conversion-vec4-ivec4.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float."
+ */
+
+
+uniform vec4 a[2];
+
+void main()
+{
+ ivec4 b[2];
+ b = a;
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-size.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-size.vert
new file mode 100644
index 00000000..b0f96886
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign-implicit-size.vert
@@ -0,0 +1,23 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "However, implicitly sized arrays cannot be assigned to. Note, this is
+ * a rare case that initializers and assignments appear to have different
+ * semantics."
+ */
+
+
+uniform float a[5];
+
+void main()
+{
+ float b[];
+ b = a;
+
+ gl_Position = vec4(0);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign.vert
new file mode 100644
index 00000000..ea43f565
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-assign.vert
@@ -0,0 +1,30 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In total, only the following operators are allowed to operate on
+ * arrays and structures as whole entities:
+ *
+ * field or method selector .
+ * equality == !=
+ * assignment =
+ * indexing (arrays only) []"
+ */
+
+
+void main()
+{
+ vec4 a[2];
+ vec4 b[2];
+ vec4 c[2];
+
+ a = vec4[2](vec4(0.0), vec4(2.0));
+ b = vec4[ ](vec4(0.5), vec4(2.0));
+ c = a;
+
+ gl_Position = a[0] + b[0] + c[1];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-attribute.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-attribute.vert
new file mode 100644
index 00000000..9e5adcd8
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-attribute.vert
@@ -0,0 +1,19 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 23 (page 29 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "Attribute variables cannot be declared as arrays or structures."
+ */
+
+
+attribute vec4 a[2]
+uniform int i;
+
+void main()
+{
+ gl_Position = a[i];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-constant-index-implicit-size.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-constant-index-implicit-size.vert
new file mode 100644
index 00000000..cb059a8d
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-constant-index-implicit-size.vert
@@ -0,0 +1,22 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an array is indexed with an expression that is not an integral
+ * constant expression, or if an array is passed as an argument to a
+ * function, then its size must be declared before any such use."
+ */
+
+
+/* Assume the array is sized in a different compilation unit.
+ */
+vec4 [] an_array;
+
+void main()
+{
+ gl_Position = an_array[2];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-constant-index-negative.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-constant-index-negative.vert
new file mode 100644
index 00000000..57adef39
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-constant-index-negative.vert
@@ -0,0 +1,19 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "It is also illegal to index an array with a negative constant
+ * expression."
+ */
+
+
+uniform vec4 [6] an_array;
+
+void main()
+{
+ gl_Position = an_array[-1];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-constant-index-too-large.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-constant-index-too-large.vert
new file mode 100644
index 00000000..edd6dd02
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-constant-index-too-large.vert
@@ -0,0 +1,20 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "It is illegal to declare an array with a size, and then later (in the
+ * same shader) index the same array with an integral constant expression
+ * greater than or equal to the declared size."
+ */
+
+
+uniform vec4 [6] an_array;
+
+void main()
+{
+ gl_Position = an_array[6];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bool-float.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bool-float.vert
new file mode 100644
index 00000000..b9897b04
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bool-float.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform bool a[2];
+
+void main()
+{
+ float b[2] = float[](a[0], a[1]);
+
+ gl_Position = vec4(b[0]);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bool-int.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bool-int.vert
new file mode 100644
index 00000000..6756e5df
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bool-int.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform bool a[2];
+
+void main()
+{
+ int b[2] = int[](a[0], a[1]);
+
+ gl_Position = vec4(b[0]);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec2-ivec2.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec2-ivec2.vert
new file mode 100644
index 00000000..e6acb50a
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec2-ivec2.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform bvec2 a[2];
+
+void main()
+{
+ ivec2 b[2] = ivec2[](a[0], a[1]);
+
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec2-vec2.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec2-vec2.vert
new file mode 100644
index 00000000..8c7547af
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec2-vec2.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform bvec2 a[2];
+
+void main()
+{
+ vec2 b[2] = vec2[](a[0], a[1]);
+
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec3-ivec3.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec3-ivec3.vert
new file mode 100644
index 00000000..c35b80ca
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec3-ivec3.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform bvec3 a[2];
+
+void main()
+{
+ ivec3 b[2] = ivec3[](a[0], a[1]);
+
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec3-vec3.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec3-vec3.vert
new file mode 100644
index 00000000..f30cda7f
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec3-vec3.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform bvec3 a[2];
+
+void main()
+{
+ vec3 b[2] = vec3[](a[0], a[1]);
+
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec4-ivec4.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec4-ivec4.vert
new file mode 100644
index 00000000..dca751bd
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec4-ivec4.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform bvec4 a[2];
+
+void main()
+{
+ ivec4 b[2] = ivec4[](a[0], a[1]);
+
+ gl_Position = vec4(b[0]);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec4-vec4.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec4-vec4.vert
new file mode 100644
index 00000000..d518d646
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-bvec4-vec4.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform bvec4 a[2];
+
+void main()
+{
+ vec4 b[2] = vec4[](a[0], a[1]);
+
+ gl_Position = b[0];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-float-bool.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-float-bool.vert
new file mode 100644
index 00000000..908b60ea
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-float-bool.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform float a[2];
+
+void main()
+{
+ bool b[2] = bool[](a[0], a[0]);
+
+ gl_Position = vec4(b[0], b[0], b[1], b[1]);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-float-int.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-float-int.vert
new file mode 100644
index 00000000..b1930b28
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-float-int.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform float a[2];
+
+void main()
+{
+ int b[2] = int[](a[0], a[0]);
+
+ gl_Position = vec4(b[0], b[0], b[1], b[1]);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-int-bool.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-int-bool.vert
new file mode 100644
index 00000000..1431ea07
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-int-bool.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform int a[2];
+
+void main()
+{
+ bool b[2] = bool[](a[0], a[1]);
+
+ gl_Position = vec4(b[0]);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-int-float.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-int-float.vert
new file mode 100644
index 00000000..be076126
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-int-float.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform int a[2];
+
+void main()
+{
+ float b[2] = float[](a[0], a[1]);
+
+ gl_Position = vec4(b[0]);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec2-bvec2.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec2-bvec2.vert
new file mode 100644
index 00000000..cdb1b7be
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec2-bvec2.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform ivec2 a[2];
+
+void main()
+{
+ bvec2 b[2] = bvec2[](a[0], a[1]);
+
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec2-vec2.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec2-vec2.vert
new file mode 100644
index 00000000..027577f3
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec2-vec2.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform ivec2 a[2];
+
+void main()
+{
+ vec2 b[2] = vec2[](a[0], a[1]);
+
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec3-bvec3.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec3-bvec3.vert
new file mode 100644
index 00000000..20fc85b6
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec3-bvec3.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform ivec3 a[2];
+
+void main()
+{
+ bvec3 b[2] = bvec3[](a[0], a[1]);
+
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec3-vec3.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec3-vec3.vert
new file mode 100644
index 00000000..0653d3c2
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec3-vec3.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform ivec3 a[2];
+
+void main()
+{
+ vec3 b[2] = vec3[](a[0], a[1]);
+
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec4-bvec4.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec4-bvec4.vert
new file mode 100644
index 00000000..81a012ef
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec4-bvec4.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform ivec4 a[2];
+
+void main()
+{
+ bvec4 b[2] = bvec4[](a[0], a[1]);
+
+ gl_Position = vec4(b[0]);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec4-vec4.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec4-vec4.vert
new file mode 100644
index 00000000..a61446e2
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-ivec4-vec4.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform ivec4 a[2];
+
+void main()
+{
+ vec4 b[2] = vec4[](a[0], a[1]);
+
+ gl_Position = b[0];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec2-bvec2.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec2-bvec2.vert
new file mode 100644
index 00000000..374b80bd
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec2-bvec2.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform vec2 a[2];
+
+void main()
+{
+ bvec2 b[2] = bvec2[](a[0], a[0]);
+
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec2-ivec2.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec2-ivec2.vert
new file mode 100644
index 00000000..9d102d7a
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec2-ivec2.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform vec2 a[2];
+
+void main()
+{
+ ivec2 b[2] = ivec2[](a[0], a[0]);
+
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec3-bvec3.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec3-bvec3.vert
new file mode 100644
index 00000000..991471d6
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec3-bvec3.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform vec3 a[2];
+
+void main()
+{
+ bvec3 b[2] = bvec3[](a[0], a[0]);
+
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec3-ivec3.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec3-ivec3.vert
new file mode 100644
index 00000000..2a62ea71
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec3-ivec3.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform vec3 a[2];
+
+void main()
+{
+ ivec3 b[2] = ivec3[](a[0], a[0]);
+
+ gl_Position = vec4(b[0].x, b[0].y, b[1].x, b[1].y);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec4-bvec4.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec4-bvec4.vert
new file mode 100644
index 00000000..90efda56
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec4-bvec4.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform vec4 a[2];
+
+void main()
+{
+ bvec4 b[2] = bvec4[](a[0], a[0]);
+
+ gl_Position = vec4(b[0].x, b[0].y, b[0].z, b[0].w);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec4-ivec4.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec4-ivec4.vert
new file mode 100644
index 00000000..513f9022
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-implicit-conversion-vec4-ivec4.vert
@@ -0,0 +1,37 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4
+ *
+ * There are no implicit array or structure conversions. For example, an
+ * array of int cannot be implicitly converted to an array of float. When
+ * an implicit conversion is done, it is not just a re-interpretation of
+ * the expression's value, but a conversion of that value to an equivalent
+ * value in the new type. For example, the integer value 5 will be
+ * converted to the floating-point value 5.0. The conversions in the
+ * table above are done only as indicated by other sections of this
+ * specification."
+ */
+
+
+uniform vec4 a[2];
+
+void main()
+{
+ ivec4 b[2] = ivec4[](a[0], a[0]);
+
+ gl_Position = vec4(b[0].x, b[0].y, b[0].z, b[0].w);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-mismatched-size.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-mismatched-size.vert
new file mode 100644
index 00000000..fd78eed7
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor-mismatched-size.vert
@@ -0,0 +1,16 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 33 (page 39 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "There must be exactly the same number of arguments as the size of the
+ * array being constructed."
+ */
+
+
+vec4 a[] = vec4[2](vec4(0.0), vec4(1.0), vec4(2.0));
+
+void main() { gl_Position = a[0]; }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor.vert
new file mode 100644
index 00000000..ec0ff82a
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-ctor.vert
@@ -0,0 +1,17 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "Arrays can have initializers formed from array constructors:"
+ */
+
+
+vec4 a[2] = vec4[2](vec4(0.0), vec4(2.0));
+vec4 b[2] = vec4[ ](vec4(0.5), vec4(2.0));
+vec4 c[ ] = vec4[ ](vec4(1.0), vec4(2.0));
+
+void main() { gl_Position = a[0] + b[0] + c[0]; }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-divide.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-divide.vert
new file mode 100644
index 00000000..14144c46
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-divide.vert
@@ -0,0 +1,26 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In total, only the following operators are allowed to operate on
+ * arrays and structures as whole entities:
+ *
+ * field or method selector .
+ * equality == !=
+ * assignment =
+ * indexing (arrays only) []"
+ */
+
+
+uniform vec4 a[2];
+uniform vec4 b[2];
+
+void main()
+{
+ vec4 c[2] = a / b;
+ gl_Position = c[0];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal-implicit-size.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal-implicit-size.vert
new file mode 100644
index 00000000..39b32e62
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal-implicit-size.vert
@@ -0,0 +1,28 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "The equality operators and assignment operator are only allowed if the
+ * two operands are same size and type....Both array operands must be
+ * explicitly sized. When using the equality operators ... two arrays are
+ * equal if and only if all the elements are element-wise equal.
+ */
+
+
+uniform vec4 a[2];
+uniform vec4 b[2];
+
+void main()
+{
+ vec4 c[];
+
+ // Implicitly size c to match a and b.
+ c[0] = b[0];
+ c[1] = b[1];
+
+ gl_Position = vec4(a == c);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal-matrix.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal-matrix.vert
new file mode 100644
index 00000000..d1076632
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal-matrix.vert
@@ -0,0 +1,22 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "The equality operators and assignment operator are only allowed if the
+ * two operands are same size and type....Both array operands must be
+ * explicitly sized. When using the equality operators ... two arrays are
+ * equal if and only if all the elements are element-wise equal.
+ */
+
+
+uniform vec4 a[4];
+uniform mat4 b;
+
+void main()
+{
+ gl_Position = vec4(a == b);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal-mismatched-base-type.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal-mismatched-base-type.vert
new file mode 100644
index 00000000..214dcfa5
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal-mismatched-base-type.vert
@@ -0,0 +1,22 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "The equality operators and assignment operator are only allowed if the
+ * two operands are same size and type....Both array operands must be
+ * explicitly sized. When using the equality operators ... two arrays are
+ * equal if and only if all the elements are element-wise equal.
+ */
+
+
+uniform vec4 a[2];
+uniform vec3 b[2]; // Note the differing base type
+
+void main()
+{
+ gl_Position = vec4(a == b);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal-mismatched-size.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal-mismatched-size.vert
new file mode 100644
index 00000000..025de07c
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal-mismatched-size.vert
@@ -0,0 +1,22 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "The equality operators and assignment operator are only allowed if the
+ * two operands are same size and type....Both array operands must be
+ * explicitly sized. When using the equality operators ... two arrays are
+ * equal if and only if all the elements are element-wise equal.
+ */
+
+
+uniform vec4 a[2];
+uniform vec4 b[3]; // Note the differing size
+
+void main()
+{
+ gl_Position = vec4(a == b);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal-vector.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal-vector.vert
new file mode 100644
index 00000000..a9808810
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal-vector.vert
@@ -0,0 +1,22 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "The equality operators and assignment operator are only allowed if the
+ * two operands are same size and type....Both array operands must be
+ * explicitly sized. When using the equality operators ... two arrays are
+ * equal if and only if all the elements are element-wise equal.
+ */
+
+
+uniform float a[4];
+uniform vec4 b;
+
+void main()
+{
+ gl_Position = vec4(a == b);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal.vert
new file mode 100644
index 00000000..a6ee2822
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-equal.vert
@@ -0,0 +1,22 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "The equality operators and assignment operator are only allowed if the
+ * two operands are same size and type....Both array operands must be
+ * explicitly sized. When using the equality operators ... two arrays are
+ * equal if and only if all the elements are element-wise equal.
+ */
+
+
+uniform vec4 a[2];
+uniform vec4 b[2];
+
+void main()
+{
+ gl_Position = vec4(a == b);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-function-parameter-implicit-size.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-function-parameter-implicit-size.vert
new file mode 100644
index 00000000..e9a065e2
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-function-parameter-implicit-size.vert
@@ -0,0 +1,29 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an array is indexed with an expression that is not an integral
+ * constant expression, or if an array is passed as an argument to a
+ * function, then its size must be declared before any such use."
+ */
+
+
+float a_function(vec4[6]);
+
+void main()
+{
+ vec4 [] an_array;
+
+ an_array[0] = vec4(0);
+ an_array[1] = vec4(1);
+ an_array[2] = vec4(2);
+ an_array[3] = vec4(3);
+ an_array[4] = vec4(4);
+ an_array[5] = vec4(5);
+
+ gl_Position = vec4(a_function(an_array));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-function-parameter-unsized.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-function-parameter-unsized.vert
new file mode 100644
index 00000000..b8135ca7
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-function-parameter-unsized.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "Arrays declared as formal parameters in a function declaration
+ * must specify a size."
+ */
+
+
+vec4 a_function(vec4 [] p);
+
+uniform vec4 [6] an_array;
+
+void main()
+{
+ gl_Position = a_function(an_array);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-function-return-unsized.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-function-return-unsized.vert
new file mode 100644
index 00000000..9acba275
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-function-return-unsized.vert
@@ -0,0 +1,31 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "This type can be used anywhere any other type can be used, including
+ * as the return value from a function
+ *
+ * float[5] foo() { }
+ *
+ * as a constructor of an array
+ *
+ * float[5](3.4, 4.2, 5.0, 5.2, 1.1)
+ *
+ * as an unnamed parameter
+ *
+ * void foo(float[5])"
+ */
+
+
+vec4[] a_function(vec4 [6] p);
+
+uniform vec4 [6] an_array;
+
+void main()
+{
+ gl_Position = a_function(an_array)[0];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-function-return.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-function-return.vert
new file mode 100644
index 00000000..cc58f9fb
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-function-return.vert
@@ -0,0 +1,31 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "This type can be used anywhere any other type can be used, including
+ * as the return value from a function
+ *
+ * float[5] foo() { }
+ *
+ * as a constructor of an array
+ *
+ * float[5](3.4, 4.2, 5.0, 5.2, 1.1)
+ *
+ * as an unnamed parameter
+ *
+ * void foo(float[5])"
+ */
+
+
+vec4[2] a_function(vec4 [6]);
+
+uniform vec4 [6] an_array;
+
+void main()
+{
+ gl_Position = a_function(an_array)[0];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-greater-equal.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-greater-equal.vert
new file mode 100644
index 00000000..464208cc
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-greater-equal.vert
@@ -0,0 +1,25 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In total, only the following operators are allowed to operate on
+ * arrays and structures as whole entities:
+ *
+ * field or method selector .
+ * equality == !=
+ * assignment =
+ * indexing (arrays only) []"
+ */
+
+
+uniform vec4 a[2];
+uniform vec4 b[2];
+
+void main()
+{
+ gl_Position = vec4(a >= b);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-greater.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-greater.vert
new file mode 100644
index 00000000..fbc3019d
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-greater.vert
@@ -0,0 +1,25 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In total, only the following operators are allowed to operate on
+ * arrays and structures as whole entities:
+ *
+ * field or method selector .
+ * equality == !=
+ * assignment =
+ * indexing (arrays only) []"
+ */
+
+
+uniform vec4 a[2];
+uniform vec4 b[2];
+
+void main()
+{
+ gl_Position = vec4(a > b);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-length-implicit-size.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-length-implicit-size.vert
new file mode 100644
index 00000000..b5bafa75
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-length-implicit-size.vert
@@ -0,0 +1,21 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "The length method cannot be called on an array that has not been
+ * explicitly sized."
+ */
+
+
+void main()
+{
+ float b[];
+
+ b[2] = 1.0; // Implicitly size array to have at least 3 elements
+
+ gl_Position = vec4(b.length());
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-length-with-argument.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-length-with-argument.vert
new file mode 100644
index 00000000..2096ae5c
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-length-with-argument.vert
@@ -0,0 +1,14 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ */
+
+
+uniform vec4 a[2];
+
+void main()
+{
+ gl_Position = vec4(a.length(5));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-length.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-length.vert
new file mode 100644
index 00000000..3399b199
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-length.vert
@@ -0,0 +1,24 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "Arrays know the number of elements they contain. This can be obtained
+ * by using the length method:
+ *
+ * a.length(); // returns 5 for the above declarations
+ *
+ * The length method cannot be called on an array that has not been
+ * explicitly sized."
+ */
+
+
+uniform vec4 a[2];
+
+void main()
+{
+ gl_Position = vec4(a.length());
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-less-equal.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-less-equal.vert
new file mode 100644
index 00000000..803d539f
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-less-equal.vert
@@ -0,0 +1,25 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In total, only the following operators are allowed to operate on
+ * arrays and structures as whole entities:
+ *
+ * field or method selector .
+ * equality == !=
+ * assignment =
+ * indexing (arrays only) []"
+ */
+
+
+uniform vec4 a[2];
+uniform vec4 b[2];
+
+void main()
+{
+ gl_Position = vec4(a <= b);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-less.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-less.vert
new file mode 100644
index 00000000..2f54c746
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-less.vert
@@ -0,0 +1,25 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In total, only the following operators are allowed to operate on
+ * arrays and structures as whole entities:
+ *
+ * field or method selector .
+ * equality == !=
+ * assignment =
+ * indexing (arrays only) []"
+ */
+
+
+uniform vec4 a[2];
+uniform vec4 b[2];
+
+void main()
+{
+ gl_Position = vec4(a < b);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-logical-and.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-logical-and.vert
new file mode 100644
index 00000000..f14211a9
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-logical-and.vert
@@ -0,0 +1,25 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In total, only the following operators are allowed to operate on
+ * arrays and structures as whole entities:
+ *
+ * field or method selector .
+ * equality == !=
+ * assignment =
+ * indexing (arrays only) []"
+ */
+
+
+uniform vec4 a[2];
+uniform vec4 b[2];
+
+void main()
+{
+ gl_Position = vec4(a && b);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-logical-not.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-logical-not.vert
new file mode 100644
index 00000000..85800965
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-logical-not.vert
@@ -0,0 +1,25 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In total, only the following operators are allowed to operate on
+ * arrays and structures as whole entities:
+ *
+ * field or method selector .
+ * equality == !=
+ * assignment =
+ * indexing (arrays only) []"
+ */
+
+
+uniform vec4 a[2];
+uniform vec4 b[2];
+
+void main()
+{
+ gl_Position = vec4(!a);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-logical-or.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-logical-or.vert
new file mode 100644
index 00000000..fd22520a
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-logical-or.vert
@@ -0,0 +1,25 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In total, only the following operators are allowed to operate on
+ * arrays and structures as whole entities:
+ *
+ * field or method selector .
+ * equality == !=
+ * assignment =
+ * indexing (arrays only) []"
+ */
+
+
+uniform vec4 a[2];
+uniform vec4 b[2];
+
+void main()
+{
+ gl_Position = vec4(a || b);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-logical-xor.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-logical-xor.vert
new file mode 100644
index 00000000..64ebe544
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-logical-xor.vert
@@ -0,0 +1,25 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In total, only the following operators are allowed to operate on
+ * arrays and structures as whole entities:
+ *
+ * field or method selector .
+ * equality == !=
+ * assignment =
+ * indexing (arrays only) []"
+ */
+
+
+uniform vec4 a[2];
+uniform vec4 b[2];
+
+void main()
+{
+ gl_Position = vec4(a ^^ b);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-multidimensional-new-syntax.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-multidimensional-new-syntax.vert
new file mode 100644
index 00000000..7e113883
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-multidimensional-new-syntax.vert
@@ -0,0 +1,18 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "Only one-dimensional arrays may be declared."
+ */
+
+
+uniform vec4 [1] an_array[1];
+
+void main()
+{
+ gl_Position = an_array[0][0];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-multidimensional.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-multidimensional.vert
new file mode 100644
index 00000000..984d29c9
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-multidimensional.vert
@@ -0,0 +1,18 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "Only one-dimensional arrays may be declared."
+ */
+
+
+uniform vec4 an_array[1][1];
+
+void main()
+{
+ gl_Position = an_array[0][0];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-multiply.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-multiply.vert
new file mode 100644
index 00000000..1c33f777
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-multiply.vert
@@ -0,0 +1,26 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In total, only the following operators are allowed to operate on
+ * arrays and structures as whole entities:
+ *
+ * field or method selector .
+ * equality == !=
+ * assignment =
+ * indexing (arrays only) []"
+ */
+
+
+uniform vec4 a[2];
+uniform vec4 b[2];
+
+void main()
+{
+ vec4 c[2] = a * b;
+ gl_Position = c[0];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-negate.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-negate.vert
new file mode 100644
index 00000000..567b3d35
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-negate.vert
@@ -0,0 +1,25 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In total, only the following operators are allowed to operate on
+ * arrays and structures as whole entities:
+ *
+ * field or method selector .
+ * equality == !=
+ * assignment =
+ * indexing (arrays only) []"
+ */
+
+
+uniform vec4 a[2];
+uniform vec4 b[2];
+
+void main()
+{
+ gl_Position = vec4(-a == b);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal-implicit-size.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal-implicit-size.vert
new file mode 100644
index 00000000..4f522e36
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal-implicit-size.vert
@@ -0,0 +1,28 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "The equality operators and assignment operator are only allowed if the
+ * two operands are same size and type....Both array operands must be
+ * explicitly sized. When using the equality operators ... two arrays are
+ * equal if and only if all the elements are element-wise equal.
+ */
+
+
+uniform vec4 a[2];
+uniform vec4 b[2];
+
+void main()
+{
+ vec4 c[];
+
+ // Implicitly size c to match a and b.
+ c[0] = b[0];
+ c[1] = b[2];
+
+ gl_Position = vec4(a != c);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal-matrix.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal-matrix.vert
new file mode 100644
index 00000000..88bda2ae
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal-matrix.vert
@@ -0,0 +1,22 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "The equality operators and assignment operator are only allowed if the
+ * two operands are same size and type....Both array operands must be
+ * explicitly sized. When using the equality operators ... two arrays are
+ * equal if and only if all the elements are element-wise equal.
+ */
+
+
+uniform vec4 a[4];
+uniform mat4 b;
+
+void main()
+{
+ gl_Position = vec4(a != b);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal-mismatched-base-type.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal-mismatched-base-type.vert
new file mode 100644
index 00000000..fb771112
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal-mismatched-base-type.vert
@@ -0,0 +1,22 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "The equality operators and assignment operator are only allowed if the
+ * two operands are same size and type....Both array operands must be
+ * explicitly sized. When using the equality operators ... two arrays are
+ * equal if and only if all the elements are element-wise equal.
+ */
+
+
+uniform vec4 a[2];
+uniform vec3 b[2]; // Note the differing base type
+
+void main()
+{
+ gl_Position = vec4(a != b);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal-mismatched-size.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal-mismatched-size.vert
new file mode 100644
index 00000000..b709902e
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal-mismatched-size.vert
@@ -0,0 +1,22 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "The equality operators and assignment operator are only allowed if the
+ * two operands are same size and type....Both array operands must be
+ * explicitly sized. When using the equality operators ... two arrays are
+ * equal if and only if all the elements are element-wise equal.
+ */
+
+
+uniform vec4 a[2];
+uniform vec4 b[3]; // Note the differing size
+
+void main()
+{
+ gl_Position = vec4(a != b);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal-vertor.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal-vertor.vert
new file mode 100644
index 00000000..e7a3f07f
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal-vertor.vert
@@ -0,0 +1,22 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "The equality operators and assignment operator are only allowed if the
+ * two operands are same size and type....Both array operands must be
+ * explicitly sized. When using the equality operators ... two arrays are
+ * equal if and only if all the elements are element-wise equal.
+ */
+
+
+uniform float a[4];
+uniform vec4 b;
+
+void main()
+{
+ gl_Position = vec4(a != b);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal.vert
new file mode 100644
index 00000000..2e57da5e
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-not-equal.vert
@@ -0,0 +1,22 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "The equality operators and assignment operator are only allowed if the
+ * two operands are same size and type....Both array operands must be
+ * explicitly sized. When using the equality operators ... two arrays are
+ * equal if and only if all the elements are element-wise equal.
+ */
+
+
+uniform vec4 a[2];
+uniform vec4 b[2];
+
+void main()
+{
+ gl_Position = vec4(a != b);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-any-type.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-any-type.vert
new file mode 100644
index 00000000..4b16a87a
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-any-type.vert
@@ -0,0 +1,44 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "All basic types and structures can be formed into arrays."
+ */
+
+
+uniform float array01[1];
+uniform int array02[1];
+uniform bool array03[1];
+uniform vec2 array04[1];
+uniform vec3 array05[1];
+uniform vec4 array06[1];
+uniform ivec2 array07[1];
+uniform ivec3 array08[1];
+uniform ivec4 array09[1];
+uniform bvec2 array10[1];
+uniform bvec3 array11[1];
+uniform bvec4 array12[1];
+uniform mat2 array13[1];
+uniform mat2x2 array14[1];
+uniform mat2x3 array15[1];
+uniform mat2x4 array16[1];
+uniform mat3 array17[1];
+uniform mat3x2 array18[1];
+uniform mat3x3 array19[1];
+uniform mat3x4 array20[1];
+uniform mat4 array21[1];
+uniform mat4x2 array22[1];
+uniform mat4x3 array23[1];
+uniform mat4x4 array24[1];
+uniform sampler1D array25[1];
+uniform sampler2D array26[1];
+uniform sampler3D array27[1];
+uniform samplerCube array28[1];
+uniform sampler1DShadow array29[1];
+uniform sampler2DShadow array30[1];
+
+void main() { gl_Position = vec4(0.0); }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-function-parameter-declaration.frag b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-function-parameter-declaration.frag
new file mode 100644
index 00000000..b911f730
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-function-parameter-declaration.frag
@@ -0,0 +1,20 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "Only one-dimensional arrays may be declared."
+ */
+
+
+attribute vec4 vert;
+
+void foo(vec4 [2] x[2]);
+
+void main()
+{
+ gl_FragData[0] = vec4(0.0);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-function-parameter-declaration.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-function-parameter-declaration.vert
new file mode 100644
index 00000000..b32216cd
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-function-parameter-declaration.vert
@@ -0,0 +1,20 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "Only one-dimensional arrays may be declared."
+ */
+
+
+attribute vec4 vert;
+
+void foo(vec4 [2] x[2]);
+
+void main()
+{
+ gl_Position = vert;
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-function-parameter-definition.frag b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-function-parameter-definition.frag
new file mode 100644
index 00000000..cc07075b
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-function-parameter-definition.frag
@@ -0,0 +1,23 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "Only one-dimensional arrays may be declared."
+ */
+
+
+attribute vec4 vert;
+
+void foo(vec4 [2] x[2])
+{
+ gl_Position = vert;
+}
+
+void main()
+{
+ gl_FragData[0] = vec4(0.0);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-function-parameter-definition.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-function-parameter-definition.vert
new file mode 100644
index 00000000..6c12fda1
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-function-parameter-definition.vert
@@ -0,0 +1,23 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "Only one-dimensional arrays may be declared."
+ */
+
+
+attribute vec4 vert;
+
+void foo(vec4 [2] x[2])
+{
+ gl_Position = vert;
+}
+
+void main()
+{
+ gl_Position = vert;
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-structure-field.frag b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-structure-field.frag
new file mode 100644
index 00000000..6eb9aebc
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-structure-field.frag
@@ -0,0 +1,22 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "Only one-dimensional arrays may be declared."
+ */
+
+
+attribute vec4 vert;
+
+struct S {
+ vec4 [2] x[2];
+};
+
+void main()
+{
+ gl_FragData[0] = vec4(0.0);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-structure-field.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-structure-field.vert
new file mode 100644
index 00000000..9b884f50
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-array-structure-field.vert
@@ -0,0 +1,22 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "Only one-dimensional arrays may be declared."
+ */
+
+
+attribute vec4 vert;
+
+struct S {
+ vec4 [2] x[2];
+};
+
+void main()
+{
+ gl_Position = vert;
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-struct-of-array.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-struct-of-array.vert
new file mode 100644
index 00000000..1bf190d2
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-struct-of-array.vert
@@ -0,0 +1,28 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 18 (page 24 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "Member declarators can contain arrays. Such arrays must have a size
+ * specified, and the size must be an integral constant expression that's
+ * greater than zero (see Section 4.3.3 "Constant Expressions")."
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "All basic types and structures can be formed into arrays."
+ */
+
+
+struct s {
+ float x[3];
+ int y;
+};
+
+void main()
+{
+ s a[2];
+ gl_Position = vec4(a.length() + a.x.length());
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-struct.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-struct.vert
new file mode 100644
index 00000000..077f18cd
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-of-struct.vert
@@ -0,0 +1,22 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "All basic types and structures can be formed into arrays."
+ */
+
+
+struct s {
+ float x;
+ int y;
+};
+
+void main()
+{
+ s a[2];
+ gl_Position = vec4(a.length());
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-positive.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-positive.vert
new file mode 100644
index 00000000..b1ff7e4e
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-positive.vert
@@ -0,0 +1,25 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In total, only the following operators are allowed to operate on
+ * arrays and structures as whole entities:
+ *
+ * field or method selector .
+ * equality == !=
+ * assignment =
+ * indexing (arrays only) []"
+ */
+
+
+uniform vec4 a[2];
+uniform vec4 b[2];
+
+void main()
+{
+ gl_Position = vec4(+a == b);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-postdecrement.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-postdecrement.vert
new file mode 100644
index 00000000..37b9ac6f
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-postdecrement.vert
@@ -0,0 +1,24 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In total, only the following operators are allowed to operate on
+ * arrays and structures as whole entities:
+ *
+ * field or method selector .
+ * equality == !=
+ * assignment =
+ * indexing (arrays only) []"
+ */
+
+
+uniform vec4 a[2];
+
+void main()
+{
+ gl_Position = (a--)[0];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-postincrement.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-postincrement.vert
new file mode 100644
index 00000000..16d096ad
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-postincrement.vert
@@ -0,0 +1,24 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In total, only the following operators are allowed to operate on
+ * arrays and structures as whole entities:
+ *
+ * field or method selector .
+ * equality == !=
+ * assignment =
+ * indexing (arrays only) []"
+ */
+
+
+uniform vec4 a[2];
+
+void main()
+{
+ gl_Position = (a++)[0];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-predecrement.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-predecrement.vert
new file mode 100644
index 00000000..c9e221f4
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-predecrement.vert
@@ -0,0 +1,24 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In total, only the following operators are allowed to operate on
+ * arrays and structures as whole entities:
+ *
+ * field or method selector .
+ * equality == !=
+ * assignment =
+ * indexing (arrays only) []"
+ */
+
+
+uniform vec4 a[2];
+
+void main()
+{
+ gl_Position = (--a)[0];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-preincrement.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-preincrement.vert
new file mode 100644
index 00000000..dba841e1
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-preincrement.vert
@@ -0,0 +1,24 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In total, only the following operators are allowed to operate on
+ * arrays and structures as whole entities:
+ *
+ * field or method selector .
+ * equality == !=
+ * assignment =
+ * indexing (arrays only) []"
+ */
+
+
+uniform vec4 a[2];
+
+void main()
+{
+ gl_Position = (++a)[0];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-redeclaration-01.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-redeclaration-01.vert
new file mode 100644
index 00000000..1bc0ebff
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-redeclaration-01.vert
@@ -0,0 +1,31 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [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."
+ */
+
+
+float a_function(vec4[6]);
+
+void main()
+{
+ vec4 [] an_array;
+
+ an_array[0] = vec4(0);
+ an_array[1] = vec4(1);
+ an_array[2] = vec4(2);
+ an_array[3] = vec4(3);
+ an_array[4] = vec4(4);
+ an_array[5] = vec4(5);
+
+ vec4 [6] an_array;
+
+ gl_Position = vec4(a_function(an_array));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-redeclaration-initializer.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-redeclaration-initializer.vert
new file mode 100644
index 00000000..d0b86dcd
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-redeclaration-initializer.vert
@@ -0,0 +1,28 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [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."
+ */
+
+
+float a_function(float[3]);
+
+void main()
+{
+ float [] an_array;
+
+ an_array[0] = 0.0;
+ an_array[1] = 1.0;
+ an_array[2] = 2.0;
+
+ float [] an_array = float[](2.0, 1.0, 0.0);
+
+ gl_Position = vec4(a_function(an_array));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-redeclaration-too-small.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-redeclaration-too-small.vert
new file mode 100644
index 00000000..970a250c
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-redeclaration-too-small.vert
@@ -0,0 +1,28 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [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."
+ */
+
+
+float a_function(float[2]);
+
+void main()
+{
+ float [] an_array;
+
+ an_array[0] = 0.0;
+ an_array[1] = 1.0;
+ an_array[2] = 2.0;
+
+ float [2] an_array;
+
+ gl_Position = vec4(a_function(an_array));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-redeclaration-wrong-base-type.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-redeclaration-wrong-base-type.vert
new file mode 100644
index 00000000..2998e4d2
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-redeclaration-wrong-base-type.vert
@@ -0,0 +1,29 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [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."
+ */
+
+
+float a_function(float[3]);
+float a_function(vec4[3]);
+
+void main()
+{
+ float [] an_array;
+
+ an_array[0] = 0.0;
+ an_array[1] = 1.0;
+ an_array[2] = 2.0;
+
+ vec4 [3] an_array;
+
+ gl_Position = vec4(a_function(an_array));
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-selection.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-selection.vert
new file mode 100644
index 00000000..dc3fe359
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-selection.vert
@@ -0,0 +1,24 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 38 (page 44 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "The ternary selection operator (?:). It operates on three expressions
+ * (exp1 ? exp2 : exp3)....The second and third expressions can be any
+ * type, as long their types match....This resulting matching type is
+ * the type of the entire expression."
+ */
+
+
+uniform vec4 a[2];
+uniform vec4 b[2];
+uniform int i;
+uniform bool pick_from_a_or_b;
+
+void main()
+{
+ gl_Position = (pick_from_a_or_b ? a : b)[i];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-sequence.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-sequence.vert
new file mode 100644
index 00000000..bf6a96d5
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-sequence.vert
@@ -0,0 +1,25 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In total, only the following operators are allowed to operate on
+ * arrays and structures as whole entities:
+ *
+ * field or method selector .
+ * equality == !=
+ * assignment =
+ * indexing (arrays only) []"
+ */
+
+
+uniform vec4 a[2];
+uniform vec4 b[2];
+
+void main()
+{
+ gl_Position = (a, b)[0];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-shadow-redeclaration.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-shadow-redeclaration.vert
new file mode 100644
index 00000000..f691fd8d
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-shadow-redeclaration.vert
@@ -0,0 +1,29 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 21 (page 27 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "An implicitly sized array can be re-declared in the same scope
+ * as an array of the same base type."
+ */
+
+
+attribute vec4 v;
+
+void main()
+{
+ float a[];
+
+ a[3] = 1.2; // Implicitly size "a" to have 4 elements.
+
+ {
+ float a[4]; // this declaration shadows the previous
+ }
+
+ a.length(); // illegal - "a' is not explicitly sized
+
+ gl_Position = v;
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-bool.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-bool.vert
new file mode 100644
index 00000000..223ae49c
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-bool.vert
@@ -0,0 +1,17 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "When an array size is specified in a declaration, it must be an
+ * integral constant expression (see Section 4.3.3 "Constant Expressions")
+ * greater than zero."
+ */
+
+
+uniform float [true] a;
+
+void main() { gl_Position = vec4(a[0]); }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-bvec2.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-bvec2.vert
new file mode 100644
index 00000000..bff5c946
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-bvec2.vert
@@ -0,0 +1,17 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "When an array size is specified in a declaration, it must be an
+ * integral constant expression (see Section 4.3.3 "Constant Expressions")
+ * greater than zero."
+ */
+
+
+uniform float [bvec2(true, false)] a;
+
+void main() { gl_Position = vec4(a[0]); }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-bvec3.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-bvec3.vert
new file mode 100644
index 00000000..b17b2975
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-bvec3.vert
@@ -0,0 +1,17 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "When an array size is specified in a declaration, it must be an
+ * integral constant expression (see Section 4.3.3 "Constant Expressions")
+ * greater than zero."
+ */
+
+
+uniform float [bvec3(true, true, false)] a;
+
+void main() { gl_Position = vec4(a[0]); }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-bvec4.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-bvec4.vert
new file mode 100644
index 00000000..00d28447
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-bvec4.vert
@@ -0,0 +1,17 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "When an array size is specified in a declaration, it must be an
+ * integral constant expression (see Section 4.3.3 "Constant Expressions")
+ * greater than zero."
+ */
+
+
+uniform float [bvec4(true, true, false, false)] a;
+
+void main() { gl_Position = vec4(a[0]); }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-constant-cast.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-constant-cast.vert
new file mode 100644
index 00000000..8a9324a6
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-constant-cast.vert
@@ -0,0 +1,18 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "When an array size is specified in a declaration, it must be an
+ * integral constant expression (see Section 4.3.3 "Constant Expressions")
+ * greater than zero."
+ */
+
+
+const float size = 3.14159;
+uniform vec4 [int(size)] a;
+
+void main() { gl_Position = vec4(0.0); }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-constant-relational.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-constant-relational.vert
new file mode 100644
index 00000000..2fca80b8
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-constant-relational.vert
@@ -0,0 +1,162 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "When an array size is specified in a declaration, it must be an
+ * integral constant expression (see Section 4.3.3 "Constant Expressions")
+ * greater than zero."
+ */
+
+
+const vec4 v4_1 = vec4(1);
+const vec4 v4_0 = v4_1 - v4_1;
+const vec3 v3_1 = vec3(1);
+const vec3 v3_0 = v3_1 - v3_1;
+const vec2 v2_1 = vec2(1);
+const vec2 v2_0 = v2_1 - v2_1;
+
+const ivec4 iv4_1 = ivec4(1);
+const ivec4 iv4_0 = iv4_1 - iv4_1;
+const ivec3 iv3_1 = ivec3(1);
+const ivec3 iv3_0 = iv3_1 - iv3_1;
+const ivec2 iv2_1 = ivec2(1);
+const ivec2 iv2_0 = iv2_1 - iv2_1;
+
+const bvec4 bv4_1 = bvec4(true);
+const bvec4 bv4_0 = not(bv4_1);
+const bvec3 bv3_1 = bvec3(true);
+const bvec3 bv3_0 = not(bv3_1);
+const bvec2 bv2_1 = bvec2(true);
+const bvec2 bv2_0 = not(bv2_1);
+
+// All forms of lessThan.
+float [all( lessThan( v4_1, v4_0) ) ? -1 : 1] array01;
+float [all(not(lessThan( v4_1, v4_0))) ? 1 : -1] array02;
+float [any( lessThan( v4_1, v4_0) ) ? -1 : 1] array03;
+float [any(not(lessThan( v4_1, v4_0))) ? 1 : -1] array04;
+float [all( lessThan(iv4_1, iv4_0) ) ? -1 : 1] array05;
+float [all(not(lessThan(iv4_1, iv4_0))) ? 1 : -1] array06;
+float [any( lessThan(iv4_1, iv4_0) ) ? -1 : 1] array07;
+float [any(not(lessThan(iv4_1, iv4_0))) ? 1 : -1] array08;
+
+// All forms of lessThanEqual.
+float [all( lessThanEqual( v4_1, v4_0) ) ? -1 : 1] array11;
+float [all(not(lessThanEqual( v4_1, v4_0))) ? 1 : -1] array12;
+float [any( lessThanEqual( v4_1, v4_0) ) ? -1 : 1] array13;
+float [any(not(lessThanEqual( v4_1, v4_0))) ? 1 : -1] array14;
+float [all( lessThanEqual(iv4_1, iv4_0) ) ? -1 : 1] array15;
+float [all(not(lessThanEqual(iv4_1, iv4_0))) ? 1 : -1] array16;
+float [any( lessThanEqual(iv4_1, iv4_0) ) ? -1 : 1] array17;
+float [any(not(lessThanEqual(iv4_1, iv4_0))) ? 1 : -1] array18;
+
+// All forms of greaterThan.
+float [all( greaterThan( v4_1, v4_0) ) ? 1 : -1] array21;
+float [all(not(greaterThan( v4_1, v4_0))) ? -1 : 1] array22;
+float [any( greaterThan( v4_1, v4_0) ) ? 1 : -1] array23;
+float [any(not(greaterThan( v4_1, v4_0))) ? -1 : 1] array24;
+float [all( greaterThan(iv4_1, iv4_0) ) ? 1 : -1] array25;
+float [all(not(greaterThan(iv4_1, iv4_0))) ? -1 : 1] array26;
+float [any( greaterThan(iv4_1, iv4_0) ) ? 1 : -1] array27;
+float [any(not(greaterThan(iv4_1, iv4_0))) ? -1 : 1] array28;
+
+// All forms of greaterThanEqual.
+float [all( greaterThanEqual( v4_1, v4_0) ) ? 1 : -1] array31;
+float [all(not(greaterThanEqual( v4_1, v4_0))) ? -1 : 1] array32;
+float [any( greaterThanEqual( v4_1, v4_0) ) ? 1 : -1] array33;
+float [any(not(greaterThanEqual( v4_1, v4_0))) ? -1 : 1] array34;
+float [all( greaterThanEqual(iv4_1, iv4_0) ) ? 1 : -1] array35;
+float [all(not(greaterThanEqual(iv4_1, iv4_0))) ? -1 : 1] array36;
+float [any( greaterThanEqual(iv4_1, iv4_0) ) ? 1 : -1] array37;
+float [any(not(greaterThanEqual(iv4_1, iv4_0))) ? -1 : 1] array38;
+
+// All forms of equal.
+float [all( equal( v4_1, v4_0) ) ? -1 : 1] array41;
+float [all(not(equal( v4_1, v4_0))) ? 1 : -1] array42;
+float [any( equal( v4_1, v4_0) ) ? -1 : 1] array43;
+float [any(not(equal( v4_1, v4_0))) ? 1 : -1] array44;
+float [all( equal(iv4_1, iv4_0) ) ? -1 : 1] array45;
+float [all(not(equal(iv4_1, iv4_0))) ? 1 : -1] array46;
+float [any( equal(iv4_1, iv4_0) ) ? -1 : 1] array47;
+float [any(not(equal(iv4_1, iv4_0))) ? 1 : -1] array48;
+float [all( equal(bv4_1, bv4_0) ) ? -1 : 1] array49;
+float [all(not(equal(bv4_1, bv4_0))) ? 1 : -1] array4a;
+float [any( equal(bv4_1, bv4_0) ) ? -1 : 1] array4b;
+float [any(not(equal(bv4_1, bv4_0))) ? 1 : -1] array4c;
+
+// All forms of notEqual.
+float [all( notEqual( v4_1, v4_0) ) ? 1 : -1] array51;
+float [all(not(notEqual( v4_1, v4_0))) ? -1 : 1] array52;
+float [any( notEqual( v4_1, v4_0) ) ? 1 : -1] array53;
+float [any(not(notEqual( v4_1, v4_0))) ? -1 : 1] array54;
+float [all( notEqual(iv4_1, iv4_0) ) ? 1 : -1] array55;
+float [all(not(notEqual(iv4_1, iv4_0))) ? -1 : 1] array56;
+float [any( notEqual(iv4_1, iv4_0) ) ? 1 : -1] array57;
+float [any(not(notEqual(iv4_1, iv4_0))) ? -1 : 1] array58;
+float [all( notEqual(bv4_1, bv4_0) ) ? 1 : -1] array59;
+float [all(not(notEqual(bv4_1, bv4_0))) ? -1 : 1] array5a;
+float [any( notEqual(bv4_1, bv4_0) ) ? 1 : -1] array5b;
+float [any(not(notEqual(bv4_1, bv4_0))) ? -1 : 1] array5c;
+
+void main()
+{
+ gl_Position = vec4(array01.length()
+ + array02.length()
+ + array03.length()
+ + array04.length()
+ + array05.length()
+ + array06.length()
+ + array07.length()
+ + array08.length()
+ + array11.length()
+ + array12.length()
+ + array13.length()
+ + array14.length()
+ + array15.length()
+ + array16.length()
+ + array17.length()
+ + array18.length()
+ + array21.length()
+ + array22.length()
+ + array23.length()
+ + array24.length()
+ + array25.length()
+ + array26.length()
+ + array27.length()
+ + array28.length()
+ + array31.length()
+ + array32.length()
+ + array33.length()
+ + array34.length()
+ + array35.length()
+ + array36.length()
+ + array37.length()
+ + array38.length()
+ + array41.length()
+ + array42.length()
+ + array43.length()
+ + array44.length()
+ + array45.length()
+ + array46.length()
+ + array47.length()
+ + array48.length()
+ + array49.length()
+ + array4a.length()
+ + array4b.length()
+ + array4c.length()
+ + array51.length()
+ + array52.length()
+ + array53.length()
+ + array54.length()
+ + array55.length()
+ + array56.length()
+ + array57.length()
+ + array58.length()
+ + array59.length()
+ + array5a.length()
+ + array5b.length()
+ + array5c.length());
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-float.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-float.vert
new file mode 100644
index 00000000..94a121f2
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-float.vert
@@ -0,0 +1,17 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "When an array size is specified in a declaration, it must be an
+ * integral constant expression (see Section 4.3.3 "Constant Expressions")
+ * greater than zero."
+ */
+
+
+uniform float [2.3] a;
+
+void main() { gl_Position = vec4(a[0]); }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-int.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-int.vert
new file mode 100644
index 00000000..592c353d
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-int.vert
@@ -0,0 +1,17 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "When an array size is specified in a declaration, it must be an
+ * integral constant expression (see Section 4.3.3 "Constant Expressions")
+ * greater than zero."
+ */
+
+
+uniform float [int(2.3)] a;
+
+void main() { gl_Position = vec4(a[0]); }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-ivec2.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-ivec2.vert
new file mode 100644
index 00000000..d88e47d7
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-ivec2.vert
@@ -0,0 +1,17 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "When an array size is specified in a declaration, it must be an
+ * integral constant expression (see Section 4.3.3 "Constant Expressions")
+ * greater than zero."
+ */
+
+
+uniform float [ivec2(2.3,2.3)] a;
+
+void main() { gl_Position = vec4(a[0]); }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-ivec3.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-ivec3.vert
new file mode 100644
index 00000000..5bdaaf71
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-ivec3.vert
@@ -0,0 +1,17 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "When an array size is specified in a declaration, it must be an
+ * integral constant expression (see Section 4.3.3 "Constant Expressions")
+ * greater than zero."
+ */
+
+
+uniform float [ivec3(2.3,2.3,2.3)] a;
+
+void main() { gl_Position = vec4(a[0]); }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-ivec4.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-ivec4.vert
new file mode 100644
index 00000000..1a1a6ea9
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-ivec4.vert
@@ -0,0 +1,17 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "When an array size is specified in a declaration, it must be an
+ * integral constant expression (see Section 4.3.3 "Constant Expressions")
+ * greater than zero."
+ */
+
+
+uniform float [ivec4(2.3,2.3,2.3,2.3)] a;
+
+void main() { gl_Position = vec4(a[0]); }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-length.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-length.vert
new file mode 100644
index 00000000..f78465d8
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-length.vert
@@ -0,0 +1,18 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "When an array size is specified in a declaration, it must be an
+ * integral constant expression (see Section 4.3.3 "Constant Expressions")
+ * greater than zero."
+ */
+
+
+uniform vec4 [3] a;
+uniform vec4 [a.length()] b;
+
+void main() { gl_Position = vec4(0.0); }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-negative.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-negative.vert
new file mode 100644
index 00000000..bd17dacb
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-negative.vert
@@ -0,0 +1,17 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "When an array size is specified in a declaration, it must be an
+ * integral constant expression (see Section 4.3.3 "Constant Expressions")
+ * greater than zero."
+ */
+
+
+uniform vec4 [-1] a;
+
+void main() { gl_Position = vec4(0.0); }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-non-builtin-function.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-non-builtin-function.vert
new file mode 100644
index 00000000..99b7e1ba
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-non-builtin-function.vert
@@ -0,0 +1,19 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "When an array size is specified in a declaration, it must be an
+ * integral constant expression (see Section 4.3.3 "Constant Expressions")
+ * greater than zero."
+ */
+
+
+int foo() { return 3; }
+
+uniform vec4 [foo()] a;
+
+void main() { gl_Position = vec4(0.0); }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-not-constant.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-not-constant.vert
new file mode 100644
index 00000000..baa377eb
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-not-constant.vert
@@ -0,0 +1,18 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "When an array size is specified in a declaration, it must be an
+ * integral constant expression (see Section 4.3.3 "Constant Expressions")
+ * greater than zero."
+ */
+
+
+uniform int size;
+uniform vec4 [size] a;
+
+void main() { gl_Position = vec4(0.0); }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-selection.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-selection.vert
new file mode 100644
index 00000000..4ecc2c33
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-selection.vert
@@ -0,0 +1,23 @@
+/* [config]
+ * expect_result: pass
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 38 (page 44 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "The ternary selection operator (?:). It operates on three expressions
+ * (exp1 ? exp2 : exp3)....The second and third expressions can be any
+ * type, as long their types match....This resulting matching type is
+ * the type of the entire expression."
+ */
+
+
+const vec4[] a = vec4[](vec4(0), vec4(1));
+const vec4[] b = vec4[](vec4(1), vec4(0));
+uniform vec4 c[((true) ? a : b).length()];
+
+void main()
+{
+ gl_Position = c[0];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-sequence-in-parenthesis.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-sequence-in-parenthesis.vert
new file mode 100644
index 00000000..0f0b5789
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-sequence-in-parenthesis.vert
@@ -0,0 +1,33 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * The body of the GLSL spec is slient on this issue, but the grammar says:
+ *
+ * expression:
+ * assignment_expression
+ * expression COMMA assignment_expression
+ *
+ * constant_expression:
+ * conditional_expression
+ *
+ * ...
+ *
+ * init_declarator_list:
+ * single_declaration
+ * init_declarator_list COMMA IDENTIFIER
+ * init_declarator_list COMMA IDENTIFIER LEFT_BRACKET RIGHT_BRACKET
+ * init_declarator_list COMMA IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET
+ * init_declarator_list COMMA IDENTIFIER LEFT_BRACKET RIGHT_BRACKET EQUAL initializer
+ * init_declarator_list COMMA IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET EQUAL initializer
+ * init_declarator_list COMMA IDENTIFIER EQUAL initializer
+ *
+ * This also matches C and C++.
+ */
+
+
+uniform float a[(5,3)];
+
+void main() { gl_Position = vec4(0.0); }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-sequence.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-sequence.vert
new file mode 100644
index 00000000..387161fb
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-sequence.vert
@@ -0,0 +1,33 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * The body of the GLSL spec is slient on this issue, but the grammar says:
+ *
+ * expression:
+ * assignment_expression
+ * expression COMMA assignment_expression
+ *
+ * constant_expression:
+ * conditional_expression
+ *
+ * ...
+ *
+ * init_declarator_list:
+ * single_declaration
+ * init_declarator_list COMMA IDENTIFIER
+ * init_declarator_list COMMA IDENTIFIER LEFT_BRACKET RIGHT_BRACKET
+ * init_declarator_list COMMA IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET
+ * init_declarator_list COMMA IDENTIFIER LEFT_BRACKET RIGHT_BRACKET EQUAL initializer
+ * init_declarator_list COMMA IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET EQUAL initializer
+ * init_declarator_list COMMA IDENTIFIER EQUAL initializer
+ *
+ * This also matches C and C++.
+ */
+
+
+uniform float a[5,3];
+
+void main() { gl_Position = vec4(0.0); }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-vec2.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-vec2.vert
new file mode 100644
index 00000000..3712d4ee
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-vec2.vert
@@ -0,0 +1,17 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "When an array size is specified in a declaration, it must be an
+ * integral constant expression (see Section 4.3.3 "Constant Expressions")
+ * greater than zero."
+ */
+
+
+uniform float [vec2(2,2)] a;
+
+void main() { gl_Position = vec4(a[0]); }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-vec3.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-vec3.vert
new file mode 100644
index 00000000..7817ea00
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-vec3.vert
@@ -0,0 +1,17 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "When an array size is specified in a declaration, it must be an
+ * integral constant expression (see Section 4.3.3 "Constant Expressions")
+ * greater than zero."
+ */
+
+
+uniform float [vec3(2,2,2)] a;
+
+void main() { gl_Position = vec4(a[0]); }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-vec4.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-vec4.vert
new file mode 100644
index 00000000..39edae0c
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-vec4.vert
@@ -0,0 +1,17 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "When an array size is specified in a declaration, it must be an
+ * integral constant expression (see Section 4.3.3 "Constant Expressions")
+ * greater than zero."
+ */
+
+
+uniform float [vec4(2,2,2,2)] a;
+
+void main() { gl_Position = vec4(a[0]); }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-with-side-effect.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-with-side-effect.vert
new file mode 100644
index 00000000..426e3a63
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-with-side-effect.vert
@@ -0,0 +1,20 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "When an array size is specified in a declaration, it must be an
+ * integral constant expression (see Section 4.3.3 "Constant Expressions")
+ * greater than zero."
+ */
+
+
+void main()
+{
+ int x;
+ vec4[(x = 3)] a;
+ gl_Position = vec4(0.0);
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-zero.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-zero.vert
new file mode 100644
index 00000000..547d4c14
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-size-zero.vert
@@ -0,0 +1,17 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "When an array size is specified in a declaration, it must be an
+ * integral constant expression (see Section 4.3.3 "Constant Expressions")
+ * greater than zero."
+ */
+
+
+uniform vec4 [0] a;
+
+void main() { gl_Position = vec4(0.0); }
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-subtract.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-subtract.vert
new file mode 100644
index 00000000..776325a1
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-subtract.vert
@@ -0,0 +1,26 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 35 (page 41 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In total, only the following operators are allowed to operate on
+ * arrays and structures as whole entities:
+ *
+ * field or method selector .
+ * equality == !=
+ * assignment =
+ * indexing (arrays only) []"
+ */
+
+
+uniform vec4 a[2];
+uniform vec4 b[2];
+
+void main()
+{
+ vec4 c[2] = a - b;
+ gl_Position = c[0];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-variable-index-implicit-size-global.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-variable-index-implicit-size-global.vert
new file mode 100644
index 00000000..e4527b16
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-variable-index-implicit-size-global.vert
@@ -0,0 +1,24 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an array is indexed with an expression that is not an integral
+ * constant expression, or if an array is passed as an argument to a
+ * function, then its size must be declared before any such use."
+ */
+
+
+/* Assume the array is sized in a different compilation unit.
+ */
+vec4 [] an_array;
+
+uniform int i;
+
+void main()
+{
+ gl_Position = an_array[i];
+}
diff --git a/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-variable-index-implicit-size-local.vert b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-variable-index-implicit-size-local.vert
new file mode 100644
index 00000000..2269c49e
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/compiler/structure-and-array-operations/array-variable-index-implicit-size-local.vert
@@ -0,0 +1,29 @@
+/* [config]
+ * expect_result: fail
+ * glsl_version: 1.20
+ * glsles_version: 1.00
+ * [end config]
+ *
+ * From page 19 (page 25 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an array is indexed with an expression that is not an integral
+ * constant expression, or if an array is passed as an argument to a
+ * function, then its size must be declared before any such use."
+ */
+
+
+attribute vec4 a;
+attribute vec4 b;
+
+uniform int i;
+
+void main()
+{
+ vec4 [] an_array;
+
+ an_array[0] = a;
+ an_array[1] = vec4(0);
+ an_array[2] = b;
+
+ gl_Position = an_array[i];
+}
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/clipping/clipping.out b/tests/spec/glsl-es-1.00/execution/1.20/clipping/clipping.out
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/clipping/clipping.out
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/clipping/fixed-clip-enables.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/clipping/fixed-clip-enables.shader_test
new file mode 100644
index 00000000..93995a5c
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/clipping/fixed-clip-enables.shader_test
@@ -0,0 +1,141 @@
+# This test reproduces bug 41603
+# (https://bugs.freedesktop.org/show_bug.cgi?id=41603).
+#
+# This test sets up 6 clipping planes using fixed vertex
+# functionality, which clip a rectangle to a hexagon shape. Then it
+# tests various combinations of enables for the 6 clipping planes, and
+# verifies that they all create the correct shape.
+#
+# To verify that each enable works, the combinations of enables were
+# chosen such that:
+# - Every plane is enabled at least once and disbled at least once.
+# - Every plane is enabled and disabled in a different pattern.
+#
+# Note: Some implementations have bugs related to improper coordinate
+# transformations of clip planes (which are already adequately tested
+# by the clip-plane-transformation test), so to avoid those bugs
+# contaminating the results of this test, we don't do any coordinate
+# transformation in this test.
+
+[require]
+GLSL >= 1.20
+
+[fragment shader]
+#version 120
+void main(void)
+{
+ gl_FragColor = vec4(1, 1, 1, 1);
+}
+
+[test]
+clip plane 0 0 1 0 0.5
+clip plane 1 -1 1 0 0.8
+clip plane 2 -1 -1 0 0.8
+clip plane 3 0 -1 0 0.5
+clip plane 4 1 -1 0 0.8
+clip plane 5 1 1 0 0.8
+clear color 0.0 0.0 0.0 0.0
+
+# Test with planes 0, 2, and 4 enabled.
+enable GL_CLIP_PLANE0
+disable GL_CLIP_PLANE1
+enable GL_CLIP_PLANE2
+disable GL_CLIP_PLANE3
+enable GL_CLIP_PLANE4
+disable GL_CLIP_PLANE5
+clear
+draw rect -1 -1 2 2
+
+# Test points inside each hexagon edge
+relative probe rgba (0.3, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.3) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.6) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.7) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.3, 0.6) (1.0, 1.0, 1.0, 1.0)
+
+# Test points outside each hexagon edge
+relative probe rgba (0.5, 0.2) (0.0, 0.0, 0.0, 0.0) # clipped by plane 0
+relative probe rgba (0.8, 0.3) (1.0, 1.0, 1.0, 1.0) # clipped by plane 1
+relative probe rgba (0.8, 0.7) (0.0, 0.0, 0.0, 0.0) # clipped by plane 2
+relative probe rgba (0.5, 0.8) (1.0, 1.0, 1.0, 1.0) # clipped by plane 3
+relative probe rgba (0.2, 0.7) (0.0, 0.0, 0.0, 0.0) # clipped by plane 4
+relative probe rgba (0.2, 0.3) (1.0, 1.0, 1.0, 1.0) # clipped by plane 5
+
+# Test with planes 0, 1, 4, and 5 enabled.
+enable GL_CLIP_PLANE0
+enable GL_CLIP_PLANE1
+disable GL_CLIP_PLANE2
+disable GL_CLIP_PLANE3
+enable GL_CLIP_PLANE4
+enable GL_CLIP_PLANE5
+clear
+draw rect -1 -1 2 2
+
+# Test points inside each hexagon edge
+relative probe rgba (0.3, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.3) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.6) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.7) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.3, 0.6) (1.0, 1.0, 1.0, 1.0)
+
+# Test points outside each hexagon edge
+relative probe rgba (0.5, 0.2) (0.0, 0.0, 0.0, 0.0) # clipped by plane 0
+relative probe rgba (0.8, 0.3) (0.0, 0.0, 0.0, 0.0) # clipped by plane 1
+relative probe rgba (0.8, 0.7) (1.0, 1.0, 1.0, 1.0) # clipped by plane 2
+relative probe rgba (0.5, 0.8) (1.0, 1.0, 1.0, 1.0) # clipped by plane 3
+relative probe rgba (0.2, 0.7) (0.0, 0.0, 0.0, 0.0) # clipped by plane 4
+relative probe rgba (0.2, 0.3) (0.0, 0.0, 0.0, 0.0) # clipped by plane 5
+
+# Test with planes 0, 1, 2, and 3 enabled.
+enable GL_CLIP_PLANE0
+enable GL_CLIP_PLANE1
+enable GL_CLIP_PLANE2
+enable GL_CLIP_PLANE3
+disable GL_CLIP_PLANE4
+disable GL_CLIP_PLANE5
+clear
+draw rect -1 -1 2 2
+
+# Test points inside each hexagon edge
+relative probe rgba (0.3, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.3) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.6) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.7) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.3, 0.6) (1.0, 1.0, 1.0, 1.0)
+
+# Test points outside each hexagon edge
+relative probe rgba (0.5, 0.2) (0.0, 0.0, 0.0, 0.0) # clipped by plane 0
+relative probe rgba (0.8, 0.3) (0.0, 0.0, 0.0, 0.0) # clipped by plane 1
+relative probe rgba (0.8, 0.7) (0.0, 0.0, 0.0, 0.0) # clipped by plane 2
+relative probe rgba (0.5, 0.8) (0.0, 0.0, 0.0, 0.0) # clipped by plane 3
+relative probe rgba (0.2, 0.7) (1.0, 1.0, 1.0, 1.0) # clipped by plane 4
+relative probe rgba (0.2, 0.3) (1.0, 1.0, 1.0, 1.0) # clipped by plane 5
+
+# Test with planes 4 and 5 enabled.
+disable GL_CLIP_PLANE0
+disable GL_CLIP_PLANE1
+disable GL_CLIP_PLANE2
+disable GL_CLIP_PLANE3
+enable GL_CLIP_PLANE4
+enable GL_CLIP_PLANE5
+clear
+draw rect -1 -1 2 2
+
+# Test points inside each hexagon edge
+relative probe rgba (0.3, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.3) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.6) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.7) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.3, 0.6) (1.0, 1.0, 1.0, 1.0)
+
+# Test points outside each hexagon edge
+relative probe rgba (0.5, 0.2) (1.0, 1.0, 1.0, 1.0) # clipped by plane 0
+relative probe rgba (0.8, 0.3) (1.0, 1.0, 1.0, 1.0) # clipped by plane 1
+relative probe rgba (0.8, 0.7) (1.0, 1.0, 1.0, 1.0) # clipped by plane 2
+relative probe rgba (0.5, 0.8) (1.0, 1.0, 1.0, 1.0) # clipped by plane 3
+relative probe rgba (0.2, 0.7) (0.0, 0.0, 0.0, 0.0) # clipped by plane 4
+relative probe rgba (0.2, 0.3) (0.0, 0.0, 0.0, 0.0) # clipped by plane 5
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-const-accept.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-const-accept.shader_test
new file mode 100644
index 00000000..6c2b56cf
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-const-accept.shader_test
@@ -0,0 +1,42 @@
+# From the GL 2.1 spec, section 2.17 (Clipping):
+#
+# All points with eye coordinates (x_e y_e z_e w_e)^T that satisfy
+#
+# (x_e)
+# (p_1' p_2' p_3' p_4')(y_e) >= 0
+# (z_e)
+# (w_e)
+#
+# lie in the half-space defined by the plane; points that do not
+# satisfy this condition do not lie in the half-space.
+#
+# This test checks that gl_ClipVertex works properly for the trivial
+# case where gl_ClipVertex is a constant value satisfying the above
+# inequality.
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+void main(void)
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+
+ gl_ClipVertex = vec4(1.0, 0.0, 0.0, 0.0);
+}
+
+[fragment shader]
+#version 120
+void main(void)
+{
+ gl_FragColor = vec4(1.0);
+}
+
+[test]
+clear color 0.0 0.0 0.0 0.0
+clear
+clip plane 0 1.0 0.0 0.0 0.0 # accept points where gl_ClipVertex.x >= 0
+enable GL_CLIP_PLANE0
+draw rect -1 -1 2 2
+probe all rgba 1.0 1.0 1.0 1.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-const-reject.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-const-reject.shader_test
new file mode 100644
index 00000000..0bb08ea0
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-const-reject.shader_test
@@ -0,0 +1,42 @@
+# From the GL 2.1 spec, section 2.17 (Clipping):
+#
+# All points with eye coordinates (x_e y_e z_e w_e)^T that satisfy
+#
+# (x_e)
+# (p_1' p_2' p_3' p_4')(y_e) >= 0
+# (z_e)
+# (w_e)
+#
+# lie in the half-space defined by the plane; points that do not
+# satisfy this condition do not lie in the half-space.
+#
+# This test checks that gl_ClipVertex works properly for the trivial
+# case where gl_ClipVertex is a constant value not satisfying the
+# above inequality.
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+void main(void)
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+
+ gl_ClipVertex = vec4(-1.0, 0.0, 0.0, 0.0);
+}
+
+[fragment shader]
+#version 120
+void main(void)
+{
+ gl_FragColor = vec4(1.0);
+}
+
+[test]
+clear color 0.0 0.0 0.0 0.0
+clear
+clip plane 0 1.0 0.0 0.0 0.0 # accept points where gl_ClipVertex.x >= 0
+enable GL_CLIP_PLANE0
+draw rect -1 -1 2 2
+probe all rgba 0.0 0.0 0.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-different-from-position.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-different-from-position.shader_test
new file mode 100644
index 00000000..c7dae897
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-different-from-position.shader_test
@@ -0,0 +1,62 @@
+# [description]
+# Use all 6 clip planes to clip a rectangle to a hexagon shape.
+#
+# In this test, gl_Position and gl_ClipVertex are different to verify
+# that gl_Position determines screen position and gl_ClipVertex
+# determines clipping.
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+void main(void)
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+
+ // Transform gl_ClipVertex in an arbitrary way so that
+ // we can verify it is being used for clipping instead of
+ // gl_Position.
+ gl_ClipVertex = gl_Vertex * vec4(10.0, 10.0, 1.0, 1.0);
+}
+
+[fragment shader]
+#version 120
+void main(void)
+{
+ gl_FragColor = vec4(1, 1, 1, 1);
+}
+
+[test]
+clear color 0.0 0.0 0.0 0.0
+clear
+ortho 0 1 0 1
+clip plane 0 0 1 0 -2.5
+clip plane 1 -1 1 0 4
+clip plane 2 -1 -1 0 14
+clip plane 3 0 -1 0 7.5
+clip plane 4 1 -1 0 4
+clip plane 5 1 1 0 -6
+enable GL_CLIP_PLANE0
+enable GL_CLIP_PLANE1
+enable GL_CLIP_PLANE2
+enable GL_CLIP_PLANE3
+enable GL_CLIP_PLANE4
+enable GL_CLIP_PLANE5
+draw rect 0.1 0.1 0.8 0.8
+
+# Test points inside each hexagon edge
+relative probe rgba (0.3, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.3) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.6) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.7) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.3, 0.6) (1.0, 1.0, 1.0, 1.0)
+
+# Test points outside each hexagon edge
+relative probe rgba (0.2, 0.3) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.5, 0.2) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.8, 0.3) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.8, 0.7) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.5, 0.8) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.2, 0.7) (0.0, 0.0, 0.0, 0.0)
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-enables.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-enables.shader_test
new file mode 100644
index 00000000..b93d16f3
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-enables.shader_test
@@ -0,0 +1,147 @@
+# This test sets up 6 clipping planes using gl_ClipVertex, which clip
+# a rectangle to a hexagon shape. Then it tests various combinations
+# of enables for the 6 clipping planes, and verifies that they all
+# create the correct shape.
+#
+# To verify that each enable works, the combinations of enables were
+# chosen such that:
+# - Every plane is enabled at least once and disbled at least once.
+# - Every plane is enabled and disabled in a different pattern.
+#
+# Note: Some implementations have bugs related to improper coordinate
+# transformations of clip planes (which are already adequately tested
+# by the clip-plane-transformation test), so to avoid those bugs
+# contaminating the results of this test, we don't do any coordinate
+# transformation in this test.
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+void main(void)
+{
+ gl_Position = gl_Vertex;
+
+ gl_ClipVertex = gl_Position;
+}
+
+[fragment shader]
+#version 120
+void main(void)
+{
+ gl_FragColor = vec4(1, 1, 1, 1);
+}
+
+[test]
+clip plane 0 0 1 0 0.5
+clip plane 1 -1 1 0 0.8
+clip plane 2 -1 -1 0 0.8
+clip plane 3 0 -1 0 0.5
+clip plane 4 1 -1 0 0.8
+clip plane 5 1 1 0 0.8
+clear color 0.0 0.0 0.0 0.0
+
+# Test with planes 0, 2, and 4 enabled.
+enable GL_CLIP_PLANE0
+disable GL_CLIP_PLANE1
+enable GL_CLIP_PLANE2
+disable GL_CLIP_PLANE3
+enable GL_CLIP_PLANE4
+disable GL_CLIP_PLANE5
+clear
+draw rect -1 -1 2 2
+
+# Test points inside each hexagon edge
+relative probe rgba (0.3, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.3) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.6) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.7) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.3, 0.6) (1.0, 1.0, 1.0, 1.0)
+
+# Test points outside each hexagon edge
+relative probe rgba (0.5, 0.2) (0.0, 0.0, 0.0, 0.0) # clipped by plane 0
+relative probe rgba (0.8, 0.3) (1.0, 1.0, 1.0, 1.0) # clipped by plane 1
+relative probe rgba (0.8, 0.7) (0.0, 0.0, 0.0, 0.0) # clipped by plane 2
+relative probe rgba (0.5, 0.8) (1.0, 1.0, 1.0, 1.0) # clipped by plane 3
+relative probe rgba (0.2, 0.7) (0.0, 0.0, 0.0, 0.0) # clipped by plane 4
+relative probe rgba (0.2, 0.3) (1.0, 1.0, 1.0, 1.0) # clipped by plane 5
+
+# Test with planes 0, 1, 4, and 5 enabled.
+enable GL_CLIP_PLANE0
+enable GL_CLIP_PLANE1
+disable GL_CLIP_PLANE2
+disable GL_CLIP_PLANE3
+enable GL_CLIP_PLANE4
+enable GL_CLIP_PLANE5
+clear
+draw rect -1 -1 2 2
+
+# Test points inside each hexagon edge
+relative probe rgba (0.3, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.3) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.6) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.7) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.3, 0.6) (1.0, 1.0, 1.0, 1.0)
+
+# Test points outside each hexagon edge
+relative probe rgba (0.5, 0.2) (0.0, 0.0, 0.0, 0.0) # clipped by plane 0
+relative probe rgba (0.8, 0.3) (0.0, 0.0, 0.0, 0.0) # clipped by plane 1
+relative probe rgba (0.8, 0.7) (1.0, 1.0, 1.0, 1.0) # clipped by plane 2
+relative probe rgba (0.5, 0.8) (1.0, 1.0, 1.0, 1.0) # clipped by plane 3
+relative probe rgba (0.2, 0.7) (0.0, 0.0, 0.0, 0.0) # clipped by plane 4
+relative probe rgba (0.2, 0.3) (0.0, 0.0, 0.0, 0.0) # clipped by plane 5
+
+# Test with planes 0, 1, 2, and 3 enabled.
+enable GL_CLIP_PLANE0
+enable GL_CLIP_PLANE1
+enable GL_CLIP_PLANE2
+enable GL_CLIP_PLANE3
+disable GL_CLIP_PLANE4
+disable GL_CLIP_PLANE5
+clear
+draw rect -1 -1 2 2
+
+# Test points inside each hexagon edge
+relative probe rgba (0.3, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.3) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.6) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.7) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.3, 0.6) (1.0, 1.0, 1.0, 1.0)
+
+# Test points outside each hexagon edge
+relative probe rgba (0.5, 0.2) (0.0, 0.0, 0.0, 0.0) # clipped by plane 0
+relative probe rgba (0.8, 0.3) (0.0, 0.0, 0.0, 0.0) # clipped by plane 1
+relative probe rgba (0.8, 0.7) (0.0, 0.0, 0.0, 0.0) # clipped by plane 2
+relative probe rgba (0.5, 0.8) (0.0, 0.0, 0.0, 0.0) # clipped by plane 3
+relative probe rgba (0.2, 0.7) (1.0, 1.0, 1.0, 1.0) # clipped by plane 4
+relative probe rgba (0.2, 0.3) (1.0, 1.0, 1.0, 1.0) # clipped by plane 5
+
+# Test with planes 4 and 5 enabled.
+disable GL_CLIP_PLANE0
+disable GL_CLIP_PLANE1
+disable GL_CLIP_PLANE2
+disable GL_CLIP_PLANE3
+enable GL_CLIP_PLANE4
+enable GL_CLIP_PLANE5
+clear
+draw rect -1 -1 2 2
+
+# Test points inside each hexagon edge
+relative probe rgba (0.3, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.3) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.6) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.7) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.3, 0.6) (1.0, 1.0, 1.0, 1.0)
+
+# Test points outside each hexagon edge
+relative probe rgba (0.5, 0.2) (1.0, 1.0, 1.0, 1.0) # clipped by plane 0
+relative probe rgba (0.8, 0.3) (1.0, 1.0, 1.0, 1.0) # clipped by plane 1
+relative probe rgba (0.8, 0.7) (1.0, 1.0, 1.0, 1.0) # clipped by plane 2
+relative probe rgba (0.5, 0.8) (1.0, 1.0, 1.0, 1.0) # clipped by plane 3
+relative probe rgba (0.2, 0.7) (0.0, 0.0, 0.0, 0.0) # clipped by plane 4
+relative probe rgba (0.2, 0.3) (0.0, 0.0, 0.0, 0.0) # clipped by plane 5
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-equal-to-position.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-equal-to-position.shader_test
new file mode 100644
index 00000000..50b4856f
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-equal-to-position.shader_test
@@ -0,0 +1,57 @@
+# [description]
+# Use all 6 clip planes to clip a rectangle to a hexagon shape.
+#
+# In this test, gl_Position and gl_ClipVertex are the same.
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+void main(void)
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+
+ gl_ClipVertex = gl_Position;
+}
+
+[fragment shader]
+#version 120
+void main(void)
+{
+ gl_FragColor = vec4(1, 1, 1, 1);
+}
+
+[test]
+clear color 0.0 0.0 0.0 0.0
+clear
+ortho 0 1 0 1
+clip plane 0 0 1 0 0.5
+clip plane 1 -1 1 0 0.8
+clip plane 2 -1 -1 0 0.8
+clip plane 3 0 -1 0 0.5
+clip plane 4 1 -1 0 0.8
+clip plane 5 1 1 0 0.8
+enable GL_CLIP_PLANE0
+enable GL_CLIP_PLANE1
+enable GL_CLIP_PLANE2
+enable GL_CLIP_PLANE3
+enable GL_CLIP_PLANE4
+enable GL_CLIP_PLANE5
+draw rect 0.1 0.1 0.8 0.8
+
+# Test points inside each hexagon edge
+relative probe rgba (0.3, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.3) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.6) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.7) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.3, 0.6) (1.0, 1.0, 1.0, 1.0)
+
+# Test points outside each hexagon edge
+relative probe rgba (0.2, 0.3) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.5, 0.2) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.8, 0.3) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.8, 0.7) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.5, 0.8) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.2, 0.7) (0.0, 0.0, 0.0, 0.0)
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-homogeneity.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-homogeneity.shader_test
new file mode 100644
index 00000000..615ecf9e
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/clipping/vs-clip-vertex-homogeneity.shader_test
@@ -0,0 +1,69 @@
+# This test verifies that the homogeneous coordinate of gl_ClipVertex
+# is properly respected, by doubling all the coordinates of
+# gl_ClipVertex (including the homogeneous coordinate) and verifying
+# that the clipped shape is still correct.
+#
+# In addition, this test:
+# - uses all 6 clip planes to clip a rectangle to a hexagon shape.
+# - sets gl_Position and gl_ClipVertex to different values, to verify
+# that gl_Position determines screen position and gl_ClipVertex
+# determines clipping.
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+void main(void)
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+
+ // Transform gl_ClipVertex in an arbitrary way so that
+ // we can verify it is being used for clipping instead of
+ // gl_Position. The x and y coordinates are multiplied by 5,
+ // and the homogeneous coordinate is multiplied by 0.5, so the
+ // net result should be that x and y are scaled by a factor of
+ // 10.
+ gl_ClipVertex = gl_Vertex * vec4(5.0, 5.0, 1.0, 0.5);
+}
+
+[fragment shader]
+#version 120
+void main(void)
+{
+ gl_FragColor = vec4(1, 1, 1, 1);
+}
+
+[test]
+clear color 0.0 0.0 0.0 0.0
+clear
+ortho 0 1 0 1
+clip plane 0 0 1 0 -2.5
+clip plane 1 -1 1 0 4
+clip plane 2 -1 -1 0 14
+clip plane 3 0 -1 0 7.5
+clip plane 4 1 -1 0 4
+clip plane 5 1 1 0 -6
+enable GL_CLIP_PLANE0
+enable GL_CLIP_PLANE1
+enable GL_CLIP_PLANE2
+enable GL_CLIP_PLANE3
+enable GL_CLIP_PLANE4
+enable GL_CLIP_PLANE5
+draw rect 0.1 0.1 0.8 0.8
+
+# Test points inside each hexagon edge
+relative probe rgba (0.3, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.3) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.4) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.7, 0.6) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.5, 0.7) (1.0, 1.0, 1.0, 1.0)
+relative probe rgba (0.3, 0.6) (1.0, 1.0, 1.0, 1.0)
+
+# Test points outside each hexagon edge
+relative probe rgba (0.2, 0.3) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.5, 0.2) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.8, 0.3) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.8, 0.7) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.5, 0.8) (0.0, 0.0, 0.0, 0.0)
+relative probe rgba (0.2, 0.7) (0.0, 0.0, 0.0, 0.0)
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-assign-varied-struct.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-assign-varied-struct.shader_test
new file mode 100644
index 00000000..f3ad3e84
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-assign-varied-struct.shader_test
@@ -0,0 +1,36 @@
+# Test initialization of an array of structures where the elements of
+# the structure do not all have the same vector size.
+
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main(void)
+{
+ gl_Position = vertex;
+}
+
+[fragment shader]
+
+void main(void)
+{
+ float x = 3.0;
+ struct s { float f; vec3 v; };
+ s a[1]=s[](s(x,vec3(x)));
+ if (a[0].f==3.0)
+ gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); // green
+ else
+ gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); // red
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 1.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2-ivec.shader_test
new file mode 100644
index 00000000..c6925f40
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2-ivec.shader_test
@@ -0,0 +1,54 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+
+const ivec2 c = ivec2(2, 3);
+const ivec2 r = ivec2(4, 5);
+uniform mat2 expected = mat2(8, 12, 10, 15);
+
+void main() {
+ mat2 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2.shader_test
new file mode 100644
index 00000000..a8e91542
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2.shader_test
@@ -0,0 +1,34 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+
+const vec2 c = vec2(2, 3);
+const vec2 r = vec2(4, 5);
+uniform mat2 expected = mat2(8, 12, 10, 15);
+
+void main() {
+ mat2 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x2-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x2-ivec.shader_test
new file mode 100644
index 00000000..dc392010
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x2-ivec.shader_test
@@ -0,0 +1,54 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+
+const ivec2 c = ivec2(2, 3);
+const ivec2 r = ivec2(4, 5);
+uniform mat2x2 expected = mat2x2(8, 12, 10, 15);
+
+void main() {
+ mat2x2 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x2.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x2.shader_test
new file mode 100644
index 00000000..370c3c8b
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x2.shader_test
@@ -0,0 +1,34 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+
+const vec2 c = vec2(2, 3);
+const vec2 r = vec2(4, 5);
+uniform mat2x2 expected = mat2x2(8, 12, 10, 15);
+
+void main() {
+ mat2x2 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x3-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x3-ivec.shader_test
new file mode 100644
index 00000000..9cb881f7
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x3-ivec.shader_test
@@ -0,0 +1,56 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix2x3fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+
+const ivec3 c = ivec3(2, 3, 4);
+const ivec2 r = ivec2(5, 6);
+uniform mat2x3 expected = mat2x3(10, 15, 20, 12, 18, 24);
+
+void main() {
+ mat2x3 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x3.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x3.shader_test
new file mode 100644
index 00000000..925cc8d7
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x3.shader_test
@@ -0,0 +1,35 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix2x3fv only exists in OpenGL 2.1 or later.
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+
+const vec3 c = vec3(2, 3, 4);
+const vec2 r = vec2(5, 6);
+uniform mat2x3 expected = mat2x3(10, 15, 20, 12, 18, 24);
+
+void main() {
+ mat2x3 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x4-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x4-ivec.shader_test
new file mode 100644
index 00000000..a67c2051
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x4-ivec.shader_test
@@ -0,0 +1,56 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix2x4fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+
+const ivec4 c = ivec4(2, 3, 4, 5);
+const ivec2 r = ivec2(6, 7);
+uniform mat2x4 expected = mat2x4(12, 18, 24, 30, 14, 21, 28, 35);
+
+void main() {
+ mat2x4 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x4.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x4.shader_test
new file mode 100644
index 00000000..214a1128
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat2x4.shader_test
@@ -0,0 +1,36 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix2x4fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+
+const vec4 c = vec4(2, 3, 4, 5);
+const vec2 r = vec2(6, 7);
+uniform mat2x4 expected = mat2x4(12, 18, 24, 30, 14, 21, 28, 35);
+
+void main() {
+ mat2x4 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3-ivec.shader_test
new file mode 100644
index 00000000..d2e11a6e
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3-ivec.shader_test
@@ -0,0 +1,54 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+
+const ivec3 c = ivec3(2, 3, 4);
+const ivec3 r = ivec3(5, 6, 7);
+uniform mat3 expected = mat3(10, 15, 20, 12, 18, 24, 14, 21, 28);
+
+void main() {
+ mat3 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3.shader_test
new file mode 100644
index 00000000..d5011152
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3.shader_test
@@ -0,0 +1,34 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+
+const vec3 c = vec3(2, 3, 4);
+const vec3 r = vec3(5, 6, 7);
+uniform mat3 expected = mat3(10, 15, 20, 12, 18, 24, 14, 21, 28);
+
+void main() {
+ mat3 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x2-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x2-ivec.shader_test
new file mode 100644
index 00000000..99292140
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x2-ivec.shader_test
@@ -0,0 +1,56 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix3x2fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+
+const ivec2 c = ivec2(2, 3);
+const ivec3 r = ivec3(4, 5, 6);
+uniform mat3x2 expected = mat3x2(8, 12, 10, 15, 12, 18);
+
+void main() {
+ mat3x2 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x2.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x2.shader_test
new file mode 100644
index 00000000..3e1ea9eb
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x2.shader_test
@@ -0,0 +1,36 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix3x2fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+
+const vec2 c = vec2(2, 3);
+const vec3 r = vec3(4, 5, 6);
+uniform mat3x2 expected = mat3x2(8, 12, 10, 15, 12, 18);
+
+void main() {
+ mat3x2 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x3-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x3-ivec.shader_test
new file mode 100644
index 00000000..8ad24d4c
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x3-ivec.shader_test
@@ -0,0 +1,54 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+
+const ivec3 c = ivec3(2, 3, 4);
+const ivec3 r = ivec3(5, 6, 7);
+uniform mat3x3 expected = mat3x3(10, 15, 20, 12, 18, 24, 14, 21, 28);
+
+void main() {
+ mat3x3 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x3.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x3.shader_test
new file mode 100644
index 00000000..5371ac93
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x3.shader_test
@@ -0,0 +1,34 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+
+const vec3 c = vec3(2, 3, 4);
+const vec3 r = vec3(5, 6, 7);
+uniform mat3x3 expected = mat3x3(10, 15, 20, 12, 18, 24, 14, 21, 28);
+
+void main() {
+ mat3x3 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x4-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x4-ivec.shader_test
new file mode 100644
index 00000000..ef994660
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x4-ivec.shader_test
@@ -0,0 +1,56 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix3x4fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+
+const ivec4 c = ivec4(2, 3, 4, 5);
+const ivec3 r = ivec3(6, 7, 8);
+uniform mat3x4 expected = mat3x4(12, 18, 24, 30, 14, 21, 28, 35, 16, 24, 32, 40);
+
+void main() {
+ mat3x4 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x4.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x4.shader_test
new file mode 100644
index 00000000..dd0d4185
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat3x4.shader_test
@@ -0,0 +1,36 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix3x4fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+
+const vec4 c = vec4(2, 3, 4, 5);
+const vec3 r = vec3(6, 7, 8);
+uniform mat3x4 expected = mat3x4(12, 18, 24, 30, 14, 21, 28, 35, 16, 24, 32, 40);
+
+void main() {
+ mat3x4 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4-ivec.shader_test
new file mode 100644
index 00000000..441ae99a
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4-ivec.shader_test
@@ -0,0 +1,54 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+
+const ivec4 c = ivec4(2, 3, 4, 5);
+const ivec4 r = ivec4(6, 7, 8, 9);
+uniform mat4 expected = mat4(12, 18, 24, 30, 14, 21, 28, 35, 16, 24, 32, 40, 18, 27, 36, 45);
+
+void main() {
+ mat4 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4.shader_test
new file mode 100644
index 00000000..ac73bf6a
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4.shader_test
@@ -0,0 +1,34 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+
+const vec4 c = vec4(2, 3, 4, 5);
+const vec4 r = vec4(6, 7, 8, 9);
+uniform mat4 expected = mat4(12, 18, 24, 30, 14, 21, 28, 35, 16, 24, 32, 40, 18, 27, 36, 45);
+
+void main() {
+ mat4 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x2-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x2-ivec.shader_test
new file mode 100644
index 00000000..0d13ff5a
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x2-ivec.shader_test
@@ -0,0 +1,56 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix4x2fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+
+const ivec2 c = ivec2(2, 3);
+const ivec4 r = ivec4(4, 5, 6, 7);
+uniform mat4x2 expected = mat4x2(8, 12, 10, 15, 12, 18, 14, 21);
+
+void main() {
+ mat4x2 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x2.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x2.shader_test
new file mode 100644
index 00000000..fe76b5dc
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x2.shader_test
@@ -0,0 +1,36 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix4x2fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+
+const vec2 c = vec2(2, 3);
+const vec4 r = vec4(4, 5, 6, 7);
+uniform mat4x2 expected = mat4x2(8, 12, 10, 15, 12, 18, 14, 21);
+
+void main() {
+ mat4x2 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x3-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x3-ivec.shader_test
new file mode 100644
index 00000000..f46e29a4
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x3-ivec.shader_test
@@ -0,0 +1,56 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix4x3fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+
+const ivec3 c = ivec3(2, 3, 4);
+const ivec4 r = ivec4(5, 6, 7, 8);
+uniform mat4x3 expected = mat4x3(10, 15, 20, 12, 18, 24, 14, 21, 28, 16, 24, 32);
+
+void main() {
+ mat4x3 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x3.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x3.shader_test
new file mode 100644
index 00000000..168957bf
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x3.shader_test
@@ -0,0 +1,36 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix4x3fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+
+const vec3 c = vec3(2, 3, 4);
+const vec4 r = vec4(5, 6, 7, 8);
+uniform mat4x3 expected = mat4x3(10, 15, 20, 12, 18, 24, 14, 21, 28, 16, 24, 32);
+
+void main() {
+ mat4x3 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x4-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x4-ivec.shader_test
new file mode 100644
index 00000000..5fa7d9a3
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x4-ivec.shader_test
@@ -0,0 +1,54 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+
+const ivec4 c = ivec4(2, 3, 4, 5);
+const ivec4 r = ivec4(6, 7, 8, 9);
+uniform mat4x4 expected = mat4x4(12, 18, 24, 30, 14, 21, 28, 35, 16, 24, 32, 40, 18, 27, 36, 45);
+
+void main() {
+ mat4x4 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x4.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x4.shader_test
new file mode 100644
index 00000000..acabddc5
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-const-mat4x4.shader_test
@@ -0,0 +1,34 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+
+const vec4 c = vec4(2, 3, 4, 5);
+const vec4 r = vec4(6, 7, 8, 9);
+uniform mat4x4 expected = mat4x4(12, 18, 24, 30, 14, 21, 28, 35, 16, 24, 32, 40, 18, 27, 36, 45);
+
+void main() {
+ mat4x4 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2-ivec.shader_test
new file mode 100644
index 00000000..c1a8eb0c
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2-ivec.shader_test
@@ -0,0 +1,74 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+uniform ivec2 c;
+uniform ivec2 r;
+uniform mat2 expected;
+
+void main() {
+ mat2 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform ivec2 c 2 3
+uniform ivec2 r 4 5
+uniform mat2x2 expected 8 12 10 15
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform ivec2 c 3 4
+uniform ivec2 r 5 6
+uniform mat2x2 expected 15 20 18 24
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform ivec2 c 4 5
+uniform ivec2 r 6 7
+uniform mat2x2 expected 24 30 28 35
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform ivec2 c 5 6
+uniform ivec2 r 7 8
+uniform mat2x2 expected 35 42 40 48
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2.shader_test
new file mode 100644
index 00000000..393d36b4
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2.shader_test
@@ -0,0 +1,54 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+uniform vec2 c;
+uniform vec2 r;
+uniform mat2 expected;
+
+void main() {
+ mat2 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform vec2 c 2 3
+uniform vec2 r 4 5
+uniform mat2x2 expected 8 12 10 15
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform vec2 c 3 4
+uniform vec2 r 5 6
+uniform mat2x2 expected 15 20 18 24
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform vec2 c 4 5
+uniform vec2 r 6 7
+uniform mat2x2 expected 24 30 28 35
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform vec2 c 5 6
+uniform vec2 r 7 8
+uniform mat2x2 expected 35 42 40 48
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x2-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x2-ivec.shader_test
new file mode 100644
index 00000000..8b2a669e
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x2-ivec.shader_test
@@ -0,0 +1,74 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+uniform ivec2 c;
+uniform ivec2 r;
+uniform mat2x2 expected;
+
+void main() {
+ mat2x2 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform ivec2 c 2 3
+uniform ivec2 r 4 5
+uniform mat2x2 expected 8 12 10 15
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform ivec2 c 3 4
+uniform ivec2 r 5 6
+uniform mat2x2 expected 15 20 18 24
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform ivec2 c 4 5
+uniform ivec2 r 6 7
+uniform mat2x2 expected 24 30 28 35
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform ivec2 c 5 6
+uniform ivec2 r 7 8
+uniform mat2x2 expected 35 42 40 48
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x2.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x2.shader_test
new file mode 100644
index 00000000..e170e5fd
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x2.shader_test
@@ -0,0 +1,54 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+uniform vec2 c;
+uniform vec2 r;
+uniform mat2x2 expected;
+
+void main() {
+ mat2x2 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform vec2 c 2 3
+uniform vec2 r 4 5
+uniform mat2x2 expected 8 12 10 15
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform vec2 c 3 4
+uniform vec2 r 5 6
+uniform mat2x2 expected 15 20 18 24
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform vec2 c 4 5
+uniform vec2 r 6 7
+uniform mat2x2 expected 24 30 28 35
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform vec2 c 5 6
+uniform vec2 r 7 8
+uniform mat2x2 expected 35 42 40 48
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x3-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x3-ivec.shader_test
new file mode 100644
index 00000000..f384c372
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x3-ivec.shader_test
@@ -0,0 +1,76 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix2x3fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+uniform ivec3 c;
+uniform ivec2 r;
+uniform mat2x3 expected;
+
+void main() {
+ mat2x3 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform ivec3 c 2 3 4
+uniform ivec2 r 5 6
+uniform mat2x3 expected 10 15 20 12 18 24
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform ivec3 c 3 4 5
+uniform ivec2 r 6 7
+uniform mat2x3 expected 18 24 30 21 28 35
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform ivec3 c 4 5 6
+uniform ivec2 r 7 8
+uniform mat2x3 expected 28 35 42 32 40 48
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform ivec3 c 5 6 7
+uniform ivec2 r 8 9
+uniform mat2x3 expected 40 48 56 45 54 63
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x3.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x3.shader_test
new file mode 100644
index 00000000..a9c343bc
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x3.shader_test
@@ -0,0 +1,56 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix2x3fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+uniform vec3 c;
+uniform vec2 r;
+uniform mat2x3 expected;
+
+void main() {
+ mat2x3 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform vec3 c 2 3 4
+uniform vec2 r 5 6
+uniform mat2x3 expected 10 15 20 12 18 24
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform vec3 c 3 4 5
+uniform vec2 r 6 7
+uniform mat2x3 expected 18 24 30 21 28 35
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform vec3 c 4 5 6
+uniform vec2 r 7 8
+uniform mat2x3 expected 28 35 42 32 40 48
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform vec3 c 5 6 7
+uniform vec2 r 8 9
+uniform mat2x3 expected 40 48 56 45 54 63
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x4-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x4-ivec.shader_test
new file mode 100644
index 00000000..7e1c74e1
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x4-ivec.shader_test
@@ -0,0 +1,76 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix2x4fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+uniform ivec4 c;
+uniform ivec2 r;
+uniform mat2x4 expected;
+
+void main() {
+ mat2x4 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform ivec4 c 2 3 4 5
+uniform ivec2 r 6 7
+uniform mat2x4 expected 12 18 24 30 14 21 28 35
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform ivec4 c 3 4 5 6
+uniform ivec2 r 7 8
+uniform mat2x4 expected 21 28 35 42 24 32 40 48
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform ivec4 c 4 5 6 7
+uniform ivec2 r 8 9
+uniform mat2x4 expected 32 40 48 56 36 45 54 63
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform ivec4 c 5 6 7 8
+uniform ivec2 r 9 10
+uniform mat2x4 expected 45 54 63 72 50 60 70 80
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x4.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x4.shader_test
new file mode 100644
index 00000000..0724371c
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat2x4.shader_test
@@ -0,0 +1,56 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix2x4fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+uniform vec4 c;
+uniform vec2 r;
+uniform mat2x4 expected;
+
+void main() {
+ mat2x4 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform vec4 c 2 3 4 5
+uniform vec2 r 6 7
+uniform mat2x4 expected 12 18 24 30 14 21 28 35
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform vec4 c 3 4 5 6
+uniform vec2 r 7 8
+uniform mat2x4 expected 21 28 35 42 24 32 40 48
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform vec4 c 4 5 6 7
+uniform vec2 r 8 9
+uniform mat2x4 expected 32 40 48 56 36 45 54 63
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform vec4 c 5 6 7 8
+uniform vec2 r 9 10
+uniform mat2x4 expected 45 54 63 72 50 60 70 80
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3-ivec.shader_test
new file mode 100644
index 00000000..88a0f665
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3-ivec.shader_test
@@ -0,0 +1,74 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+uniform ivec3 c;
+uniform ivec3 r;
+uniform mat3 expected;
+
+void main() {
+ mat3 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform ivec3 c 2 3 4
+uniform ivec3 r 5 6 7
+uniform mat3x3 expected 10 15 20 12 18 24 14 21 28
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform ivec3 c 3 4 5
+uniform ivec3 r 6 7 8
+uniform mat3x3 expected 18 24 30 21 28 35 24 32 40
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform ivec3 c 4 5 6
+uniform ivec3 r 7 8 9
+uniform mat3x3 expected 28 35 42 32 40 48 36 45 54
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform ivec3 c 5 6 7
+uniform ivec3 r 8 9 10
+uniform mat3x3 expected 40 48 56 45 54 63 50 60 70
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3.shader_test
new file mode 100644
index 00000000..250b5761
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3.shader_test
@@ -0,0 +1,54 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+uniform vec3 c;
+uniform vec3 r;
+uniform mat3 expected;
+
+void main() {
+ mat3 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform vec3 c 2 3 4
+uniform vec3 r 5 6 7
+uniform mat3x3 expected 10 15 20 12 18 24 14 21 28
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform vec3 c 3 4 5
+uniform vec3 r 6 7 8
+uniform mat3x3 expected 18 24 30 21 28 35 24 32 40
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform vec3 c 4 5 6
+uniform vec3 r 7 8 9
+uniform mat3x3 expected 28 35 42 32 40 48 36 45 54
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform vec3 c 5 6 7
+uniform vec3 r 8 9 10
+uniform mat3x3 expected 40 48 56 45 54 63 50 60 70
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x2-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x2-ivec.shader_test
new file mode 100644
index 00000000..531cc81a
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x2-ivec.shader_test
@@ -0,0 +1,76 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix3x2fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+uniform ivec2 c;
+uniform ivec3 r;
+uniform mat3x2 expected;
+
+void main() {
+ mat3x2 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform ivec2 c 2 3
+uniform ivec3 r 4 5 6
+uniform mat3x2 expected 8 12 10 15 12 18
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform ivec2 c 3 4
+uniform ivec3 r 5 6 7
+uniform mat3x2 expected 15 20 18 24 21 28
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform ivec2 c 4 5
+uniform ivec3 r 6 7 8
+uniform mat3x2 expected 24 30 28 35 32 40
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform ivec2 c 5 6
+uniform ivec3 r 7 8 9
+uniform mat3x2 expected 35 42 40 48 45 54
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x2.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x2.shader_test
new file mode 100644
index 00000000..56c0e9b8
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x2.shader_test
@@ -0,0 +1,56 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix3x2fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+uniform vec2 c;
+uniform vec3 r;
+uniform mat3x2 expected;
+
+void main() {
+ mat3x2 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform vec2 c 2 3
+uniform vec3 r 4 5 6
+uniform mat3x2 expected 8 12 10 15 12 18
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform vec2 c 3 4
+uniform vec3 r 5 6 7
+uniform mat3x2 expected 15 20 18 24 21 28
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform vec2 c 4 5
+uniform vec3 r 6 7 8
+uniform mat3x2 expected 24 30 28 35 32 40
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform vec2 c 5 6
+uniform vec3 r 7 8 9
+uniform mat3x2 expected 35 42 40 48 45 54
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x3-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x3-ivec.shader_test
new file mode 100644
index 00000000..940ecae7
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x3-ivec.shader_test
@@ -0,0 +1,74 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+uniform ivec3 c;
+uniform ivec3 r;
+uniform mat3x3 expected;
+
+void main() {
+ mat3x3 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform ivec3 c 2 3 4
+uniform ivec3 r 5 6 7
+uniform mat3x3 expected 10 15 20 12 18 24 14 21 28
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform ivec3 c 3 4 5
+uniform ivec3 r 6 7 8
+uniform mat3x3 expected 18 24 30 21 28 35 24 32 40
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform ivec3 c 4 5 6
+uniform ivec3 r 7 8 9
+uniform mat3x3 expected 28 35 42 32 40 48 36 45 54
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform ivec3 c 5 6 7
+uniform ivec3 r 8 9 10
+uniform mat3x3 expected 40 48 56 45 54 63 50 60 70
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x3.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x3.shader_test
new file mode 100644
index 00000000..8a9b2084
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x3.shader_test
@@ -0,0 +1,54 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+uniform vec3 c;
+uniform vec3 r;
+uniform mat3x3 expected;
+
+void main() {
+ mat3x3 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform vec3 c 2 3 4
+uniform vec3 r 5 6 7
+uniform mat3x3 expected 10 15 20 12 18 24 14 21 28
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform vec3 c 3 4 5
+uniform vec3 r 6 7 8
+uniform mat3x3 expected 18 24 30 21 28 35 24 32 40
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform vec3 c 4 5 6
+uniform vec3 r 7 8 9
+uniform mat3x3 expected 28 35 42 32 40 48 36 45 54
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform vec3 c 5 6 7
+uniform vec3 r 8 9 10
+uniform mat3x3 expected 40 48 56 45 54 63 50 60 70
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x4-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x4-ivec.shader_test
new file mode 100644
index 00000000..3e629dca
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x4-ivec.shader_test
@@ -0,0 +1,76 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix3x4fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+uniform ivec4 c;
+uniform ivec3 r;
+uniform mat3x4 expected;
+
+void main() {
+ mat3x4 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform ivec4 c 2 3 4 5
+uniform ivec3 r 6 7 8
+uniform mat3x4 expected 12 18 24 30 14 21 28 35 16 24 32 40
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform ivec4 c 3 4 5 6
+uniform ivec3 r 7 8 9
+uniform mat3x4 expected 21 28 35 42 24 32 40 48 27 36 45 54
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform ivec4 c 4 5 6 7
+uniform ivec3 r 8 9 10
+uniform mat3x4 expected 32 40 48 56 36 45 54 63 40 50 60 70
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform ivec4 c 5 6 7 8
+uniform ivec3 r 9 10 11
+uniform mat3x4 expected 45 54 63 72 50 60 70 80 55 66 77 88
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x4.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x4.shader_test
new file mode 100644
index 00000000..a94040df
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat3x4.shader_test
@@ -0,0 +1,56 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix3x4fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+uniform vec4 c;
+uniform vec3 r;
+uniform mat3x4 expected;
+
+void main() {
+ mat3x4 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform vec4 c 2 3 4 5
+uniform vec3 r 6 7 8
+uniform mat3x4 expected 12 18 24 30 14 21 28 35 16 24 32 40
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform vec4 c 3 4 5 6
+uniform vec3 r 7 8 9
+uniform mat3x4 expected 21 28 35 42 24 32 40 48 27 36 45 54
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform vec4 c 4 5 6 7
+uniform vec3 r 8 9 10
+uniform mat3x4 expected 32 40 48 56 36 45 54 63 40 50 60 70
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform vec4 c 5 6 7 8
+uniform vec3 r 9 10 11
+uniform mat3x4 expected 45 54 63 72 50 60 70 80 55 66 77 88
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4-ivec.shader_test
new file mode 100644
index 00000000..4fcc7dfc
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4-ivec.shader_test
@@ -0,0 +1,74 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+uniform ivec4 c;
+uniform ivec4 r;
+uniform mat4 expected;
+
+void main() {
+ mat4 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform ivec4 c 2 3 4 5
+uniform ivec4 r 6 7 8 9
+uniform mat4x4 expected 12 18 24 30 14 21 28 35 16 24 32 40 18 27 36 45
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform ivec4 c 3 4 5 6
+uniform ivec4 r 7 8 9 10
+uniform mat4x4 expected 21 28 35 42 24 32 40 48 27 36 45 54 30 40 50 60
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform ivec4 c 4 5 6 7
+uniform ivec4 r 8 9 10 11
+uniform mat4x4 expected 32 40 48 56 36 45 54 63 40 50 60 70 44 55 66 77
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform ivec4 c 5 6 7 8
+uniform ivec4 r 9 10 11 12
+uniform mat4x4 expected 45 54 63 72 50 60 70 80 55 66 77 88 60 72 84 96
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4.shader_test
new file mode 100644
index 00000000..1b5c7192
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4.shader_test
@@ -0,0 +1,54 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+uniform vec4 c;
+uniform vec4 r;
+uniform mat4 expected;
+
+void main() {
+ mat4 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform vec4 c 2 3 4 5
+uniform vec4 r 6 7 8 9
+uniform mat4x4 expected 12 18 24 30 14 21 28 35 16 24 32 40 18 27 36 45
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform vec4 c 3 4 5 6
+uniform vec4 r 7 8 9 10
+uniform mat4x4 expected 21 28 35 42 24 32 40 48 27 36 45 54 30 40 50 60
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform vec4 c 4 5 6 7
+uniform vec4 r 8 9 10 11
+uniform mat4x4 expected 32 40 48 56 36 45 54 63 40 50 60 70 44 55 66 77
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform vec4 c 5 6 7 8
+uniform vec4 r 9 10 11 12
+uniform mat4x4 expected 45 54 63 72 50 60 70 80 55 66 77 88 60 72 84 96
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x2-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x2-ivec.shader_test
new file mode 100644
index 00000000..b2208adc
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x2-ivec.shader_test
@@ -0,0 +1,76 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix4x2fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+uniform ivec2 c;
+uniform ivec4 r;
+uniform mat4x2 expected;
+
+void main() {
+ mat4x2 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform ivec2 c 2 3
+uniform ivec4 r 4 5 6 7
+uniform mat4x2 expected 8 12 10 15 12 18 14 21
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform ivec2 c 3 4
+uniform ivec4 r 5 6 7 8
+uniform mat4x2 expected 15 20 18 24 21 28 24 32
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform ivec2 c 4 5
+uniform ivec4 r 6 7 8 9
+uniform mat4x2 expected 24 30 28 35 32 40 36 45
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform ivec2 c 5 6
+uniform ivec4 r 7 8 9 10
+uniform mat4x2 expected 35 42 40 48 45 54 50 60
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x2.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x2.shader_test
new file mode 100644
index 00000000..a7c36334
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x2.shader_test
@@ -0,0 +1,56 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix4x2fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+uniform vec2 c;
+uniform vec4 r;
+uniform mat4x2 expected;
+
+void main() {
+ mat4x2 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform vec2 c 2 3
+uniform vec4 r 4 5 6 7
+uniform mat4x2 expected 8 12 10 15 12 18 14 21
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform vec2 c 3 4
+uniform vec4 r 5 6 7 8
+uniform mat4x2 expected 15 20 18 24 21 28 24 32
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform vec2 c 4 5
+uniform vec4 r 6 7 8 9
+uniform mat4x2 expected 24 30 28 35 32 40 36 45
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform vec2 c 5 6
+uniform vec4 r 7 8 9 10
+uniform mat4x2 expected 35 42 40 48 45 54 50 60
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x3-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x3-ivec.shader_test
new file mode 100644
index 00000000..c479724a
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x3-ivec.shader_test
@@ -0,0 +1,76 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix4x3fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+uniform ivec3 c;
+uniform ivec4 r;
+uniform mat4x3 expected;
+
+void main() {
+ mat4x3 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform ivec3 c 2 3 4
+uniform ivec4 r 5 6 7 8
+uniform mat4x3 expected 10 15 20 12 18 24 14 21 28 16 24 32
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform ivec3 c 3 4 5
+uniform ivec4 r 6 7 8 9
+uniform mat4x3 expected 18 24 30 21 28 35 24 32 40 27 36 45
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform ivec3 c 4 5 6
+uniform ivec4 r 7 8 9 10
+uniform mat4x3 expected 28 35 42 32 40 48 36 45 54 40 50 60
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform ivec3 c 5 6 7
+uniform ivec4 r 8 9 10 11
+uniform mat4x3 expected 40 48 56 45 54 63 50 60 70 55 66 77
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x3.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x3.shader_test
new file mode 100644
index 00000000..683d64d7
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x3.shader_test
@@ -0,0 +1,56 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+# glUniformMatrix4x3fv only exists in OpenGL 2.1 or later.
+
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+uniform vec3 c;
+uniform vec4 r;
+uniform mat4x3 expected;
+
+void main() {
+ mat4x3 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform vec3 c 2 3 4
+uniform vec4 r 5 6 7 8
+uniform mat4x3 expected 10 15 20 12 18 24 14 21 28 16 24 32
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform vec3 c 3 4 5
+uniform vec4 r 6 7 8 9
+uniform mat4x3 expected 18 24 30 21 28 35 24 32 40 27 36 45
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform vec3 c 4 5 6
+uniform vec4 r 7 8 9 10
+uniform mat4x3 expected 28 35 42 32 40 48 36 45 54 40 50 60
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform vec3 c 5 6 7
+uniform vec4 r 8 9 10 11
+uniform mat4x3 expected 40 48 56 45 54 63 50 60 70 55 66 77
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x4-ivec.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x4-ivec.shader_test
new file mode 100644
index 00000000..57ef99b0
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x4-ivec.shader_test
@@ -0,0 +1,74 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+
+uniform ivec4 c;
+uniform ivec4 r;
+uniform mat4x4 expected;
+
+void main() {
+ mat4x4 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform ivec4 c 2 3 4 5
+uniform ivec4 r 6 7 8 9
+uniform mat4x4 expected 12 18 24 30 14 21 28 35 16 24 32 40 18 27 36 45
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform ivec4 c 3 4 5 6
+uniform ivec4 r 7 8 9 10
+uniform mat4x4 expected 21 28 35 42 24 32 40 48 27 36 45 54 30 40 50 60
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform ivec4 c 4 5 6 7
+uniform ivec4 r 8 9 10 11
+uniform mat4x4 expected 32 40 48 56 36 45 54 63 40 50 60 70 44 55 66 77
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform ivec4 c 5 6 7 8
+uniform ivec4 r 9 10 11 12
+uniform mat4x4 expected 45 54 63 72 50 60 70 80 55 66 77 88 60 72 84 96
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x4.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x4.shader_test
new file mode 100644
index 00000000..01e79c7d
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/fs-outerProduct-mat4x4.shader_test
@@ -0,0 +1,54 @@
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+
+uniform vec4 c;
+uniform vec4 r;
+uniform mat4x4 expected;
+
+void main() {
+ mat4x4 result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+uniform vec4 c 2 3 4 5
+uniform vec4 r 6 7 8 9
+uniform mat4x4 expected 12 18 24 30 14 21 28 35 16 24 32 40 18 27 36 45
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+
+uniform vec4 c 3 4 5 6
+uniform vec4 r 7 8 9 10
+uniform mat4x4 expected 21 28 35 42 24 32 40 48 27 36 45 54 30 40 50 60
+draw rect 30 10 10 10
+probe rgb 35 15 0.0 1.0 0.0
+
+uniform vec4 c 4 5 6 7
+uniform vec4 r 8 9 10 11
+uniform mat4x4 expected 32 40 48 56 36 45 54 63 40 50 60 70 44 55 66 77
+draw rect 50 10 10 10
+probe rgb 55 15 0.0 1.0 0.0
+
+uniform vec4 c 5 6 7 8
+uniform vec4 r 9 10 11 12
+uniform mat4x4 expected 45 54 63 72 50 60 70 80 55 66 77 88 60 72 84 96
+draw rect 70 10 10 10
+probe rgb 75 15 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxClipPlanes.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxClipPlanes.shader_test
new file mode 100644
index 00000000..16672930
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxClipPlanes.shader_test
@@ -0,0 +1,28 @@
+# [description]
+# Tests for GLSL 1.20 minimum maximums for the builtin constants.
+#
+# See the GLSL 1.20.8 specification, section 7.4, page 49 (page 55 of the PDF).
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+void main(void)
+{
+ gl_Position = gl_Vertex;
+}
+
+[fragment shader]
+#version 120
+void main(void)
+{
+ if (gl_MaxClipPlanes >= 6)
+ gl_FragColor = vec4(0, 1, 0, 0);
+ else
+ gl_FragColor = vec4(1, 0, 0, 0);
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxCombinedTextureImageUnits.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxCombinedTextureImageUnits.shader_test
new file mode 100644
index 00000000..a489be05
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxCombinedTextureImageUnits.shader_test
@@ -0,0 +1,28 @@
+# [description]
+# Tests for GLSL 1.20 minimum maximums for the builtin constants.
+#
+# See the GLSL 1.20.8 specification, section 7.4, page 49 (page 55 of the PDF).
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+void main(void)
+{
+ gl_Position = gl_Vertex;
+}
+
+[fragment shader]
+#version 120
+void main(void)
+{
+ if (gl_MaxCombinedTextureImageUnits >= 2)
+ gl_FragColor = vec4(0, 1, 0, 0);
+ else
+ gl_FragColor = vec4(1, 0, 0, 0);
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxDrawBuffers.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxDrawBuffers.shader_test
new file mode 100644
index 00000000..e450a1c4
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxDrawBuffers.shader_test
@@ -0,0 +1,28 @@
+# [description]
+# Tests for GLSL 1.20 minimum maximums for the builtin constants.
+#
+# See the GLSL 1.20.8 specification, section 7.4, page 49 (page 55 of the PDF).
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+void main(void)
+{
+ gl_Position = gl_Vertex;
+}
+
+[fragment shader]
+#version 120
+void main(void)
+{
+ if (gl_MaxDrawBuffers >= 1)
+ gl_FragColor = vec4(0, 1, 0, 0);
+ else
+ gl_FragColor = vec4(1, 0, 0, 0);
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxFragmentUniformComponents.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxFragmentUniformComponents.shader_test
new file mode 100644
index 00000000..3aefbf51
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxFragmentUniformComponents.shader_test
@@ -0,0 +1,28 @@
+# [description]
+# Tests for GLSL 1.20 minimum maximums for the builtin constants.
+#
+# See the GLSL 1.20.8 specification, section 7.4, page 49 (page 55 of the PDF).
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+void main(void)
+{
+ gl_Position = gl_Vertex;
+}
+
+[fragment shader]
+#version 120
+void main(void)
+{
+ if (gl_MaxFragmentUniformComponents >= 64)
+ gl_FragColor = vec4(0, 1, 0, 0);
+ else
+ gl_FragColor = vec4(1, 0, 0, 0);
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxLights.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxLights.shader_test
new file mode 100644
index 00000000..3c0fea5b
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxLights.shader_test
@@ -0,0 +1,28 @@
+# [description]
+# Tests for GLSL 1.20 minimum maximums for the builtin constants.
+#
+# See the GLSL 1.20.8 specification, section 7.4, page 49 (page 55 of the PDF).
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+void main(void)
+{
+ gl_Position = gl_Vertex;
+}
+
+[fragment shader]
+#version 120
+void main(void)
+{
+ if (gl_MaxLights >= 8)
+ gl_FragColor = vec4(0, 1, 0, 0);
+ else
+ gl_FragColor = vec4(1, 0, 0, 0);
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxTextureCoords.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxTextureCoords.shader_test
new file mode 100644
index 00000000..4951ffd0
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxTextureCoords.shader_test
@@ -0,0 +1,28 @@
+# [description]
+# Tests for GLSL 1.20 minimum maximums for the builtin constants.
+#
+# See the GLSL 1.20.8 specification, section 7.4, page 49 (page 55 of the PDF).
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+void main(void)
+{
+ gl_Position = gl_Vertex;
+}
+
+[fragment shader]
+#version 120
+void main(void)
+{
+ if (gl_MaxTextureCoords >= 2)
+ gl_FragColor = vec4(0, 1, 0, 0);
+ else
+ gl_FragColor = vec4(1, 0, 0, 0);
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxTextureImageUnits.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxTextureImageUnits.shader_test
new file mode 100644
index 00000000..e32faae1
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxTextureImageUnits.shader_test
@@ -0,0 +1,28 @@
+# [description]
+# Tests for GLSL 1.20 minimum maximums for the builtin constants.
+#
+# See the GLSL 1.20.8 specification, section 7.4, page 49 (page 55 of the PDF).
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+void main(void)
+{
+ gl_Position = gl_Vertex;
+}
+
+[fragment shader]
+#version 120
+void main(void)
+{
+ if (gl_MaxTextureImageUnits >= 2)
+ gl_FragColor = vec4(0, 1, 0, 0);
+ else
+ gl_FragColor = vec4(1, 0, 0, 0);
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxTextureUnits.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxTextureUnits.shader_test
new file mode 100644
index 00000000..52bb5f60
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxTextureUnits.shader_test
@@ -0,0 +1,28 @@
+# [description]
+# Tests for GLSL 1.20 minimum maximums for the builtin constants.
+#
+# See the GLSL 1.20.8 specification, section 7.4, page 49 (page 55 of the PDF).
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+void main(void)
+{
+ gl_Position = gl_Vertex;
+}
+
+[fragment shader]
+#version 120
+void main(void)
+{
+ if (gl_MaxTextureUnits >= 2)
+ gl_FragColor = vec4(0, 1, 0, 0);
+ else
+ gl_FragColor = vec4(1, 0, 0, 0);
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxVaryingFloats.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxVaryingFloats.shader_test
new file mode 100644
index 00000000..2116faa0
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxVaryingFloats.shader_test
@@ -0,0 +1,28 @@
+# [description]
+# Tests for GLSL 1.20 minimum maximums for the builtin constants.
+#
+# See the GLSL 1.20.8 specification, section 7.4, page 49 (page 55 of the PDF).
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+void main(void)
+{
+ gl_Position = gl_Vertex;
+}
+
+[fragment shader]
+#version 120
+void main(void)
+{
+ if (gl_MaxVaryingFloats >= 32)
+ gl_FragColor = vec4(0, 1, 0, 0);
+ else
+ gl_FragColor = vec4(1, 0, 0, 0);
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxVertexAttribs.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxVertexAttribs.shader_test
new file mode 100644
index 00000000..531fe71b
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxVertexAttribs.shader_test
@@ -0,0 +1,28 @@
+# [description]
+# Tests for GLSL 1.20 minimum maximums for the builtin constants.
+#
+# See the GLSL 1.20.8 specification, section 7.4, page 49 (page 55 of the PDF).
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+void main(void)
+{
+ gl_Position = gl_Vertex;
+}
+
+[fragment shader]
+#version 120
+void main(void)
+{
+ if (gl_MaxVertexAttribs >= 16)
+ gl_FragColor = vec4(0, 1, 0, 0);
+ else
+ gl_FragColor = vec4(1, 0, 0, 0);
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxVertexTextureImageUnits.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxVertexTextureImageUnits.shader_test
new file mode 100644
index 00000000..38fa6475
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxVertexTextureImageUnits.shader_test
@@ -0,0 +1,28 @@
+# [description]
+# Tests for GLSL 1.20 minimum maximums for the builtin constants.
+#
+# See the GLSL 1.20.8 specification, section 7.4, page 49 (page 55 of the PDF).
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+void main(void)
+{
+ gl_Position = gl_Vertex;
+}
+
+[fragment shader]
+#version 120
+void main(void)
+{
+ if (gl_MaxVertexTextureImageUnits >= 0)
+ gl_FragColor = vec4(0, 1, 0, 0);
+ else
+ gl_FragColor = vec4(1, 0, 0, 0);
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxVertexUniformComponents.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxVertexUniformComponents.shader_test
new file mode 100644
index 00000000..ae3b7298
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/maximums/gl_MaxVertexUniformComponents.shader_test
@@ -0,0 +1,28 @@
+# [description]
+# Tests for GLSL 1.20 minimum maximums for the builtin constants.
+#
+# See the GLSL 1.20.8 specification, section 7.4, page 49 (page 55 of the PDF).
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+void main(void)
+{
+ gl_Position = gl_Vertex;
+}
+
+[fragment shader]
+#version 120
+void main(void)
+{
+ if (gl_MaxVertexUniformComponents >= 512)
+ gl_FragColor = vec4(0, 1, 0, 0);
+ else
+ gl_FragColor = vec4(1, 0, 0, 0);
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.0 1.0 0.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/maximums/maximums.out b/tests/spec/glsl-es-1.00/execution/1.20/maximums/maximums.out
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/maximums/maximums.out
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/outerProduct-const.sh b/tests/spec/glsl-es-1.00/execution/1.20/outerProduct-const.sh
new file mode 100644
index 00000000..18ba5d03
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/outerProduct-const.sh
@@ -0,0 +1,221 @@
+#!/bin/bash
+
+function emit_conversion_info
+{
+cat <<EOF
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+EOF
+}
+
+function emit_outerProduct_const_data
+{
+ c=$1
+ r=$2
+ vtype=$3
+ mtype=$4
+
+ cbase=$5
+ cvec=""
+ for i in $(seq $c); do
+ v=$(($i + $cbase))
+ if [ "x$cvec" == "x" ]; then
+ cvec="${v}"
+ else
+ cvec="${cvec}, ${v}"
+ fi
+ done
+
+ rbase=$(($cbase + $c))
+ rvec=""
+ for i in $(seq $r); do
+ v=$(($i + $rbase))
+ if [ "x$rvec" == "x" ]; then
+ rvec="${v}"
+ else
+ rvec="${rvec}, ${v}"
+ fi
+ done
+
+ expected=""
+ for i in $(seq $r); do
+ for j in $(seq $c); do
+ m=$((($i + $rbase) * ($j + $cbase)))
+ if [ "x$expected" == "x" ]; then
+ expected="${m}"
+ else
+ expected="${expected}, ${m}"
+ fi
+ done
+ done
+
+ echo
+ echo "const ${vtype}${c} c = ${vtype}${c}(${cvec});"
+ echo "const ${vtype}${r} r = ${vtype}${r}(${rvec});"
+ echo "uniform ${mtype} expected = ${mtype}(${expected});"
+
+}
+
+function emit_vs_test
+{
+ c=$1
+ r=$2
+ vtype=$3
+ mat=$4
+
+ if [ "$vtype" = "ivec" ]; then
+ name="vs-outerProduct-const-${mat}-ivec.shader_test"
+ else
+ name="vs-outerProduct-const-${mat}.shader_test"
+ fi
+
+ if [ $c -ne $r ]; then
+ GL_require="# glUniformMatrix${r}x${c}fv only exists in OpenGL 2.1 or later.
+
+"
+ else
+ GL_require=""
+ fi
+
+ cat > $name <<EOF
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+$GL_require
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+EOF
+
+ if [ "$vtype" = "ivec" ]; then
+ emit_conversion_info >> $name
+ fi
+
+ echo "" >> $name
+ emit_outerProduct_const_data $c $r $vtype $mat 1 >> $name
+
+ cat >> $name <<EOF
+varying vec4 color;
+
+void main() {
+ gl_Position = vertex;
+ gl_Position *= proj;
+ ${mat} result = outerProduct(c, r);
+ color = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[fragment shader]
+
+varying vec4 color;
+void main() { gl_FragColor = color; }
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+EOF
+}
+
+function emit_fs_test
+{
+ c=$1
+ r=$2
+ vtype=$3
+ mat=$4
+
+ if [ "$vtype" = "ivec" ]; then
+ name="fs-outerProduct-const-${mat}-ivec.shader_test"
+ else
+ name="fs-outerProduct-const-${mat}.shader_test"
+ fi
+
+ if [ $c -ne $r ]; then
+ GL_require="# glUniformMatrix${r}x${c}fv only exists in OpenGL 2.1 or later.
+
+"
+ else
+ GL_require=""
+ fi
+
+ cat > $name <<EOF
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+$GL_require
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+EOF
+
+ if [ "$vtype" = "ivec" ]; then
+ emit_conversion_info >> $name
+ fi
+
+ echo "" >> $name
+ emit_outerProduct_const_data $c $r $vtype $mat 1 >> $name
+
+ cat >> $name <<EOF
+
+void main() {
+ ${mat} result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+
+draw rect 10 10 10 10
+probe rgb 15 15 0.0 1.0 0.0
+EOF
+}
+
+for c in 2 3 4; do
+ for r in 2 3 4; do
+ emit_vs_test $c $r vec "mat${r}x${c}"
+ emit_vs_test $c $r ivec "mat${r}x${c}"
+ emit_fs_test $c $r vec "mat${r}x${c}"
+ emit_fs_test $c $r ivec "mat${r}x${c}"
+ if [ $c -eq $r ]; then
+ emit_vs_test $c $r vec "mat${r}"
+ emit_vs_test $c $r ivec "mat${r}"
+ emit_fs_test $c $r vec "mat${r}"
+ emit_fs_test $c $r ivec "mat${r}"
+ fi
+ done
+done
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/outerProduct.sh b/tests/spec/glsl-es-1.00/execution/1.20/outerProduct.sh
new file mode 100644
index 00000000..98d5d98c
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/outerProduct.sh
@@ -0,0 +1,217 @@
+#!/bin/bash
+
+function emit_conversion_info
+{
+cat <<EOF
+/* From page 43 (page 49 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "If an exact match is found, the other signatures are ignored, and the
+ * exact match is used. Otherwise, if no exact match is found, then the
+ * implicit conversions in Section 4.1.10 "Implicit Conversions" will be
+ * applied to the calling arguments if this can make their types match a
+ * signature."
+ *
+ * From page 20 (page 26 of the PDF) of the GLSL 1.20 spec:
+ *
+ * "In some situations, an expression and its type will be implicitly
+ * converted to a different type. The following table shows all allowed
+ * implicit conversions:
+ *
+ * Type of expression Can be implicitly converted to
+ * int float
+ * ivec2 vec2
+ * ivec3 vec3
+ * ivec4 vec4"
+ */
+EOF
+}
+
+function emit_outerProduct_data
+{
+ c=$1
+ r=$2
+ vtype=$3
+
+ cbase=$4
+ cvec=""
+ for i in $(seq $c); do
+ v=$(($i + $cbase))
+ cvec="${cvec} ${v}"
+ done
+
+ rbase=$(($cbase + $c))
+ rvec=""
+ for i in $(seq $r); do
+ v=$(($i + $rbase))
+ rvec="${rvec} ${v}"
+ done
+
+ mat=""
+ for i in $(seq $r); do
+ for j in $(seq $c); do
+ m=$((($i + $rbase) * ($j + $cbase)))
+ mat="${mat} ${m}"
+ done
+ done
+
+ echo
+ echo "uniform ${vtype}${c} c ${cvec}"
+ echo "uniform ${vtype}${r} r ${rvec}"
+ echo "uniform mat${r}x${c} expected ${mat}"
+
+ x=$((20 * $4 - 10))
+ echo "draw rect $x 10 10 10"
+ echo "probe rgb $(($x + 5)) 15 0.0 1.0 0.0"
+}
+
+function emit_vs_test
+{
+ c=$1
+ r=$2
+ vtype=$3
+ mat=$4
+
+ if [ "$vtype" = "ivec" ]; then
+ name="vs-outerProduct-${mat}-ivec.shader_test"
+ else
+ name="vs-outerProduct-${mat}.shader_test"
+ fi
+
+ if [ $c -ne $r ]; then
+ GL_require="# glUniformMatrix${r}x${c}fv only exists in OpenGL 2.1 or later.
+
+"
+ else
+ GL_require=""
+ fi
+
+ cat > $name <<EOF
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+$GL_require
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+EOF
+
+ if [ "$vtype" = "ivec" ]; then
+ emit_conversion_info >> $name
+ fi
+
+ cat >> $name <<EOF
+
+uniform ${vtype}${c} c;
+uniform ${vtype}${r} r;
+uniform ${mat} expected;
+varying vec4 color;
+
+void main() {
+ gl_Position = vertex;
+ gl_Position *= proj;
+ ${mat} result = outerProduct(c, r);
+ color = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[fragment shader]
+
+varying vec4 color;
+void main() { gl_FragColor = color; }
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+EOF
+
+ emit_outerProduct_data $c $r $vtype 1 >> $name
+ emit_outerProduct_data $c $r $vtype 2 >> $name
+ emit_outerProduct_data $c $r $vtype 3 >> $name
+ emit_outerProduct_data $c $r $vtype 4 >> $name
+}
+
+function emit_fs_test
+{
+ c=$1
+ r=$2
+ vtype=$3
+ mat=$4
+
+ if [ "$vtype" = "ivec" ]; then
+ name="fs-outerProduct-${mat}-ivec.shader_test"
+ else
+ name="fs-outerProduct-${mat}.shader_test"
+ fi
+
+ if [ $c -ne $r ]; then
+ GL_require="# glUniformMatrix${r}x${c}fv only exists in OpenGL 2.1 or later.
+
+"
+ else
+ GL_require=""
+ fi
+
+ cat > $name <<EOF
+[require]
+GLSL >= 1.00 es
+GL >= 2.0 es
+$GL_require
+[vertex shader]
+attribute vec4 vertex;
+mat4 proj = mat4(
+ 2.0/250.0, 0.0, 0.0, -1.0,
+ 0.0, 2.0/250.0, 0.0, -1.0,
+ 0.0, 0.0, -1.0, 0.0,
+ 0.0, 0.0, 0.0, 1.0);
+
+void main() { gl_Position = vertex;
+ gl_Position *= proj; }
+
+[fragment shader]
+EOF
+
+ if [ "$vtype" = "ivec" ]; then
+ emit_conversion_info >> $name
+ fi
+
+ cat >> $name <<EOF
+
+uniform ${vtype}${c} c;
+uniform ${vtype}${r} r;
+uniform ${mat} expected;
+
+void main() {
+ ${mat} result = outerProduct(c, r);
+ gl_FragColor = (result == expected) ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.0
+clear
+
+EOF
+
+ emit_outerProduct_data $c $r $vtype 1 >> $name
+ emit_outerProduct_data $c $r $vtype 2 >> $name
+ emit_outerProduct_data $c $r $vtype 3 >> $name
+ emit_outerProduct_data $c $r $vtype 4 >> $name
+}
+
+for c in 2 3 4; do
+ for r in 2 3 4; do
+ emit_vs_test $c $r vec "mat${r}x${c}"
+ emit_vs_test $c $r ivec "mat${r}x${c}"
+ emit_fs_test $c $r vec "mat${r}x${c}"
+ emit_fs_test $c $r ivec "mat${r}x${c}"
+ if [ $c -eq $r ]; then
+ emit_vs_test $c $r vec "mat${r}"
+ emit_vs_test $c $r ivec "mat${r}"
+ emit_fs_test $c $r vec "mat${r}"
+ emit_fs_test $c $r ivec "mat${r}"
+ fi
+ done
+done
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/qualifiers/qualifiers.out b/tests/spec/glsl-es-1.00/execution/1.20/qualifiers/qualifiers.out
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/qualifiers/qualifiers.out
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/qualifiers/vs-out-conversion-int-int-float-to-float-float-float-return.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/qualifiers/vs-out-conversion-int-int-float-to-float-float-float-return.shader_test
new file mode 100644
index 00000000..15743c53
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/qualifiers/vs-out-conversion-int-int-float-to-float-float-float-return.shader_test
@@ -0,0 +1,46 @@
+# Test that implicit type conversion of out parameters works properly.
+#
+# From the GLSL 1.30 spec (which clarifies, but does not change, the
+# rules for implicit type conversion in GLSL 1.20), section 6.1
+# (Function Definitions):
+#
+# Mismatched types on output parameters (out or inout) must have a
+# conversion from the formal parameter type to the calling argument
+# type.
+#
+# This test uses a complex function signature with three out
+# parameters of various types, and a return value, to make sure the
+# outputs aren't mixed up.
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+float f(out int x, out int y, out float z)
+{
+ x = 4;
+ y = 5;
+ z = 0.75;
+ return 0.5;
+}
+
+void main()
+{
+ gl_Position = gl_Vertex;
+ float value1;
+ float value2;
+ float value3;
+ float value4 = f(value1, value2, value3);
+ gl_FrontColor = vec4(1.0/value1, 1.0/value2, value3, value4);
+}
+
+[fragment shader]
+void main()
+{
+ gl_FragColor = gl_Color;
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.25 0.2 0.75 0.5
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/qualifiers/vs-out-conversion-int-to-float-return.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/qualifiers/vs-out-conversion-int-to-float-return.shader_test
new file mode 100644
index 00000000..cf7f2b9f
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/qualifiers/vs-out-conversion-int-to-float-return.shader_test
@@ -0,0 +1,41 @@
+# Test that implicit type conversion of out parameters works properly.
+#
+# From the GLSL 1.30 spec (which clarifies, but does not change, the
+# rules for implicit type conversion in GLSL 1.20), section 6.1
+# (Function Definitions):
+#
+# Mismatched types on output parameters (out or inout) must have a
+# conversion from the formal parameter type to the calling argument
+# type.
+#
+# This test uses a simple function returning float and taking a single
+# out parameter.
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+float f(out int x)
+{
+ x = 4;
+ return 0.5;
+}
+
+void main()
+{
+ gl_Position = gl_Vertex;
+ float value1;
+ float value2 = f(value1);
+ gl_FrontColor = vec4(1.0/value1, value2, 0.0, 0.0);
+}
+
+[fragment shader]
+void main()
+{
+ gl_FragColor = gl_Color;
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.25 0.5 0.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/qualifiers/vs-out-conversion-int-to-float.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/qualifiers/vs-out-conversion-int-to-float.shader_test
new file mode 100644
index 00000000..2c3a2ce7
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/qualifiers/vs-out-conversion-int-to-float.shader_test
@@ -0,0 +1,40 @@
+# Test that implicit type conversion of out parameters works properly.
+#
+# From the GLSL 1.30 spec (which clarifies, but does not change, the
+# rules for implicit type conversion in GLSL 1.20), section 6.1
+# (Function Definitions):
+#
+# Mismatched types on output parameters (out or inout) must have a
+# conversion from the formal parameter type to the calling argument
+# type.
+#
+# This test uses a simple function returning void and taking a single
+# out parameter.
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+void f(out int x)
+{
+ x = 4;
+}
+
+void main()
+{
+ gl_Position = gl_Vertex;
+ float value;
+ f(value);
+ gl_FrontColor = vec4(1.0/value);
+}
+
+[fragment shader]
+void main()
+{
+ gl_FragColor = gl_Color;
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgba 0.25 0.25 0.25 0.25
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/uniform-initializer/fs-structure-array.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/uniform-initializer/fs-structure-array.shader_test
new file mode 100644
index 00000000..36f56444
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/uniform-initializer/fs-structure-array.shader_test
@@ -0,0 +1,48 @@
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+
+void main()
+{
+ gl_Position = gl_Vertex;
+}
+
+[fragment shader]
+#version 120
+
+struct S {
+ int i;
+ float f;
+ vec4 v[2];
+};
+
+uniform S s[2] = S[2](S(9, 33.3, vec4[2](vec4(1, 2, 3, 4),
+ vec4(9, 8, 7, 6))),
+ S(7, 22.2, vec4[2](vec4(5, 6, 7, 8),
+ vec4(3, 2, 1, 0))));
+
+void main()
+{
+ vec4 color;
+
+ if (s[0].i == 9
+ && s[0].f == 33.3
+ && s[0].v[0] == vec4(1, 2, 3, 4)
+ && s[0].v[1] == vec4(9, 8, 7, 6)
+ && s[1].i == 7
+ && s[1].f == 22.2
+ && s[1].v[0] == vec4(5, 6, 7, 8)
+ && s[1].v[1] == vec4(3, 2, 1, 0)) {
+ color = vec4(0, 1, 0, 1);
+ } else {
+ color = vec4(1, 0, 0, 1);
+ }
+
+ gl_FragColor = color;
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgb 0 1 0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/uniform-initializer/fs-structure.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/uniform-initializer/fs-structure.shader_test
new file mode 100644
index 00000000..3b0c9509
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/uniform-initializer/fs-structure.shader_test
@@ -0,0 +1,44 @@
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+
+void main()
+{
+ gl_Position = gl_Vertex;
+}
+
+[fragment shader]
+#version 120
+varying vec4 color;
+
+struct S {
+ int i;
+ float f;
+ vec4 v[2];
+};
+
+uniform S s = S(9, 33.3, vec4[2](vec4(1, 2, 3, 4),
+ vec4(9, 8, 7, 6)));
+
+void main()
+{
+ vec4 color;
+
+ if (s.i == 9
+ && s.f == 33.3
+ && s.v[0] == vec4(1, 2, 3, 4)
+ && s.v[1] == vec4(9, 8, 7, 6)) {
+ color = vec4(0, 1, 0, 1);
+ } else {
+ color = vec4(1, 0, 0, 1);
+ }
+
+
+ gl_FragColor = color;
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgb 0 1 0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/uniform-initializer/uniform-initializer.out b/tests/spec/glsl-es-1.00/execution/1.20/uniform-initializer/uniform-initializer.out
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/uniform-initializer/uniform-initializer.out
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/uniform-initializer/vs-structure-array.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/uniform-initializer/vs-structure-array.shader_test
new file mode 100644
index 00000000..7b8bd508
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/uniform-initializer/vs-structure-array.shader_test
@@ -0,0 +1,48 @@
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+
+struct S {
+ int i;
+ float f;
+ vec4 v[2];
+};
+
+uniform S s[2] = S[2](S(9, 33.3, vec4[2](vec4(1, 2, 3, 4),
+ vec4(9, 8, 7, 6))),
+ S(7, 22.2, vec4[2](vec4(5, 6, 7, 8),
+ vec4(3, 2, 1, 0))));
+varying vec4 color;
+
+void main()
+{
+ if (s[0].i == 9
+ && s[0].f == 33.3
+ && s[0].v[0] == vec4(1, 2, 3, 4)
+ && s[0].v[1] == vec4(9, 8, 7, 6)
+ && s[1].i == 7
+ && s[1].f == 22.2
+ && s[1].v[0] == vec4(5, 6, 7, 8)
+ && s[1].v[1] == vec4(3, 2, 1, 0)) {
+ color = vec4(0, 1, 0, 1);
+ } else {
+ color = vec4(1, 0, 0, 1);
+ }
+
+ gl_Position = gl_Vertex;
+}
+
+[fragment shader]
+#version 120
+varying vec4 color;
+
+void main()
+{
+ gl_FragColor = color;
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgb 0 1 0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/uniform-initializer/vs-structure.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/uniform-initializer/vs-structure.shader_test
new file mode 100644
index 00000000..f2fa32d1
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/uniform-initializer/vs-structure.shader_test
@@ -0,0 +1,42 @@
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+#version 120
+
+struct S {
+ int i;
+ float f;
+ vec4 v[2];
+};
+
+uniform S s = S(9, 33.3, vec4[2](vec4(1, 2, 3, 4),
+ vec4(9, 8, 7, 6)));
+varying vec4 color;
+
+void main()
+{
+ if (s.i == 9
+ && s.f == 33.3
+ && s.v[0] == vec4(1, 2, 3, 4)
+ && s.v[1] == vec4(9, 8, 7, 6)) {
+ color = vec4(0, 1, 0, 1);
+ } else {
+ color = vec4(1, 0, 0, 1);
+ }
+
+ gl_Position = gl_Vertex;
+}
+
+[fragment shader]
+#version 120
+varying vec4 color;
+
+void main()
+{
+ gl_FragColor = color;
+}
+
+[test]
+draw rect -1 -1 2 2
+probe all rgb 0 1 0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-col-rd.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-col-rd.shader_test
new file mode 100644
index 00000000..63d9533e
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-col-rd.shader_test
@@ -0,0 +1,46 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-read.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+uniform int col;
+uniform vec2 expect;
+varying vec4 color;
+
+void main()
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+}
+
+[fragment shader]
+uniform int col;
+uniform vec2 expect;
+varying vec4 color;
+
+void main()
+{
+ mat2x2[3] m = mat2x2[3](
+ mat2x2(1.0, 2.0, 3.0, 4.0),
+ mat2x2(5.0, 6.0, 7.0, 8.0),
+ mat2x2(9.0, 10.0, 11.0, 12.0));
+
+ gl_FragColor = (m[1][col] == expect)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int col 0
+uniform vec2 expect 5 6
+draw rect 45 5 10 10
+probe rgb 50 10 0.0 1.0 0.0
+
+uniform int col 1
+uniform vec2 expect 7 8
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-col-row-rd.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-col-row-rd.shader_test
new file mode 100644
index 00000000..4966e069
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-col-row-rd.shader_test
@@ -0,0 +1,60 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-read.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+uniform int col;
+uniform int row;
+uniform float expect;
+varying vec4 color;
+
+void main()
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+}
+
+[fragment shader]
+uniform int col;
+uniform int row;
+uniform float expect;
+varying vec4 color;
+
+void main()
+{
+ mat2x2[3] m = mat2x2[3](
+ mat2x2(1.0, 2.0, 3.0, 4.0),
+ mat2x2(5.0, 6.0, 7.0, 8.0),
+ mat2x2(9.0, 10.0, 11.0, 12.0));
+
+ gl_FragColor = (m[1][col][row] == expect)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int col 0
+uniform int row 0
+uniform float expect 5
+draw rect 45 5 10 10
+probe rgb 50 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 6
+draw rect 45 20 10 10
+probe rgb 50 25 0.0 1.0 0.0
+
+uniform int col 1
+uniform int row 0
+uniform float expect 7
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 8
+draw rect 60 20 10 10
+probe rgb 65 25 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-col-row-wr.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-col-row-wr.shader_test
new file mode 100644
index 00000000..5bc8ebf0
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-col-row-wr.shader_test
@@ -0,0 +1,75 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-write.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+void main() { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; }
+
+[fragment shader]
+uniform mat2x2 src_matrix;
+uniform vec2 v;
+uniform vec2 expect;
+uniform int index;
+uniform int row;
+uniform int col;
+uniform float value;
+
+void main()
+{
+ mat2x2[3] dst_matrix = mat2x2[3](mat2x2(0.0), mat2x2(0.0), mat2x2(0.0));
+
+ /* Patch the supplied matrix with the supplied value. If the resulting
+ * matrix is correct, it will transform the input vector to the expected
+ * value. Verify that the distance between the result and the expected
+ * vector is less than epsilon.
+ *
+ * NOTE: This test assumes that reads of arrays using non-constant
+ * indicies works correctly. If reads and writes happen to fail in an
+ * identical manner, this test may give false positives.
+ */
+ dst_matrix[1] = src_matrix;
+ dst_matrix[1][col][row] = value;
+ gl_FragColor = (distance(dst_matrix[1] * v, expect) < 1e-6)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int col 0
+uniform int row 0
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 666.0 0.861223395812970 0.603473877011433 0.891622340451180
+uniform float value 0.241498998195656
+draw rect 45 5 10 10
+probe rgb 50 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 666.0 0.603473877011433 0.891622340451180
+uniform float value 0.861223395812970
+draw rect 45 20 10 10
+probe rgb 50 25 0.0 1.0 0.0
+
+uniform int col 1
+uniform int row 0
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 666.0 0.891622340451180
+uniform float value 0.603473877011433
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 0.603473877011433 666.0
+uniform float value 0.891622340451180
+draw rect 60 20 10 10
+probe rgb 65 25 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-col-wr.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-col-wr.shader_test
new file mode 100644
index 00000000..32eeaf98
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-col-wr.shader_test
@@ -0,0 +1,56 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-write.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+void main() { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; }
+
+[fragment shader]
+uniform mat2x2 src_matrix;
+uniform vec2 v;
+uniform vec2 expect;
+uniform int index;
+uniform int col;
+uniform vec2 value;
+
+void main()
+{
+ mat2x2[3] dst_matrix = mat2x2[3](mat2x2(0.0), mat2x2(0.0), mat2x2(0.0));
+
+ /* Patch the supplied matrix with the supplied value. If the resulting
+ * matrix is correct, it will transform the input vector to the expected
+ * value. Verify that the distance between the result and the expected
+ * vector is less than epsilon.
+ *
+ * NOTE: This test assumes that reads of arrays using non-constant
+ * indicies works correctly. If reads and writes happen to fail in an
+ * identical manner, this test may give false positives.
+ */
+ dst_matrix[1] = src_matrix;
+ dst_matrix[1][col] = value;
+ gl_FragColor = (distance(dst_matrix[1] * v, expect) < 1e-6)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int col 0
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 666.0 777.0 0.603473877011433 0.891622340451180
+uniform vec2 value 0.241498998195656 0.861223395812970
+draw rect 45 5 10 10
+probe rgb 50 10 0.0 1.0 0.0
+
+uniform int col 1
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 666.0 777.0
+uniform vec2 value 0.603473877011433 0.891622340451180
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-col-rd.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-col-rd.shader_test
new file mode 100644
index 00000000..61df7269
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-col-rd.shader_test
@@ -0,0 +1,71 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-read.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+uniform int index;
+uniform int col;
+uniform vec2 expect;
+varying vec4 color;
+
+void main()
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+}
+
+[fragment shader]
+uniform int index;
+uniform int col;
+uniform vec2 expect;
+varying vec4 color;
+
+void main()
+{
+ mat2x2[3] m = mat2x2[3](
+ mat2x2(1.0, 2.0, 3.0, 4.0),
+ mat2x2(5.0, 6.0, 7.0, 8.0),
+ mat2x2(9.0, 10.0, 11.0, 12.0));
+
+ gl_FragColor = (m[index][col] == expect)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int index 0
+uniform int col 0
+uniform vec2 expect 1 2
+draw rect 5 5 10 10
+probe rgb 10 10 0.0 1.0 0.0
+
+uniform int col 1
+uniform vec2 expect 3 4
+draw rect 20 5 10 10
+probe rgb 25 10 0.0 1.0 0.0
+
+uniform int index 1
+uniform int col 0
+uniform vec2 expect 5 6
+draw rect 45 5 10 10
+probe rgb 50 10 0.0 1.0 0.0
+
+uniform int col 1
+uniform vec2 expect 7 8
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
+
+uniform int index 2
+uniform int col 0
+uniform vec2 expect 9 10
+draw rect 85 5 10 10
+probe rgb 90 10 0.0 1.0 0.0
+
+uniform int col 1
+uniform vec2 expect 11 12
+draw rect 100 5 10 10
+probe rgb 105 10 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-col-row-rd.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-col-row-rd.shader_test
new file mode 100644
index 00000000..568bbeb1
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-col-row-rd.shader_test
@@ -0,0 +1,109 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-read.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+uniform int index;
+uniform int col;
+uniform int row;
+uniform float expect;
+varying vec4 color;
+
+void main()
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+}
+
+[fragment shader]
+uniform int index;
+uniform int col;
+uniform int row;
+uniform float expect;
+varying vec4 color;
+
+void main()
+{
+ mat2x2[3] m = mat2x2[3](
+ mat2x2(1.0, 2.0, 3.0, 4.0),
+ mat2x2(5.0, 6.0, 7.0, 8.0),
+ mat2x2(9.0, 10.0, 11.0, 12.0));
+
+ gl_FragColor = (m[index][col][row] == expect)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int index 0
+uniform int col 0
+uniform int row 0
+uniform float expect 1
+draw rect 5 5 10 10
+probe rgb 10 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 2
+draw rect 5 20 10 10
+probe rgb 10 25 0.0 1.0 0.0
+
+uniform int col 1
+uniform int row 0
+uniform float expect 3
+draw rect 20 5 10 10
+probe rgb 25 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 4
+draw rect 20 20 10 10
+probe rgb 25 25 0.0 1.0 0.0
+
+uniform int index 1
+uniform int col 0
+uniform int row 0
+uniform float expect 5
+draw rect 45 5 10 10
+probe rgb 50 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 6
+draw rect 45 20 10 10
+probe rgb 50 25 0.0 1.0 0.0
+
+uniform int col 1
+uniform int row 0
+uniform float expect 7
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 8
+draw rect 60 20 10 10
+probe rgb 65 25 0.0 1.0 0.0
+
+uniform int index 2
+uniform int col 0
+uniform int row 0
+uniform float expect 9
+draw rect 85 5 10 10
+probe rgb 90 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 10
+draw rect 85 20 10 10
+probe rgb 90 25 0.0 1.0 0.0
+
+uniform int col 1
+uniform int row 0
+uniform float expect 11
+draw rect 100 5 10 10
+probe rgb 105 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 12
+draw rect 100 20 10 10
+probe rgb 105 25 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-col-row-wr.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-col-row-wr.shader_test
new file mode 100644
index 00000000..eca3415e
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-col-row-wr.shader_test
@@ -0,0 +1,146 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-write.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+void main() { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; }
+
+[fragment shader]
+uniform mat2x2 src_matrix;
+uniform vec2 v;
+uniform vec2 expect;
+uniform int index;
+uniform int row;
+uniform int col;
+uniform float value;
+
+void main()
+{
+ mat2x2[3] dst_matrix = mat2x2[3](mat2x2(0.0), mat2x2(0.0), mat2x2(0.0));
+
+ /* Patch the supplied matrix with the supplied value. If the resulting
+ * matrix is correct, it will transform the input vector to the expected
+ * value. Verify that the distance between the result and the expected
+ * vector is less than epsilon.
+ *
+ * NOTE: This test assumes that reads of arrays using non-constant
+ * indicies works correctly. If reads and writes happen to fail in an
+ * identical manner, this test may give false positives.
+ */
+ dst_matrix[index] = src_matrix;
+ dst_matrix[index][col][row] = value;
+ gl_FragColor = (distance(dst_matrix[index] * v, expect) < 1e-6)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int index 0
+uniform int col 0
+uniform int row 0
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 666.0 0.861223395812970 0.603473877011433 0.891622340451180
+uniform float value 0.241498998195656
+draw rect 5 5 10 10
+probe rgb 10 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 666.0 0.603473877011433 0.891622340451180
+uniform float value 0.861223395812970
+draw rect 5 20 10 10
+probe rgb 10 25 0.0 1.0 0.0
+
+uniform int col 1
+uniform int row 0
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 666.0 0.891622340451180
+uniform float value 0.603473877011433
+draw rect 20 5 10 10
+probe rgb 25 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 0.603473877011433 666.0
+uniform float value 0.891622340451180
+draw rect 20 20 10 10
+probe rgb 25 25 0.0 1.0 0.0
+
+uniform int index 1
+uniform int col 0
+uniform int row 0
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 666.0 0.861223395812970 0.603473877011433 0.891622340451180
+uniform float value 0.241498998195656
+draw rect 45 5 10 10
+probe rgb 50 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 666.0 0.603473877011433 0.891622340451180
+uniform float value 0.861223395812970
+draw rect 45 20 10 10
+probe rgb 50 25 0.0 1.0 0.0
+
+uniform int col 1
+uniform int row 0
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 666.0 0.891622340451180
+uniform float value 0.603473877011433
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 0.603473877011433 666.0
+uniform float value 0.891622340451180
+draw rect 60 20 10 10
+probe rgb 65 25 0.0 1.0 0.0
+
+uniform int index 2
+uniform int col 0
+uniform int row 0
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 666.0 0.861223395812970 0.603473877011433 0.891622340451180
+uniform float value 0.241498998195656
+draw rect 85 5 10 10
+probe rgb 90 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 666.0 0.603473877011433 0.891622340451180
+uniform float value 0.861223395812970
+draw rect 85 20 10 10
+probe rgb 90 25 0.0 1.0 0.0
+
+uniform int col 1
+uniform int row 0
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 666.0 0.891622340451180
+uniform float value 0.603473877011433
+draw rect 100 5 10 10
+probe rgb 105 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 0.603473877011433 666.0
+uniform float value 0.891622340451180
+draw rect 100 20 10 10
+probe rgb 105 25 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-col-wr.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-col-wr.shader_test
new file mode 100644
index 00000000..df1d6437
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-col-wr.shader_test
@@ -0,0 +1,91 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-write.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+void main() { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; }
+
+[fragment shader]
+uniform mat2x2 src_matrix;
+uniform vec2 v;
+uniform vec2 expect;
+uniform int index;
+uniform int col;
+uniform vec2 value;
+
+void main()
+{
+ mat2x2[3] dst_matrix = mat2x2[3](mat2x2(0.0), mat2x2(0.0), mat2x2(0.0));
+
+ /* Patch the supplied matrix with the supplied value. If the resulting
+ * matrix is correct, it will transform the input vector to the expected
+ * value. Verify that the distance between the result and the expected
+ * vector is less than epsilon.
+ *
+ * NOTE: This test assumes that reads of arrays using non-constant
+ * indicies works correctly. If reads and writes happen to fail in an
+ * identical manner, this test may give false positives.
+ */
+ dst_matrix[index] = src_matrix;
+ dst_matrix[index][col] = value;
+ gl_FragColor = (distance(dst_matrix[index] * v, expect) < 1e-6)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int index 0
+uniform int col 0
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 666.0 777.0 0.603473877011433 0.891622340451180
+uniform vec2 value 0.241498998195656 0.861223395812970
+draw rect 5 5 10 10
+probe rgb 10 10 0.0 1.0 0.0
+
+uniform int col 1
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 666.0 777.0
+uniform vec2 value 0.603473877011433 0.891622340451180
+draw rect 20 5 10 10
+probe rgb 25 10 0.0 1.0 0.0
+
+uniform int index 1
+uniform int col 0
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 666.0 777.0 0.603473877011433 0.891622340451180
+uniform vec2 value 0.241498998195656 0.861223395812970
+draw rect 45 5 10 10
+probe rgb 50 10 0.0 1.0 0.0
+
+uniform int col 1
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 666.0 777.0
+uniform vec2 value 0.603473877011433 0.891622340451180
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
+
+uniform int index 2
+uniform int col 0
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 666.0 777.0 0.603473877011433 0.891622340451180
+uniform vec2 value 0.241498998195656 0.861223395812970
+draw rect 85 5 10 10
+probe rgb 90 10 0.0 1.0 0.0
+
+uniform int col 1
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 666.0 777.0
+uniform vec2 value 0.603473877011433 0.891622340451180
+draw rect 100 5 10 10
+probe rgb 105 10 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-rd.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-rd.shader_test
new file mode 100644
index 00000000..aba81276
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-rd.shader_test
@@ -0,0 +1,51 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-read.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+uniform int index;
+uniform vec2 expect;
+varying vec4 color;
+
+void main()
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+}
+
+[fragment shader]
+uniform int index;
+uniform vec2 expect;
+varying vec4 color;
+
+void main()
+{
+ mat2x2[3] m = mat2x2[3](
+ mat2x2(1.0, 2.0, 3.0, 4.0),
+ mat2x2(5.0, 6.0, 7.0, 8.0),
+ mat2x2(9.0, 10.0, 11.0, 12.0));
+
+ gl_FragColor = (m[index][1] == expect)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int index 0
+uniform vec2 expect 3 4
+draw rect 20 5 10 10
+probe rgb 25 10 0.0 1.0 0.0
+
+uniform int index 1
+uniform vec2 expect 7 8
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
+
+uniform int index 2
+uniform vec2 expect 11 12
+draw rect 100 5 10 10
+probe rgb 105 10 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-row-rd.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-row-rd.shader_test
new file mode 100644
index 00000000..9f617442
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-row-rd.shader_test
@@ -0,0 +1,71 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-read.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+uniform int index;
+uniform int row;
+uniform float expect;
+varying vec4 color;
+
+void main()
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+}
+
+[fragment shader]
+uniform int index;
+uniform int row;
+uniform float expect;
+varying vec4 color;
+
+void main()
+{
+ mat2x2[3] m = mat2x2[3](
+ mat2x2(1.0, 2.0, 3.0, 4.0),
+ mat2x2(5.0, 6.0, 7.0, 8.0),
+ mat2x2(9.0, 10.0, 11.0, 12.0));
+
+ gl_FragColor = (m[index][1][row] == expect)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int index 0
+uniform int row 0
+uniform float expect 3
+draw rect 20 5 10 10
+probe rgb 25 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 4
+draw rect 20 20 10 10
+probe rgb 25 25 0.0 1.0 0.0
+
+uniform int index 1
+uniform int row 0
+uniform float expect 7
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 8
+draw rect 60 20 10 10
+probe rgb 65 25 0.0 1.0 0.0
+
+uniform int index 2
+uniform int row 0
+uniform float expect 11
+draw rect 100 5 10 10
+probe rgb 105 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 12
+draw rect 100 20 10 10
+probe rgb 105 25 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-row-wr.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-row-wr.shader_test
new file mode 100644
index 00000000..d4fff20a
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-row-wr.shader_test
@@ -0,0 +1,92 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-write.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+void main() { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; }
+
+[fragment shader]
+uniform mat2x2 src_matrix;
+uniform vec2 v;
+uniform vec2 expect;
+uniform int index;
+uniform int row;
+uniform int col;
+uniform float value;
+
+void main()
+{
+ mat2x2[3] dst_matrix = mat2x2[3](mat2x2(0.0), mat2x2(0.0), mat2x2(0.0));
+
+ /* Patch the supplied matrix with the supplied value. If the resulting
+ * matrix is correct, it will transform the input vector to the expected
+ * value. Verify that the distance between the result and the expected
+ * vector is less than epsilon.
+ *
+ * NOTE: This test assumes that reads of arrays using non-constant
+ * indicies works correctly. If reads and writes happen to fail in an
+ * identical manner, this test may give false positives.
+ */
+ dst_matrix[index] = src_matrix;
+ dst_matrix[index][1][row] = value;
+ gl_FragColor = (distance(dst_matrix[index] * v, expect) < 1e-6)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int index 0
+uniform int row 0
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 666.0 0.891622340451180
+uniform float value 0.603473877011433
+draw rect 20 5 10 10
+probe rgb 25 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 0.603473877011433 666.0
+uniform float value 0.891622340451180
+draw rect 20 20 10 10
+probe rgb 25 25 0.0 1.0 0.0
+
+uniform int index 1
+uniform int row 0
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 666.0 0.891622340451180
+uniform float value 0.603473877011433
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 0.603473877011433 666.0
+uniform float value 0.891622340451180
+draw rect 60 20 10 10
+probe rgb 65 25 0.0 1.0 0.0
+
+uniform int index 2
+uniform int row 0
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 666.0 0.891622340451180
+uniform float value 0.603473877011433
+draw rect 100 5 10 10
+probe rgb 105 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 0.603473877011433 666.0
+uniform float value 0.891622340451180
+draw rect 100 20 10 10
+probe rgb 105 25 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-wr.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-wr.shader_test
new file mode 100644
index 00000000..2ec45d99
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-index-wr.shader_test
@@ -0,0 +1,64 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-write.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+void main() { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; }
+
+[fragment shader]
+uniform mat2x2 src_matrix;
+uniform vec2 v;
+uniform vec2 expect;
+uniform int index;
+uniform int col;
+uniform vec2 value;
+
+void main()
+{
+ mat2x2[3] dst_matrix = mat2x2[3](mat2x2(0.0), mat2x2(0.0), mat2x2(0.0));
+
+ /* Patch the supplied matrix with the supplied value. If the resulting
+ * matrix is correct, it will transform the input vector to the expected
+ * value. Verify that the distance between the result and the expected
+ * vector is less than epsilon.
+ *
+ * NOTE: This test assumes that reads of arrays using non-constant
+ * indicies works correctly. If reads and writes happen to fail in an
+ * identical manner, this test may give false positives.
+ */
+ dst_matrix[index] = src_matrix;
+ dst_matrix[index][1] = value;
+ gl_FragColor = (distance(dst_matrix[index] * v, expect) < 1e-6)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int index 0
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 666.0 777.0
+uniform vec2 value 0.603473877011433 0.891622340451180
+draw rect 20 5 10 10
+probe rgb 25 10 0.0 1.0 0.0
+
+uniform int index 1
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 666.0 777.0
+uniform vec2 value 0.603473877011433 0.891622340451180
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
+
+uniform int index 2
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 666.0 777.0
+uniform vec2 value 0.603473877011433 0.891622340451180
+draw rect 100 5 10 10
+probe rgb 105 10 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-rd.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-rd.shader_test
new file mode 100644
index 00000000..572ea225
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-rd.shader_test
@@ -0,0 +1,38 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-read.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+uniform vec2 expect;
+varying vec4 color;
+
+void main()
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+}
+
+[fragment shader]
+uniform vec2 expect;
+varying vec4 color;
+
+void main()
+{
+ mat2x2[3] m = mat2x2[3](
+ mat2x2(1.0, 2.0, 3.0, 4.0),
+ mat2x2(5.0, 6.0, 7.0, 8.0),
+ mat2x2(9.0, 10.0, 11.0, 12.0));
+
+ gl_FragColor = (m[1][1] == expect)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform vec2 expect 7 8
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-row-rd.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-row-rd.shader_test
new file mode 100644
index 00000000..5219fd81
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-row-rd.shader_test
@@ -0,0 +1,46 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-read.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+uniform int row;
+uniform float expect;
+varying vec4 color;
+
+void main()
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+}
+
+[fragment shader]
+uniform int row;
+uniform float expect;
+varying vec4 color;
+
+void main()
+{
+ mat2x2[3] m = mat2x2[3](
+ mat2x2(1.0, 2.0, 3.0, 4.0),
+ mat2x2(5.0, 6.0, 7.0, 8.0),
+ mat2x2(9.0, 10.0, 11.0, 12.0));
+
+ gl_FragColor = (m[1][1][row] == expect)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int row 0
+uniform float expect 7
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 8
+draw rect 60 20 10 10
+probe rgb 65 25 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-row-wr.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-row-wr.shader_test
new file mode 100644
index 00000000..a9efc766
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-row-wr.shader_test
@@ -0,0 +1,57 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-write.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+void main() { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; }
+
+[fragment shader]
+uniform mat2x2 src_matrix;
+uniform vec2 v;
+uniform vec2 expect;
+uniform int index;
+uniform int row;
+uniform int col;
+uniform float value;
+
+void main()
+{
+ mat2x2[3] dst_matrix = mat2x2[3](mat2x2(0.0), mat2x2(0.0), mat2x2(0.0));
+
+ /* Patch the supplied matrix with the supplied value. If the resulting
+ * matrix is correct, it will transform the input vector to the expected
+ * value. Verify that the distance between the result and the expected
+ * vector is less than epsilon.
+ *
+ * NOTE: This test assumes that reads of arrays using non-constant
+ * indicies works correctly. If reads and writes happen to fail in an
+ * identical manner, this test may give false positives.
+ */
+ dst_matrix[1] = src_matrix;
+ dst_matrix[1][1][row] = value;
+ gl_FragColor = (distance(dst_matrix[1] * v, expect) < 1e-6)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int row 0
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 666.0 0.891622340451180
+uniform float value 0.603473877011433
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 0.603473877011433 666.0
+uniform float value 0.891622340451180
+draw rect 60 20 10 10
+probe rgb 65 25 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-wr.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-wr.shader_test
new file mode 100644
index 00000000..bdb4c0b6
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat2-wr.shader_test
@@ -0,0 +1,47 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-write.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+void main() { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; }
+
+[fragment shader]
+uniform mat2x2 src_matrix;
+uniform vec2 v;
+uniform vec2 expect;
+uniform int index;
+uniform int col;
+uniform vec2 value;
+
+void main()
+{
+ mat2x2[3] dst_matrix = mat2x2[3](mat2x2(0.0), mat2x2(0.0), mat2x2(0.0));
+
+ /* Patch the supplied matrix with the supplied value. If the resulting
+ * matrix is correct, it will transform the input vector to the expected
+ * value. Verify that the distance between the result and the expected
+ * vector is less than epsilon.
+ *
+ * NOTE: This test assumes that reads of arrays using non-constant
+ * indicies works correctly. If reads and writes happen to fail in an
+ * identical manner, this test may give false positives.
+ */
+ dst_matrix[1] = src_matrix;
+ dst_matrix[1][1] = value;
+ gl_FragColor = (distance(dst_matrix[1] * v, expect) < 1e-6)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform vec2 v 0.803161418975390 0.852987140792140
+uniform vec2 expect 0.708718134966688 1.452243795483797
+uniform mat2x2 src_matrix 0.241498998195656 0.861223395812970 666.0 777.0
+uniform vec2 value 0.603473877011433 0.891622340451180
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-col-rd.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-col-rd.shader_test
new file mode 100644
index 00000000..a07de223
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-col-rd.shader_test
@@ -0,0 +1,51 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-read.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+uniform int col;
+uniform vec3 expect;
+varying vec4 color;
+
+void main()
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+}
+
+[fragment shader]
+uniform int col;
+uniform vec3 expect;
+varying vec4 color;
+
+void main()
+{
+ mat3x3[3] m = mat3x3[3](
+ mat3x3(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0),
+ mat3x3(10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0),
+ mat3x3(19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0));
+
+ gl_FragColor = (m[1][col] == expect)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int col 0
+uniform vec3 expect 10 11 12
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
+
+uniform int col 1
+uniform vec3 expect 13 14 15
+draw rect 75 5 10 10
+probe rgb 80 10 0.0 1.0 0.0
+
+uniform int col 2
+uniform vec3 expect 16 17 18
+draw rect 90 5 10 10
+probe rgb 95 10 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-col-row-rd.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-col-row-rd.shader_test
new file mode 100644
index 00000000..d8481c34
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-col-row-rd.shader_test
@@ -0,0 +1,86 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-read.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+uniform int col;
+uniform int row;
+uniform float expect;
+varying vec4 color;
+
+void main()
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+}
+
+[fragment shader]
+uniform int col;
+uniform int row;
+uniform float expect;
+varying vec4 color;
+
+void main()
+{
+ mat3x3[3] m = mat3x3[3](
+ mat3x3(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0),
+ mat3x3(10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0),
+ mat3x3(19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0));
+
+ gl_FragColor = (m[1][col][row] == expect)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int col 0
+uniform int row 0
+uniform float expect 10
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 11
+draw rect 60 20 10 10
+probe rgb 65 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform float expect 12
+draw rect 60 35 10 10
+probe rgb 65 40 0.0 1.0 0.0
+
+uniform int col 1
+uniform int row 0
+uniform float expect 13
+draw rect 75 5 10 10
+probe rgb 80 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 14
+draw rect 75 20 10 10
+probe rgb 80 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform float expect 15
+draw rect 75 35 10 10
+probe rgb 80 40 0.0 1.0 0.0
+
+uniform int col 2
+uniform int row 0
+uniform float expect 16
+draw rect 90 5 10 10
+probe rgb 95 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 17
+draw rect 90 20 10 10
+probe rgb 95 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform float expect 18
+draw rect 90 35 10 10
+probe rgb 95 40 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-col-row-wr.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-col-row-wr.shader_test
new file mode 100644
index 00000000..104b77c3
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-col-row-wr.shader_test
@@ -0,0 +1,116 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-write.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+void main() { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; }
+
+[fragment shader]
+uniform mat3x3 src_matrix;
+uniform vec3 v;
+uniform vec3 expect;
+uniform int index;
+uniform int row;
+uniform int col;
+uniform float value;
+
+void main()
+{
+ mat3x3[3] dst_matrix = mat3x3[3](mat3x3(0.0), mat3x3(0.0), mat3x3(0.0));
+
+ /* Patch the supplied matrix with the supplied value. If the resulting
+ * matrix is correct, it will transform the input vector to the expected
+ * value. Verify that the distance between the result and the expected
+ * vector is less than epsilon.
+ *
+ * NOTE: This test assumes that reads of arrays using non-constant
+ * indicies works correctly. If reads and writes happen to fail in an
+ * identical manner, this test may give false positives.
+ */
+ dst_matrix[1] = src_matrix;
+ dst_matrix[1][col][row] = value;
+ gl_FragColor = (distance(dst_matrix[1] * v, expect) < 1e-6)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int col 0
+uniform int row 0
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 666.0 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.493944462129466
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 666.0 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.722190133917966
+draw rect 60 20 10 10
+probe rgb 65 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 666.0 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.239853948232558
+draw rect 60 35 10 10
+probe rgb 65 40 0.0 1.0 0.0
+
+uniform int col 1
+uniform int row 0
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 666.0 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.550143078409278
+draw rect 75 5 10 10
+probe rgb 80 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 666.0 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.591962645398579
+draw rect 75 20 10 10
+probe rgb 80 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 666.0 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.467616286531193
+draw rect 75 35 10 10
+probe rgb 80 40 0.0 1.0 0.0
+
+uniform int col 2
+uniform int row 0
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 666.0 0.511303112962423 0.270815003356504
+uniform float value 0.850846377186973
+draw rect 90 5 10 10
+probe rgb 95 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 666.0 0.270815003356504
+uniform float value 0.511303112962423
+draw rect 90 20 10 10
+probe rgb 95 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 666.0
+uniform float value 0.270815003356504
+draw rect 90 35 10 10
+probe rgb 95 40 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-col-wr.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-col-wr.shader_test
new file mode 100644
index 00000000..af914683
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-col-wr.shader_test
@@ -0,0 +1,64 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-write.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+void main() { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; }
+
+[fragment shader]
+uniform mat3x3 src_matrix;
+uniform vec3 v;
+uniform vec3 expect;
+uniform int index;
+uniform int col;
+uniform vec3 value;
+
+void main()
+{
+ mat3x3[3] dst_matrix = mat3x3[3](mat3x3(0.0), mat3x3(0.0), mat3x3(0.0));
+
+ /* Patch the supplied matrix with the supplied value. If the resulting
+ * matrix is correct, it will transform the input vector to the expected
+ * value. Verify that the distance between the result and the expected
+ * vector is less than epsilon.
+ *
+ * NOTE: This test assumes that reads of arrays using non-constant
+ * indicies works correctly. If reads and writes happen to fail in an
+ * identical manner, this test may give false positives.
+ */
+ dst_matrix[1] = src_matrix;
+ dst_matrix[1][col] = value;
+ gl_FragColor = (distance(dst_matrix[1] * v, expect) < 1e-6)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int col 0
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 666.0 777.0 888.0 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform vec3 value 0.493944462129466 0.722190133917966 0.239853948232558
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
+
+uniform int col 1
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 666.0 777.0 888.0 0.850846377186973 0.511303112962423 0.270815003356504
+uniform vec3 value 0.550143078409278 0.591962645398579 0.467616286531193
+draw rect 75 5 10 10
+probe rgb 80 10 0.0 1.0 0.0
+
+uniform int col 2
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 666.0 777.0 888.0
+uniform vec3 value 0.850846377186973 0.511303112962423 0.270815003356504
+draw rect 90 5 10 10
+probe rgb 95 10 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-col-rd.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-col-rd.shader_test
new file mode 100644
index 00000000..26f4803d
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-col-rd.shader_test
@@ -0,0 +1,86 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-read.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+uniform int index;
+uniform int col;
+uniform vec3 expect;
+varying vec4 color;
+
+void main()
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+}
+
+[fragment shader]
+uniform int index;
+uniform int col;
+uniform vec3 expect;
+varying vec4 color;
+
+void main()
+{
+ mat3x3[3] m = mat3x3[3](
+ mat3x3(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0),
+ mat3x3(10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0),
+ mat3x3(19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0));
+
+ gl_FragColor = (m[index][col] == expect)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int index 0
+uniform int col 0
+uniform vec3 expect 1 2 3
+draw rect 5 5 10 10
+probe rgb 10 10 0.0 1.0 0.0
+
+uniform int col 1
+uniform vec3 expect 4 5 6
+draw rect 20 5 10 10
+probe rgb 25 10 0.0 1.0 0.0
+
+uniform int col 2
+uniform vec3 expect 7 8 9
+draw rect 35 5 10 10
+probe rgb 40 10 0.0 1.0 0.0
+
+uniform int index 1
+uniform int col 0
+uniform vec3 expect 10 11 12
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
+
+uniform int col 1
+uniform vec3 expect 13 14 15
+draw rect 75 5 10 10
+probe rgb 80 10 0.0 1.0 0.0
+
+uniform int col 2
+uniform vec3 expect 16 17 18
+draw rect 90 5 10 10
+probe rgb 95 10 0.0 1.0 0.0
+
+uniform int index 2
+uniform int col 0
+uniform vec3 expect 19 20 21
+draw rect 115 5 10 10
+probe rgb 120 10 0.0 1.0 0.0
+
+uniform int col 1
+uniform vec3 expect 22 23 24
+draw rect 130 5 10 10
+probe rgb 135 10 0.0 1.0 0.0
+
+uniform int col 2
+uniform vec3 expect 25 26 27
+draw rect 145 5 10 10
+probe rgb 150 10 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-col-row-rd.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-col-row-rd.shader_test
new file mode 100644
index 00000000..f4dc1658
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-col-row-rd.shader_test
@@ -0,0 +1,187 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-read.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+uniform int index;
+uniform int col;
+uniform int row;
+uniform float expect;
+varying vec4 color;
+
+void main()
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+}
+
+[fragment shader]
+uniform int index;
+uniform int col;
+uniform int row;
+uniform float expect;
+varying vec4 color;
+
+void main()
+{
+ mat3x3[3] m = mat3x3[3](
+ mat3x3(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0),
+ mat3x3(10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0),
+ mat3x3(19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0));
+
+ gl_FragColor = (m[index][col][row] == expect)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int index 0
+uniform int col 0
+uniform int row 0
+uniform float expect 1
+draw rect 5 5 10 10
+probe rgb 10 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 2
+draw rect 5 20 10 10
+probe rgb 10 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform float expect 3
+draw rect 5 35 10 10
+probe rgb 10 40 0.0 1.0 0.0
+
+uniform int col 1
+uniform int row 0
+uniform float expect 4
+draw rect 20 5 10 10
+probe rgb 25 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 5
+draw rect 20 20 10 10
+probe rgb 25 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform float expect 6
+draw rect 20 35 10 10
+probe rgb 25 40 0.0 1.0 0.0
+
+uniform int col 2
+uniform int row 0
+uniform float expect 7
+draw rect 35 5 10 10
+probe rgb 40 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 8
+draw rect 35 20 10 10
+probe rgb 40 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform float expect 9
+draw rect 35 35 10 10
+probe rgb 40 40 0.0 1.0 0.0
+
+uniform int index 1
+uniform int col 0
+uniform int row 0
+uniform float expect 10
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 11
+draw rect 60 20 10 10
+probe rgb 65 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform float expect 12
+draw rect 60 35 10 10
+probe rgb 65 40 0.0 1.0 0.0
+
+uniform int col 1
+uniform int row 0
+uniform float expect 13
+draw rect 75 5 10 10
+probe rgb 80 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 14
+draw rect 75 20 10 10
+probe rgb 80 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform float expect 15
+draw rect 75 35 10 10
+probe rgb 80 40 0.0 1.0 0.0
+
+uniform int col 2
+uniform int row 0
+uniform float expect 16
+draw rect 90 5 10 10
+probe rgb 95 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 17
+draw rect 90 20 10 10
+probe rgb 95 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform float expect 18
+draw rect 90 35 10 10
+probe rgb 95 40 0.0 1.0 0.0
+
+uniform int index 2
+uniform int col 0
+uniform int row 0
+uniform float expect 19
+draw rect 115 5 10 10
+probe rgb 120 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 20
+draw rect 115 20 10 10
+probe rgb 120 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform float expect 21
+draw rect 115 35 10 10
+probe rgb 120 40 0.0 1.0 0.0
+
+uniform int col 1
+uniform int row 0
+uniform float expect 22
+draw rect 130 5 10 10
+probe rgb 135 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 23
+draw rect 130 20 10 10
+probe rgb 135 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform float expect 24
+draw rect 130 35 10 10
+probe rgb 135 40 0.0 1.0 0.0
+
+uniform int col 2
+uniform int row 0
+uniform float expect 25
+draw rect 145 5 10 10
+probe rgb 150 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform float expect 26
+draw rect 145 20 10 10
+probe rgb 150 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform float expect 27
+draw rect 145 35 10 10
+probe rgb 150 40 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-col-row-wr.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-col-row-wr.shader_test
new file mode 100644
index 00000000..764e46bb
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-col-row-wr.shader_test
@@ -0,0 +1,269 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-write.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+void main() { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; }
+
+[fragment shader]
+uniform mat3x3 src_matrix;
+uniform vec3 v;
+uniform vec3 expect;
+uniform int index;
+uniform int row;
+uniform int col;
+uniform float value;
+
+void main()
+{
+ mat3x3[3] dst_matrix = mat3x3[3](mat3x3(0.0), mat3x3(0.0), mat3x3(0.0));
+
+ /* Patch the supplied matrix with the supplied value. If the resulting
+ * matrix is correct, it will transform the input vector to the expected
+ * value. Verify that the distance between the result and the expected
+ * vector is less than epsilon.
+ *
+ * NOTE: This test assumes that reads of arrays using non-constant
+ * indicies works correctly. If reads and writes happen to fail in an
+ * identical manner, this test may give false positives.
+ */
+ dst_matrix[index] = src_matrix;
+ dst_matrix[index][col][row] = value;
+ gl_FragColor = (distance(dst_matrix[index] * v, expect) < 1e-6)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int index 0
+uniform int col 0
+uniform int row 0
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 666.0 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.493944462129466
+draw rect 5 5 10 10
+probe rgb 10 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 666.0 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.722190133917966
+draw rect 5 20 10 10
+probe rgb 10 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 666.0 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.239853948232558
+draw rect 5 35 10 10
+probe rgb 10 40 0.0 1.0 0.0
+
+uniform int col 1
+uniform int row 0
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 666.0 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.550143078409278
+draw rect 20 5 10 10
+probe rgb 25 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 666.0 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.591962645398579
+draw rect 20 20 10 10
+probe rgb 25 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 666.0 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.467616286531193
+draw rect 20 35 10 10
+probe rgb 25 40 0.0 1.0 0.0
+
+uniform int col 2
+uniform int row 0
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 666.0 0.511303112962423 0.270815003356504
+uniform float value 0.850846377186973
+draw rect 35 5 10 10
+probe rgb 40 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 666.0 0.270815003356504
+uniform float value 0.511303112962423
+draw rect 35 20 10 10
+probe rgb 40 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 666.0
+uniform float value 0.270815003356504
+draw rect 35 35 10 10
+probe rgb 40 40 0.0 1.0 0.0
+
+uniform int index 1
+uniform int col 0
+uniform int row 0
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 666.0 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.493944462129466
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 666.0 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.722190133917966
+draw rect 60 20 10 10
+probe rgb 65 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 666.0 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.239853948232558
+draw rect 60 35 10 10
+probe rgb 65 40 0.0 1.0 0.0
+
+uniform int col 1
+uniform int row 0
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 666.0 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.550143078409278
+draw rect 75 5 10 10
+probe rgb 80 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 666.0 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.591962645398579
+draw rect 75 20 10 10
+probe rgb 80 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 666.0 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.467616286531193
+draw rect 75 35 10 10
+probe rgb 80 40 0.0 1.0 0.0
+
+uniform int col 2
+uniform int row 0
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 666.0 0.511303112962423 0.270815003356504
+uniform float value 0.850846377186973
+draw rect 90 5 10 10
+probe rgb 95 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 666.0 0.270815003356504
+uniform float value 0.511303112962423
+draw rect 90 20 10 10
+probe rgb 95 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 666.0
+uniform float value 0.270815003356504
+draw rect 90 35 10 10
+probe rgb 95 40 0.0 1.0 0.0
+
+uniform int index 2
+uniform int col 0
+uniform int row 0
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 666.0 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.493944462129466
+draw rect 115 5 10 10
+probe rgb 120 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 666.0 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.722190133917966
+draw rect 115 20 10 10
+probe rgb 120 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 666.0 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.239853948232558
+draw rect 115 35 10 10
+probe rgb 120 40 0.0 1.0 0.0
+
+uniform int col 1
+uniform int row 0
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 666.0 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.550143078409278
+draw rect 130 5 10 10
+probe rgb 135 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 666.0 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.591962645398579
+draw rect 130 20 10 10
+probe rgb 135 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 666.0 0.850846377186973 0.511303112962423 0.270815003356504
+uniform float value 0.467616286531193
+draw rect 130 35 10 10
+probe rgb 135 40 0.0 1.0 0.0
+
+uniform int col 2
+uniform int row 0
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 666.0 0.511303112962423 0.270815003356504
+uniform float value 0.850846377186973
+draw rect 145 5 10 10
+probe rgb 150 10 0.0 1.0 0.0
+
+uniform int row 1
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 666.0 0.270815003356504
+uniform float value 0.511303112962423
+draw rect 145 20 10 10
+probe rgb 150 25 0.0 1.0 0.0
+
+uniform int row 2
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 666.0
+uniform float value 0.270815003356504
+draw rect 145 35 10 10
+probe rgb 150 40 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-col-wr.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-col-wr.shader_test
new file mode 100644
index 00000000..a072a36a
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-col-wr.shader_test
@@ -0,0 +1,115 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-write.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+void main() { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; }
+
+[fragment shader]
+uniform mat3x3 src_matrix;
+uniform vec3 v;
+uniform vec3 expect;
+uniform int index;
+uniform int col;
+uniform vec3 value;
+
+void main()
+{
+ mat3x3[3] dst_matrix = mat3x3[3](mat3x3(0.0), mat3x3(0.0), mat3x3(0.0));
+
+ /* Patch the supplied matrix with the supplied value. If the resulting
+ * matrix is correct, it will transform the input vector to the expected
+ * value. Verify that the distance between the result and the expected
+ * vector is less than epsilon.
+ *
+ * NOTE: This test assumes that reads of arrays using non-constant
+ * indicies works correctly. If reads and writes happen to fail in an
+ * identical manner, this test may give false positives.
+ */
+ dst_matrix[index] = src_matrix;
+ dst_matrix[index][col] = value;
+ gl_FragColor = (distance(dst_matrix[index] * v, expect) < 1e-6)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int index 0
+uniform int col 0
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 666.0 777.0 888.0 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform vec3 value 0.493944462129466 0.722190133917966 0.239853948232558
+draw rect 5 5 10 10
+probe rgb 10 10 0.0 1.0 0.0
+
+uniform int col 1
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 666.0 777.0 888.0 0.850846377186973 0.511303112962423 0.270815003356504
+uniform vec3 value 0.550143078409278 0.591962645398579 0.467616286531193
+draw rect 20 5 10 10
+probe rgb 25 10 0.0 1.0 0.0
+
+uniform int col 2
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 666.0 777.0 888.0
+uniform vec3 value 0.850846377186973 0.511303112962423 0.270815003356504
+draw rect 35 5 10 10
+probe rgb 40 10 0.0 1.0 0.0
+
+uniform int index 1
+uniform int col 0
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 666.0 777.0 888.0 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform vec3 value 0.493944462129466 0.722190133917966 0.239853948232558
+draw rect 60 5 10 10
+probe rgb 65 10 0.0 1.0 0.0
+
+uniform int col 1
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 666.0 777.0 888.0 0.850846377186973 0.511303112962423 0.270815003356504
+uniform vec3 value 0.550143078409278 0.591962645398579 0.467616286531193
+draw rect 75 5 10 10
+probe rgb 80 10 0.0 1.0 0.0
+
+uniform int col 2
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 666.0 777.0 888.0
+uniform vec3 value 0.850846377186973 0.511303112962423 0.270815003356504
+draw rect 90 5 10 10
+probe rgb 95 10 0.0 1.0 0.0
+
+uniform int index 2
+uniform int col 0
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 666.0 777.0 888.0 0.550143078409278 0.591962645398579 0.467616286531193 0.850846377186973 0.511303112962423 0.270815003356504
+uniform vec3 value 0.493944462129466 0.722190133917966 0.239853948232558
+draw rect 115 5 10 10
+probe rgb 120 10 0.0 1.0 0.0
+
+uniform int col 1
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 666.0 777.0 888.0 0.850846377186973 0.511303112962423 0.270815003356504
+uniform vec3 value 0.550143078409278 0.591962645398579 0.467616286531193
+draw rect 130 5 10 10
+probe rgb 135 10 0.0 1.0 0.0
+
+uniform int col 2
+uniform vec3 v 0.681652305322399 0.210426138878113 0.185916924650237
+uniform vec3 expect 0.610649606928364 0.711906885823636 0.312244778977868
+uniform mat3x3 src_matrix 0.493944462129466 0.722190133917966 0.239853948232558 0.550143078409278 0.591962645398579 0.467616286531193 666.0 777.0 888.0
+uniform vec3 value 0.850846377186973 0.511303112962423 0.270815003356504
+draw rect 145 5 10 10
+probe rgb 150 10 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-rd.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-rd.shader_test
new file mode 100644
index 00000000..c3667bad
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-rd.shader_test
@@ -0,0 +1,51 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-read.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+uniform int index;
+uniform vec3 expect;
+varying vec4 color;
+
+void main()
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+}
+
+[fragment shader]
+uniform int index;
+uniform vec3 expect;
+varying vec4 color;
+
+void main()
+{
+ mat3x3[3] m = mat3x3[3](
+ mat3x3(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0),
+ mat3x3(10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0),
+ mat3x3(19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0));
+
+ gl_FragColor = (m[index][1] == expect)
+ ? vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
+}
+
+[test]
+clear color 0.5 0.5 0.5 0.5
+clear
+ortho
+
+uniform int index 0
+uniform vec3 expect 4 5 6
+draw rect 20 5 10 10
+probe rgb 25 10 0.0 1.0 0.0
+
+uniform int index 1
+uniform vec3 expect 13 14 15
+draw rect 75 5 10 10
+probe rgb 80 10 0.0 1.0 0.0
+
+uniform int index 2
+uniform vec3 expect 22 23 24
+draw rect 130 5 10 10
+probe rgb 135 10 0.0 1.0 0.0
diff --git a/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-row-rd.shader_test b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-row-rd.shader_test
new file mode 100644
index 00000000..c2c386cf
--- /dev/null
+++ b/tests/spec/glsl-es-1.00/execution/1.20/variable-indexing/fs-temp-array-mat3-index-row-rd.shader_test
@@ -0,0 +1,86 @@
+# Test generated by:
+# ../../../glsl-1.10/variable-index-read.sh 1.20
+
+[require]
+GLSL >= 1.20
+
+[vertex shader]
+uniform int index;
+uniform int row;
+uniform float expect;
+varying vec4 color;
+
+void main()
+{
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+}
+
+[fragment shader]
+uniform int index;
+uniform int row;
+uniform float expect;
+varying vec4 color;
+