[Piglit] [PATCH] arb_tessellation_shader: add compiler tests for barrier()

Ilia Mirkin imirkin at alum.mit.edu
Wed Aug 27 17:27:45 PDT 2014


Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
---

barrier-return/switch/func fail on NVIDIA 340.32 -- apparently it's
perfectly happy with them, despite what the spec appears to say. That
said, they *would* be perfectly safe, but not allowed by the spec.

 .../compiler/barrier-for.tesc                      | 28 ++++++++++++++++
 .../compiler/barrier-func.tesc                     | 31 ++++++++++++++++++
 .../compiler/barrier-if.tesc                       | 29 +++++++++++++++++
 .../compiler/barrier-return.tesc                   | 30 +++++++++++++++++
 .../compiler/barrier-switch.tesc                   | 38 ++++++++++++++++++++++
 .../arb_tessellation_shader/compiler/barrier.tesc  | 17 ++++++++++
 .../arb_tessellation_shader/compiler/barrier.tese  | 11 +++++++
 7 files changed, 184 insertions(+)
 create mode 100644 tests/spec/arb_tessellation_shader/compiler/barrier-for.tesc
 create mode 100644 tests/spec/arb_tessellation_shader/compiler/barrier-func.tesc
 create mode 100644 tests/spec/arb_tessellation_shader/compiler/barrier-if.tesc
 create mode 100644 tests/spec/arb_tessellation_shader/compiler/barrier-return.tesc
 create mode 100644 tests/spec/arb_tessellation_shader/compiler/barrier-switch.tesc
 create mode 100644 tests/spec/arb_tessellation_shader/compiler/barrier.tesc
 create mode 100644 tests/spec/arb_tessellation_shader/compiler/barrier.tese

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 0000000..51683f4
--- /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 0000000..f31443f
--- /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 0000000..061ca02
--- /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 0000000..4cab7e1
--- /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 0000000..e08b7e3
--- /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 0000000..8a59206
--- /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 0000000..9d2392b
--- /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);}
-- 
1.8.5.5



More information about the Piglit mailing list