diff options
author | Ilia Mirkin <imirkin@alum.mit.edu> | 2014-08-27 20:02:51 -0400 |
---|---|---|
committer | Ilia Mirkin <imirkin@alum.mit.edu> | 2014-08-27 22:58:45 -0400 |
commit | f21779c75a26a98c192bc3f29693bac8ca243ea3 (patch) | |
tree | 9af5f4d92c295c36f5b1177e7a965ac8958eda39 | |
parent | a1132024660876ad51652b08896040fb89e4396b (diff) |
arb_tessellation_shader: add compiler tests for barrier()
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Chris Forbes <chrisf@ijw.co.nz>
7 files changed, 184 insertions, 0 deletions
diff --git a/tests/spec/arb_tessellation_shader/compiler/barrier-for.tesc b/tests/spec/arb_tessellation_shader/compiler/barrier-for.tesc new file mode 100644 index 000000000..51683f481 --- /dev/null +++ b/tests/spec/arb_tessellation_shader/compiler/barrier-for.tesc @@ -0,0 +1,28 @@ +// [config] +// expect_result: fail +// glsl_version: 1.50 +// require_extensions: GL_ARB_tessellation_shader +// check_link: true +// [end config] + +/** + * From issue 42: + * + * As a result, we choose a heavy-handed approach in which we only allow + * calls to barrier() inside main(). Even within main, barrier() calls are + * forbidden inside loops (even those that turn out to have constant loop + * counts and don't execute "break" or "continue" statements), if + * statements, or after a return statement. + */ + +#version 150 +#extension GL_ARB_tessellation_shader: require +layout(vertices = 3) out; + +void main() { + gl_out[gl_InvocationID].gl_Position = vec4(0.0); + for (int i = 0; i < 3; i++) + barrier(); + gl_TessLevelOuter = float[4](1.0, 1.0, 1.0, 1.0); + gl_TessLevelInner = float[2](1.0, 1.0); +} diff --git a/tests/spec/arb_tessellation_shader/compiler/barrier-func.tesc b/tests/spec/arb_tessellation_shader/compiler/barrier-func.tesc new file mode 100644 index 000000000..f31443faa --- /dev/null +++ b/tests/spec/arb_tessellation_shader/compiler/barrier-func.tesc @@ -0,0 +1,31 @@ +// [config] +// expect_result: fail +// glsl_version: 1.50 +// require_extensions: GL_ARB_tessellation_shader +// check_link: true +// [end config] + +/** + * From issue 42: + * + * As a result, we choose a heavy-handed approach in which we only allow + * calls to barrier() inside main(). Even within main, barrier() calls are + * forbidden inside loops (even those that turn out to have constant loop + * counts and don't execute "break" or "continue" statements), if + * statements, or after a return statement. + */ + +#version 150 +#extension GL_ARB_tessellation_shader: require +layout(vertices = 3) out; + +void func() { + barrier(); +} + +void main() { + gl_out[gl_InvocationID].gl_Position = vec4(0.0); + func(); + gl_TessLevelOuter = float[4](1.0, 1.0, 1.0, 1.0); + gl_TessLevelInner = float[2](1.0, 1.0); +} diff --git a/tests/spec/arb_tessellation_shader/compiler/barrier-if.tesc b/tests/spec/arb_tessellation_shader/compiler/barrier-if.tesc new file mode 100644 index 000000000..061ca0264 --- /dev/null +++ b/tests/spec/arb_tessellation_shader/compiler/barrier-if.tesc @@ -0,0 +1,29 @@ +// [config] +// expect_result: fail +// glsl_version: 1.50 +// require_extensions: GL_ARB_tessellation_shader +// check_link: true +// [end config] + +/** + * From issue 42: + * + * As a result, we choose a heavy-handed approach in which we only allow + * calls to barrier() inside main(). Even within main, barrier() calls are + * forbidden inside loops (even those that turn out to have constant loop + * counts and don't execute "break" or "continue" statements), if + * statements, or after a return statement. + */ + +#version 150 +#extension GL_ARB_tessellation_shader: require +layout(vertices = 3) out; +uniform bool cond; + +void main() { + gl_out[gl_InvocationID].gl_Position = vec4(0.0); + if (cond) + barrier(); + gl_TessLevelOuter = float[4](1.0, 1.0, 1.0, 1.0); + gl_TessLevelInner = float[2](1.0, 1.0); +} diff --git a/tests/spec/arb_tessellation_shader/compiler/barrier-return.tesc b/tests/spec/arb_tessellation_shader/compiler/barrier-return.tesc new file mode 100644 index 000000000..4cab7e1de --- /dev/null +++ b/tests/spec/arb_tessellation_shader/compiler/barrier-return.tesc @@ -0,0 +1,30 @@ +// [config] +// expect_result: fail +// glsl_version: 1.50 +// require_extensions: GL_ARB_tessellation_shader +// check_link: true +// [end config] + +/** + * From issue 42: + * + * As a result, we choose a heavy-handed approach in which we only allow + * calls to barrier() inside main(). Even within main, barrier() calls are + * forbidden inside loops (even those that turn out to have constant loop + * counts and don't execute "break" or "continue" statements), if + * statements, or after a return statement. + */ + +#version 150 +#extension GL_ARB_tessellation_shader: require +layout(vertices = 3) out; +uniform bool cond; + +void main() { + gl_out[gl_InvocationID].gl_Position = vec4(0.0); + if (cond) + return; + barrier(); + gl_TessLevelOuter = float[4](1.0, 1.0, 1.0, 1.0); + gl_TessLevelInner = float[2](1.0, 1.0); +} diff --git a/tests/spec/arb_tessellation_shader/compiler/barrier-switch.tesc b/tests/spec/arb_tessellation_shader/compiler/barrier-switch.tesc new file mode 100644 index 000000000..e08b7e392 --- /dev/null +++ b/tests/spec/arb_tessellation_shader/compiler/barrier-switch.tesc @@ -0,0 +1,38 @@ +// [config] +// expect_result: fail +// glsl_version: 1.50 +// require_extensions: GL_ARB_tessellation_shader +// check_link: true +// [end config] + +/** + * From issue 42: + * + * As a result, we choose a heavy-handed approach in which we only allow + * calls to barrier() inside main(). Even within main, barrier() calls are + * forbidden inside loops (even those that turn out to have constant loop + * counts and don't execute "break" or "continue" statements), if + * statements, or after a return statement. + * + * Further, from the spec text: + * + * In particular, barrier() may not be called inside + * a switch statement, in either sub-statement of an if statement, inside a + * do, for, or while loop, or at any point after a return statement in the + * function main(). + */ + +#version 150 +#extension GL_ARB_tessellation_shader: require +layout(vertices = 3) out; +uniform int val; + +void main() { + gl_out[gl_InvocationID].gl_Position = vec4(0.0); + switch (val) { + default: + barrier(); + } + gl_TessLevelOuter = float[4](1.0, 1.0, 1.0, 1.0); + gl_TessLevelInner = float[2](1.0, 1.0); +} diff --git a/tests/spec/arb_tessellation_shader/compiler/barrier.tesc b/tests/spec/arb_tessellation_shader/compiler/barrier.tesc new file mode 100644 index 000000000..8a5920645 --- /dev/null +++ b/tests/spec/arb_tessellation_shader/compiler/barrier.tesc @@ -0,0 +1,17 @@ +// [config] +// expect_result: pass +// glsl_version: 1.50 +// require_extensions: GL_ARB_tessellation_shader +// check_link: true +// [end config] + +#version 150 +#extension GL_ARB_tessellation_shader: require +layout(vertices = 3) out; + +void main() { + gl_out[gl_InvocationID].gl_Position = vec4(0.0); + barrier(); + gl_TessLevelOuter = float[4](1.0, 1.0, 1.0, 1.0); + gl_TessLevelInner = float[2](1.0, 1.0); +} diff --git a/tests/spec/arb_tessellation_shader/compiler/barrier.tese b/tests/spec/arb_tessellation_shader/compiler/barrier.tese new file mode 100644 index 000000000..9d2392bbd --- /dev/null +++ b/tests/spec/arb_tessellation_shader/compiler/barrier.tese @@ -0,0 +1,11 @@ +// [config] +// expect_result: fail +// glsl_version: 1.50 +// require_extensions: GL_ARB_tessellation_shader +// [end config] + +#version 150 +#extension GL_ARB_tessellation_shader: require +layout(triangles) in; + +void main() { barrier(); gl_Position = vec4(0.0);} |