[Piglit] [PATCH] piglit: Add tests to validate switch statements in OpenGL 3.0.

Ian Romanick idr at freedesktop.org
Wed Aug 24 12:00:18 PDT 2011


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 08/21/2011 06:27 PM, Dan McCabe wrote:
> Two sets of tests are included in this change set.
> 
> The first set of 26 tests validates compiler support. Included are tests
> that test both positvely and negatively that the compiler processed valid
> switch statements and detected syntax errors.
> 
> The second set of 3 tests validates that the execution the the generated
> code is correct. This set generate four quadrants of color. In the test of
> the switch statement alone, these quadrants are red, green, blue and white.
> The second and third tests validate interactions between loops and switch
> statement, nesting one inside the other. The loops compute "random" colors
> at each pixel where white was drawn in the first test.

I have a bunch of comments below and a bunch more in a reply to Paul's
reply.

Particularly after seeing one of the talks at SIGGRAPH, I think we need
a test that uses a switch statement to do non-constant indexing of a
sampler array.  Something like:

#version 130
uniform sampler2D s[16];
uniform int selector;

void main() {
	switch (selector) {
	case 0: gl_FragColor = texture(s[0], vec2(0., 0.)); break;
	case 1: gl_FragColor = texture(s[1], vec2(0., 0.)); break;
	case 2: gl_FragColor = texture(s[2], vec2(0., 0.)); break;
	case 3: gl_FragColor = texture(s[3], vec2(0., 0.)); break;
	case 4: gl_FragColor = texture(s[4], vec2(0., 0.)); break;
	case 5: gl_FragColor = texture(s[5], vec2(0., 0.)); break;
	case 6: gl_FragColor = texture(s[6], vec2(0., 0.)); break;
	case 7: gl_FragColor = texture(s[7], vec2(0., 0.)); break;
	case 8: gl_FragColor = texture(s[8], vec2(0., 0.)); break;
	case 9: gl_FragColor = texture(s[9], vec2(0., 0.)); break;
	case 10: gl_FragColor = texture(s[10], vec2(0., 0.)); break;
	case 11: gl_FragColor = texture(s[11], vec2(0., 0.)); break;
	case 12: gl_FragColor = texture(s[12], vec2(0., 0.)); break;
	case 13: gl_FragColor = texture(s[13], vec2(0., 0.)); break;
	case 14: gl_FragColor = texture(s[14], vec2(0., 0.)); break;
	case 15: gl_FragColor = texture(s[15], vec2(0., 0.)); break;
        default: gl_FragColor = vec4(1., 0., 0., 1.); break;
        }
}

Unfortunately, you won't be able to do this as a shader-runner test. :(

> ---
>  .../switch-case-const-int-expression.vert          |   23 +++++++
>  .../switch-statement/switch-case-const-int.vert    |   20 ++++++
>  .../switch-statement/switch-case-empty-end.vert    |   19 ++++++
>  .../switch-statement/switch-case-fallthrough.vert  |   22 +++++++
>  .../switch-statement/switch-case-in-int.vert       |   21 ++++++
>  .../switch-statement/switch-case-statement.vert    |   23 +++++++
>  .../switch-statement/switch-case-uniform-int.vert  |   21 ++++++
>  .../compiler/switch-statement/switch-default.vert  |   20 ++++++
>  .../switch-expression-const-float.vert             |   17 +++++
>  .../switch-expression-const-int.vert               |   17 +++++
>  .../switch-expression-const-vec2.vert              |   17 +++++
>  .../switch-expression-in-float.vert                |   19 ++++++
>  .../switch-statement/switch-expression-in-int.vert |   19 ++++++
>  .../switch-expression-in-vec2.vert                 |   19 ++++++
>  .../switch-expression-uniform-float.vert           |   19 ++++++
>  .../switch-expression-uniform-int.vert             |   19 ++++++
>  .../switch-expression-uniform-vec2.vert            |   19 ++++++
>  .../switch-expression-var-float.vert               |   18 +++++
>  .../switch-expression-var-int.vert                 |   18 +++++
>  .../switch-expression-var-vec2.vert                |   18 +++++
>  .../switch-statement/switch-nested-break.vert      |   21 ++++++
>  .../switch-statement/switch-nested-case.vert       |   20 ++++++
>  .../switch-statement/switch-nested-default.vert    |   18 +++++
>  .../switch-statement/switch-nested-loop.vert       |   18 +++++
>  .../switch-statement/switch-nested-switch.vert     |   16 +++++
>  .../spec/glsl-1.30/execution/switch/switch-01.frag |   33 ++++++++++
>  .../glsl-1.30/execution/switch/switch-01.frag.sav  |    8 +++

I suspect this is spurious.

>  .../execution/switch/switch-01.shader_test         |   44 +++++++++++++
>  .../spec/glsl-1.30/execution/switch/switch-01.vert |    6 ++
>  .../spec/glsl-1.30/execution/switch/switch-02.frag |   67 ++++++++++++++++++++
>  .../execution/switch/switch-02.shader_test         |   43 +++++++++++++
>  .../spec/glsl-1.30/execution/switch/switch-02.vert |    6 ++
>  .../spec/glsl-1.30/execution/switch/switch-03.frag |   57 +++++++++++++++++
>  .../execution/switch/switch-03.shader_test         |   43 +++++++++++++
>  .../spec/glsl-1.30/execution/switch/switch-03.vert |    6 ++
>  35 files changed, 794 insertions(+), 0 deletions(-)
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-case-const-int-expression.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-case-const-int.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-case-empty-end.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-case-fallthrough.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-case-in-int.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-case-statement.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-case-uniform-int.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-default.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-const-float.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-const-int.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-const-vec2.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-in-float.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-in-int.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-in-vec2.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-uniform-float.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-uniform-int.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-uniform-vec2.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-var-float.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-var-int.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-var-vec2.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-nested-break.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-nested-case.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-nested-default.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-nested-loop.vert
>  create mode 100644 tests/spec/glsl-1.30/compiler/switch-statement/switch-nested-switch.vert
>  create mode 100644 tests/spec/glsl-1.30/execution/switch/switch-01.frag
>  create mode 100644 tests/spec/glsl-1.30/execution/switch/switch-01.frag.sav
>  create mode 100644 tests/spec/glsl-1.30/execution/switch/switch-01.shader_test
>  create mode 100644 tests/spec/glsl-1.30/execution/switch/switch-01.vert
>  create mode 100644 tests/spec/glsl-1.30/execution/switch/switch-02.frag
>  create mode 100644 tests/spec/glsl-1.30/execution/switch/switch-02.shader_test
>  create mode 100644 tests/spec/glsl-1.30/execution/switch/switch-02.vert
>  create mode 100644 tests/spec/glsl-1.30/execution/switch/switch-03.frag
>  create mode 100644 tests/spec/glsl-1.30/execution/switch/switch-03.shader_test
>  create mode 100644 tests/spec/glsl-1.30/execution/switch/switch-03.vert
> 
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-case-const-int-expression.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-case-const-int-expression.vert
> new file mode 100644
> index 0000000..169cf53
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-case-const-int-expression.vert
> @@ -0,0 +1,23 @@
> +// [config]
> +// expect_result: pass
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Switch expressions must by scalar integers.
> +//
> +// From section 6.2 of the GLSL 1.30 spec:
> +//    The type of init-expression in a switch statement must be a scalar 
> +//    integer.
> +
> +#version 130
> +
> +#define one 1
> +#define two 2
> +
> +void main() {
> +   int tmp = 0;
> +   switch (1) {
> +   case one + two:
> +      tmp = 1;
> +   }
> +}

We should start making all compiler-test shaders be linkable.  Eric
changed glslparsertest to try linking shaders so that we can exercise a
bit more of the compiler stack.  In order for this to work, vertex
shaders have to write gl_Position.

> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-case-const-int.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-case-const-int.vert
> new file mode 100644
> index 0000000..b971945
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-case-const-int.vert
> @@ -0,0 +1,20 @@
> +// [config]
> +// expect_result: pass
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Switch expressions must by scalar integers.
> +//
> +// From section 6.2 of the GLSL 1.30 spec:
> +//    The type of init-expression in a switch statement must be a scalar 
> +//    integer.
> +
> +#version 130
> +
> +void main() {
> +   int tmp = 0;
> +   switch (1) {
> +   case 0:
> +      tmp = 1;
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-case-empty-end.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-case-empty-end.vert
> new file mode 100644
> index 0000000..456b2a1
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-case-empty-end.vert
> @@ -0,0 +1,19 @@
> +// [config]
> +// expect_result: fail
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Last case must not be empty.
> +//
> +// From section 6.2 of the GLSL 1.30 spec:
> +//    ... it is an error to have no statement between a label 
> +//    and the end of the switch statement.
> +
> + 
> +#version 130
> +
> +void main() {
> +   switch (1) {
> +   case 0:
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-case-fallthrough.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-case-fallthrough.vert
> new file mode 100644
> index 0000000..64be6bf
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-case-fallthrough.vert
> @@ -0,0 +1,22 @@
> +// [config]
> +// expect_result: pass
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Switch expressions must by scalar integers.
> +//
> +// From section 6.2 of the GLSL 1.30 spec:
> +//    The type of init-expression in a switch statement must be a scalar 
> +//    integer.

This seems like an odd justification for this test.

> +
> +#version 130
> +
> +void main() {
> +   int tmp = 0;
> +   switch (1) {
> +   case 1:
> +      tmp = 1;
> +   default:
> +      tmp = 0;
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-case-in-int.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-case-in-int.vert
> new file mode 100644
> index 0000000..2814c10
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-case-in-int.vert
> @@ -0,0 +1,21 @@
> +// [config]
> +// expect_result: fail
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Case expressions must by constant integer expressions.
> +//
> +// From section 6.2 of the GLSL 1.30 spec:
> +//    Production for switch-statement.
> +
> +#version 130
> +
> +in int src;
> +
> +void main() {
> +   int tmp = 0;
> +   switch (1) {
> +   case v:

I would change this to be a variable that actually exists in the shader.

> +      tmp = 1;
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-case-statement.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-case-statement.vert
> new file mode 100644
> index 0000000..af4c300
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-case-statement.vert
> @@ -0,0 +1,23 @@
> +// [config]
> +// expect_result: pass
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Case expressions must by constant integer expressions.
> +//
> +// From section 6.2 of the GLSL 1.30 spec:
> +//    Production for switch-statement.
> +
> +#version 130
> +
> +void main() {
> +   int tmp = 0;
> +   switch (1) {
> +   case 0:
> +      tmp = 1;
> +      break;
> +   default:
> +      tmp = 2;
> +      break;
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-case-uniform-int.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-case-uniform-int.vert
> new file mode 100644
> index 0000000..a2babf8
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-case-uniform-int.vert
> @@ -0,0 +1,21 @@
> +// [config]
> +// expect_result: fail
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Case expressions must by constant integer expressions.
> +//
> +// From section 6.2 of the GLSL 1.30 spec:
> +//    Production for switch-statement.
> +
> +#version 130
> +
> +uniform int src;
> +
> +void main() {
> +   int tmp = 0;
> +   switch (1) {
> +   case src:
> +      tmp = 1;
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-default.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-default.vert
> new file mode 100644
> index 0000000..f8a07d8
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-default.vert
> @@ -0,0 +1,20 @@
> +// [config]
> +// expect_result: pass
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Switch expressions must by scalar integers.
> +//
> +// From section 6.2 of the GLSL 1.30 spec:
> +//    The type of init-expression in a switch statement must be a scalar 
> +//    integer.
> +
> +#version 130
> +
> +void main() {
> +   int tmp = 0;
> +   switch (1) {
> +   default:
> +      tmp = 1;
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-const-float.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-const-float.vert
> new file mode 100644
> index 0000000..5ef71df
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-const-float.vert
> @@ -0,0 +1,17 @@
> +// [config]
> +// expect_result: fail
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Switch expressions must by scalar integers.
> +//
> +// From section 6.2 of the GLSL 1.30 spec:
> +//    The type of init-expression in a switch statement must be a scalar 
> +//    integer.
> +
> +#version 130
> +
> +void main() {
> +   switch (1.5) {
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-const-int.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-const-int.vert
> new file mode 100644
> index 0000000..23be58e
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-const-int.vert
> @@ -0,0 +1,17 @@
> +// [config]
> +// expect_result: pass
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Switch expressions must by scalar integers.
> +//
> +// From section 6.2 of the GLSL 1.30 spec:
> +//    The type of init-expression in a switch statement must be a scalar 
> +//    integer.
> +
> +#version 130
> +
> +void main() {
> +   switch (1) {
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-const-vec2.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-const-vec2.vert
> new file mode 100644
> index 0000000..753159f
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-const-vec2.vert
> @@ -0,0 +1,17 @@
> +// [config]
> +// expect_result: fail
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Switch expressions must by scalar integers.
> +//
> +// From section 6.2 of the GLSL 1.30 spec:
> +//    The type of init-expression in a switch statement must be a scalar 
> +//    integer.
> +
> +#version 130
> +
> +void main() {
> +   switch (vec2(0, 0)) {
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-in-float.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-in-float.vert
> new file mode 100644
> index 0000000..59a267c
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-in-float.vert
> @@ -0,0 +1,19 @@
> +// [config]
> +// expect_result: fail
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Switch expressions must by scalar integers.
> +//
> +// From section 6.2 of the GLSL 1.30 spec:
> +//    The type of init-expression in a switch statement must be a scalar 
> +//    integer.
> +
> +#version 130
> +
> +in float src;
> +
> +void main() {
> +   switch (src) {
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-in-int.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-in-int.vert
> new file mode 100644
> index 0000000..6b6f15e
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-in-int.vert
> @@ -0,0 +1,19 @@
> +// [config]
> +// expect_result: pass
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Switch expressions must by scalar integers.
> +//
> +// From section 6.2 of the GLSL 1.30 spec:
> +//    The type of init-expression in a switch statement must be a scalar 
> +//    integer.
> +
> +#version 130
> +
> +in int src;
> +
> +void main() {
> +   switch (src) {
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-in-vec2.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-in-vec2.vert
> new file mode 100644
> index 0000000..3f24521
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-in-vec2.vert
> @@ -0,0 +1,19 @@
> +// [config]
> +// expect_result: fail
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Switch expressions must by scalar integers.
> +//
> +// From section 6.2 of the GLSL 1.30 spec:
> +//    The type of init-expression in a switch statement must be a scalar 
> +//    integer.
> +
> +#version 130
> +
> +in vec2 src;
> +
> +void main() {
> +   switch (src) {
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-uniform-float.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-uniform-float.vert
> new file mode 100644
> index 0000000..461deeb
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-uniform-float.vert
> @@ -0,0 +1,19 @@
> +// [config]
> +// expect_result: fail
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Switch expressions must by scalar integers.
> +//
> +// From section 6.2 of the GLSL 1.30 spec:
> +//    The type of init-expression in a switch statement must be a scalar 
> +//    integer.
> +
> +#version 130
> +
> +uniform float src;
> +
> +void main() {
> +   switch (src) {
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-uniform-int.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-uniform-int.vert
> new file mode 100644
> index 0000000..a8d6af2
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-uniform-int.vert
> @@ -0,0 +1,19 @@
> +// [config]
> +// expect_result: pass
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Switch expressions must by scalar integers.
> +//
> +// From section 6.2 of the GLSL 1.30 spec:
> +//    The type of init-expression in a switch statement must be a scalar 
> +//    integer.
> +
> +#version 130
> +
> +uniform int src;
> +
> +void main() {
> +   switch (src) {
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-uniform-vec2.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-uniform-vec2.vert
> new file mode 100644
> index 0000000..e86ef1f
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-uniform-vec2.vert
> @@ -0,0 +1,19 @@
> +// [config]
> +// expect_result: fail
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Switch expressions must by scalar integers.
> +//
> +// From section 6.2 of the GLSL 1.30 spec:
> +//    The type of init-expression in a switch statement must be a scalar 
> +//    integer.
> +
> +#version 130
> +
> +uniform vec2 src;
> +
> +void main() {
> +   switch (src) {
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-var-float.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-var-float.vert
> new file mode 100644
> index 0000000..039e85d
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-var-float.vert
> @@ -0,0 +1,18 @@
> +// [config]
> +// expect_result: fail
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Switch expressions must by scalar integers.
> +//
> +// From section 6.2 of the GLSL 1.30 spec:
> +//    The type of init-expression in a switch statement must be a scalar 
> +//    integer.
> +
> +#version 130
> +
> +void main() {
> +   float tmp = 1.5;
> +   switch (tmp) {
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-var-int.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-var-int.vert
> new file mode 100644
> index 0000000..200cc79
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-var-int.vert
> @@ -0,0 +1,18 @@
> +// [config]
> +// expect_result: pass
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Switch expressions must by scalar integers.
> +//
> +// From section 6.2 of the GLSL 1.30 spec:
> +//    The type of init-expression in a switch statement must be a scalar 
> +//    integer.
> +
> +#version 130
> +
> +void main() {
> +   int tmp = 5;
> +   switch (tmp) {
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-var-vec2.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-var-vec2.vert
> new file mode 100644
> index 0000000..6d398f0
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-expression-var-vec2.vert
> @@ -0,0 +1,18 @@
> +// [config]
> +// expect_result: fail
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Switch expressions must by scalar integers.
> +//
> +// From section 6.2 of the GLSL 1.30 spec:
> +//    The type of init-expression in a switch statement must be a scalar 
> +//    integer.
> +
> +#version 130
> +
> +void main() {
> +   vec2 tmp = vec2(0, 0);
> +   switch (tmp) {
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-nested-break.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-nested-break.vert
> new file mode 100644
> index 0000000..b79ab46
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-nested-break.vert
> @@ -0,0 +1,21 @@
> +// [config]
> +// expect_result: pass
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Test nested break statements.
> +
> +#version 130
> +
> +void main() {
> +   int tmp = 0;
> +   switch (1) {
> +   case 1:
> +      while (tmp < 8) {
> +      	 if (tmp > 4)
> +	    break;
> +         tmp += 1;
> +      }
> +      break;	
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-nested-case.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-nested-case.vert
> new file mode 100644
> index 0000000..5f2a8a1
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-nested-case.vert
> @@ -0,0 +1,20 @@
> +// [config]
> +// expect_result: fail
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Case labels cannot be nested inside other flow control within 
> +// their corresonding switch.
> +
> +#version 130
> +
> +void main() {
> +   int tmp = 0;
> +   switch (1) {
> +   case 0:
> +      while (1) {
> +         case 1:
> +	 tmp = 1;
> +      }
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-nested-default.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-nested-default.vert
> new file mode 100644
> index 0000000..65298a9
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-nested-default.vert
> @@ -0,0 +1,18 @@
> +// [config]
> +// expect_result: fail
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Case labels and default labels may not be nested inside
> +// other flow control within their corresonding switch.
> +
> +#version 130
> +
> +void main() {
> +   switch (1) {
> +   case 0:
> +      while (1) {
> +         default:

This test and the previous test should be repeated with if-statements
and for-loops.  I'd also change the name to something like
'switch-with-default-inside-while.vert'.

> +      }
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-nested-loop.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-nested-loop.vert
> new file mode 100644
> index 0000000..3592c57
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-nested-loop.vert
> @@ -0,0 +1,18 @@
> +// [config]
> +// expect_result: pass
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Switch statements may have nested loops.
> +
> +#version 130
> +
> +void main() {
> +   int tmp = 0;
> +   switch (1) {
> +   case 1:
> +      while (tmp < 8) {
> +         tmp += 1;
> +      }
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/compiler/switch-statement/switch-nested-switch.vert b/tests/spec/glsl-1.30/compiler/switch-statement/switch-nested-switch.vert
> new file mode 100644
> index 0000000..02710bc
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/compiler/switch-statement/switch-nested-switch.vert
> @@ -0,0 +1,16 @@
> +// [config]
> +// expect_result: pass
> +// glsl_version: 1.30
> +// [end config]
> +//
> +// Switch expressions may be nested.
> +
> +#version 130
> +
> +void main() {
> +   switch (1) {
> +   case 0:
> +      switch (0) {
> +      }
> +   }
> +}
> diff --git a/tests/spec/glsl-1.30/execution/switch/switch-01.frag b/tests/spec/glsl-1.30/execution/switch/switch-01.frag
> new file mode 100644
> index 0000000..94beb59
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/execution/switch/switch-01.frag
> @@ -0,0 +1,33 @@
> +#version 130
> +
> +#define PI 3.1415927
> +
> +in vec4 tex_coord;
> +
> +void main()
> +{
> +	// use 0.5 * (sin(PI * foo) + 1) as a computation
> +	// to map -1..1 => 0..1
> +	int x = int(0.99 * (sin(PI * tex_coord.x) + 1));
> +	int y = int(0.99 * (sin(PI * tex_coord.y) + 1));
> +
> +	int v = 2 * y + x;
> +
> +	switch (v) {
> +	case 0:
> +		gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
> +		break;
> +	case 1:
> +		gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
> +		break;
> +	case 2:
> +		gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
> +		break;
> +	case 3:
> +		gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
> +		break;
> +	default:
> +		gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
> +		break;
> +	}
> +}
> \ No newline at end of file
> diff --git a/tests/spec/glsl-1.30/execution/switch/switch-01.frag.sav b/tests/spec/glsl-1.30/execution/switch/switch-01.frag.sav
> new file mode 100644
> index 0000000..e6763d2
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/execution/switch/switch-01.frag.sav
> @@ -0,0 +1,8 @@
> +#version 130
> +const float canary = 0.125;
> +uniform sampler2DShadow tex;
> +in vec4 tex_coord;
> +void main() {
> +	float s = texture(tex, tex_coord.xyy);
> +	gl_FragColor = vec4(s, canary, canary, canary);
> +}
> diff --git a/tests/spec/glsl-1.30/execution/switch/switch-01.shader_test b/tests/spec/glsl-1.30/execution/switch/switch-01.shader_test
> new file mode 100644
> index 0000000..1dc7e84
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/execution/switch/switch-01.shader_test
> @@ -0,0 +1,44 @@
> +# [description]
> +# Test switch statement with
> +#   - color mapping to (x,y)
> +#   - (-1,-1)..(0,0) => red
> +#   - (0,-1)..(1,0) => green
> +#   - (-1,0)..(0,1) => blue
> +#   - (0,0)..(1,1) => white
> +# This pattern repeats periodically in x,y
> +
> +[require]
> +GLSL >= 1.30
> +
> +[vertex shader file]
> +switch-01.vert

Unless these shaders are using in multiple shader-runner tests, it is
much better to embed the shader code in the .shader_test file.  It looks
like switch-01.vert and switch-03.vert are the same, so I'd rename one
switch-common-pass-through.vert and delete the other.

> +
> +[fragment shader file]
> +switch-01.frag
> +
> +[test]
> +# draw from -1..1 in both x and y
> +draw rect -1 -1 2 2
> +
> +# color comparison pass
> +# probe in space 0..1 in both x and y
> +
> +# expect red, (case 0)
> +#     drawn in (-1,-1)..(0,0),
> +#     probed at (-0.5,-0.5) in drawing coords
> +relative probe rgba (0.25, 0.25) (1.0, 0.0, 0.0, 1.0);
> +
> +# expect green, (case 1)
> +#     drawn in (0,-1)..(1,0),
> +#     probed at (0.5,-0.5) in drawing coords
> +relative probe rgba (0.75, 0.25) (0.0, 1.0, 0.0, 1.0);
> +
> +# expect blue, (case 2)
> +#     drawn in (-1,0)..(0,1),
> +#     probed at (-0.5,0.5) in drawing coords
> +relative probe rgba (0.25, 0.75) (0.0, 0.0, 1.0, 1.0);
> +
> +# expect white, (case 3)
> +#     drawn in (0,0)..(1,1),
> +#     probed at (0.5,0.5) in drawing coords
> +relative probe rgba (0.75, 0.75) (1.0, 1.0, 1.0, 1.0);
> diff --git a/tests/spec/glsl-1.30/execution/switch/switch-01.vert b/tests/spec/glsl-1.30/execution/switch/switch-01.vert
> new file mode 100644
> index 0000000..99e983c
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/execution/switch/switch-01.vert
> @@ -0,0 +1,6 @@
> +#version 130
> +out vec4 tex_coord;
> +void main() {
> +	gl_Position = gl_Vertex;
> +	tex_coord = gl_Vertex;
> +}
> diff --git a/tests/spec/glsl-1.30/execution/switch/switch-02.frag b/tests/spec/glsl-1.30/execution/switch/switch-02.frag
> new file mode 100644
> index 0000000..70d3bf6
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/execution/switch/switch-02.frag
> @@ -0,0 +1,67 @@
> +#version 130
> +
> +#define PI 3.1415927
> +
> +in vec4 tex_coord;
> +
> +void main()
> +{
> +	// use 0.5 * (sin(PI * foo) + 1) as a computation
> +	// to map -1..1 => 0..1
> +	int x = int(0.99 * (sin(PI * tex_coord.x) + 1));
> +	int y = int(0.99 * (sin(PI * tex_coord.y) + 1));
> +	
> +	// generate pseudo-random numbers based on x,y
> +	int rand0 = int(32.0 * (sin(tex_coord.x + tex_coord.y) + 1));
> +	int rand1 = int(32.0 * (cos(tex_coord.x * tex_coord.y) + 1));
> +	int rand2 = int(32.0 * (cos(tex_coord.x - tex_coord.y) + 1));
> +
> +	float r = 0.0;
> +	float g = 0.0;
> +	float b = 0.0;
> +	float dr = 0.2;
> +	float dg = 0.4;
> +	float db = 0.6;
> +
> +	int v = 2 * y + x;
> +
> +	switch (v) {
> +	case 0:
> +		gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
> +		break;
> +	case 1:
> +		gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
> +		break;
> +	case 2:
> +		gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
> +		break;
> +	case 3:
> +	        // compute some random colors using a while loop
> +	        while (rand0 >= 0) {
> +		      r = r + dr;
> +		      if (r > 1.0) {
> +		      	       r = 0.0;
> +		      }
> +		      rand0 = rand0 - 1;
> +		}
> +		while (rand1 >= 0) {
> +		      g = g + dg;
> +		      if (g > 1.0) {
> +		              g = 0.0;
> +		      }
> +		      rand1 = rand1 - 1;
> +		}
> +		while (rand2 >= 0) {
> +		      b = b + db;
> +		      if (b > 1.0) {
> +		              b = 0.0;
> +		      }
> +		      rand2 = rand2 - 1;
> +		}
> +		gl_FragColor = vec4(r, g, b, 1.0);
> +		break;
> +	default:
> +		gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
> +		break;
> +	}
> +}
> \ No newline at end of file
> diff --git a/tests/spec/glsl-1.30/execution/switch/switch-02.shader_test b/tests/spec/glsl-1.30/execution/switch/switch-02.shader_test
> new file mode 100644
> index 0000000..92afe2c
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/execution/switch/switch-02.shader_test
> @@ -0,0 +1,43 @@
> +# [description]
> +# Test switch statement with
> +#   - color mapping to (x,y)
> +#   - (-1,-1)..(0,0) => red
> +#   - (0,-1)..(1,0) => green
> +#   - (-1,0)..(0,1) => blue
> +#   - (0,0)..(1,1) => multi-colored unpredicable mess
> +# This pattern repeats periodically in x,y
> +# The key point of this test is that the red, green,
> +# and blue quads are drawn as expected and the interaction 
> +# betw the while loop and the switch doesn't hang
> +# the GPU but terminates nicely.
> +
> +[require]
> +GLSL >= 1.30
> +
> +[vertex shader file]
> +switch-02.vert
> +
> +[fragment shader file]
> +switch-02.frag
> +
> +[test]
> +# draw from -1..1 in both x and y
> +draw rect -1 -1 2 2
> +
> +# color comparison pass
> +# probe in space 0..1 in both x and y
> +
> +# expect red, (case 0)
> +#     drawn in (-1,-1)..(0,0),
> +#     probed at (-0.5,-0.5) in drawing coords
> +relative probe rgba (0.25, 0.25) (1.0, 0.0, 0.0, 1.0);
> +
> +# expect green, (case 1)
> +#     drawn in (0,-1)..(1,0),
> +#     probed at (0.5,-0.5) in drawing coords
> +relative probe rgba (0.75, 0.25) (0.0, 1.0, 0.0, 1.0);
> +
> +# expect blue, (case 2)
> +#     drawn in (-1,0)..(0,1),
> +#     probed at (-0.5,0.5) in drawing coords
> +relative probe rgba (0.25, 0.75) (0.0, 0.0, 1.0, 1.0);
> diff --git a/tests/spec/glsl-1.30/execution/switch/switch-02.vert b/tests/spec/glsl-1.30/execution/switch/switch-02.vert
> new file mode 100644
> index 0000000..99e983c
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/execution/switch/switch-02.vert
> @@ -0,0 +1,6 @@
> +#version 130
> +out vec4 tex_coord;
> +void main() {
> +	gl_Position = gl_Vertex;
> +	tex_coord = gl_Vertex;
> +}
> diff --git a/tests/spec/glsl-1.30/execution/switch/switch-03.frag b/tests/spec/glsl-1.30/execution/switch/switch-03.frag
> new file mode 100644
> index 0000000..dc99c15
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/execution/switch/switch-03.frag
> @@ -0,0 +1,57 @@
> +#version 130
> +
> +#define PI 3.1415927
> +
> +in vec4 tex_coord;
> +
> +void main()
> +{
> +	// use 0.5 * (sin(PI * foo) + 1) as a computation
> +	// to map -1..1 => 0..1
> +	int x = int(0.99 * sin(PI * tex_coord.x) + 1);
> +	int y = int(0.99 * sin(PI * tex_coord.y) + 1);
> +	
> +	// generate a pseudo-random number based on x,y
> +	int rand = int(32.0 * (sin(tex_coord.x + tex_coord.y) + 1));
> +
> +	float r = 0.0;
> +	float g = 0.0;
> +	float b = 0.0;
> +	float dr = 0.2;
> +	float dg = 0.4;
> +	float db = 0.6;
> +
> +	int v = 2 * y + x;
> +
> +        // generate some random colors with this while loop
> +	while (rand >= 0) {
> +	        r = r + dr;
> +	        if (r > 1.0) {
> +	      	        r = 0.0;
> +	        }
> +	        g = g + dg;
> +	        if (g > 1.0) {
> +	                g = 0.0;
> +	        }
> +	        b = b + db;
> +	        if (b > 1.0) {
> +	                b = 0.0;
> +	        }
> +	        rand = rand - 1;
> +
> +	        switch (v) {
> +		case 0:
> +			gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
> +			break;
> +		case 1:
> +			gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
> +			break;
> +		case 2:
> +			gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
> +			break;
> +		case 3:
> +			gl_FragColor = vec4(r, g, b, 1.0);
> +			break;
> +		}
> +	}
> +}
> \ No newline at end of file
> diff --git a/tests/spec/glsl-1.30/execution/switch/switch-03.shader_test b/tests/spec/glsl-1.30/execution/switch/switch-03.shader_test
> new file mode 100644
> index 0000000..bbe37d7
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/execution/switch/switch-03.shader_test
> @@ -0,0 +1,43 @@
> +# [description]
> +# Test switch statement with
> +#   - color mapping to (x,y)
> +#   - (-1,-1)..(0,0) => red
> +#   - (0,-1)..(1,0) => green
> +#   - (-1,0)..(0,1) => blue
> +#   - (0,0)..(1,1) => multi-colored unpredicable mess
> +# This pattern repeats periodically in x,y
> +# The key point of this test is that the red, green,
> +# and blue quads are drawn as expected and the interaction 
> +# betw the while loop and the switch doesn't hang
> +# the GPU but terminates nicely.
> +
> +[require]
> +GLSL >= 1.30
> +
> +[vertex shader file]
> +switch-03.vert
> +
> +[fragment shader file]
> +switch-03.frag
> +
> +[test]
> +# draw from -1..1 in both x and y
> +draw rect -1 -1 2 2
> +
> +# color comparison pass
> +# probe in space 0..1 in both x and y
> +
> +# expect red, (case 0)
> +#     drawn in (-1,-1)..(0,0),
> +#     probed at (-0.5,-0.5) in drawing coords
> +relative probe rgba (0.25, 0.25) (1.0, 0.0, 0.0, 1.0);
> +
> +# expect green, (case 1)
> +#     drawn in (0,-1)..(1,0),
> +#     probed at (0.5,-0.5) in drawing coords
> +relative probe rgba (0.75, 0.25) (0.0, 1.0, 0.0, 1.0);
> +
> +# expect blue, (case 2)
> +#     drawn in (-1,0)..(0,1),
> +#     probed at (-0.5,0.5) in drawing coords
> +relative probe rgba (0.25, 0.75) (0.0, 0.0, 1.0, 1.0);
> diff --git a/tests/spec/glsl-1.30/execution/switch/switch-03.vert b/tests/spec/glsl-1.30/execution/switch/switch-03.vert
> new file mode 100644
> index 0000000..99e983c
> --- /dev/null
> +++ b/tests/spec/glsl-1.30/execution/switch/switch-03.vert
> @@ -0,0 +1,6 @@
> +#version 130
> +out vec4 tex_coord;
> +void main() {
> +	gl_Position = gl_Vertex;
> +	tex_coord = gl_Vertex;
> +}
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/

iEYEARECAAYFAk5VSkIACgkQX1gOwKyEAw8v+ACeLiP1pk445QClWDtbyk795zMN
lXgAn1fZOMntUQl2SgNpnDOVZHraDTyE
=BRBo
-----END PGP SIGNATURE-----


More information about the Piglit mailing list