[Piglit] [PATCH 2/2] arb_fragment_shader_interlock: Additional compile tests

Ian Romanick idr at freedesktop.org
Tue Aug 28 22:13:22 UTC 2018


From: Ian Romanick <ian.d.romanick at intel.com>

The negative tests in this group require some inference from various
specs.  A spec bug has been submitted against the
GL_ARB_fragment_shader_interlock spec.

Currently none of the negative tests produce the expected result on
Mesa.

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
---
 .../beginInvocationInterlock-after-discard.frag    | 27 +++++++++++
 .../beginInvocationInterlock-after-return.frag     | 51 +++++++++++++++++++++
 .../beginInvocationInterlock-inside-do-while.frag  | 49 ++++++++++++++++++++
 .../beginInvocationInterlock-inside-for.frag       | 50 +++++++++++++++++++++
 .../beginInvocationInterlock-inside-if.frag        | 48 ++++++++++++++++++++
 ...vocationInterlock-inside-non-main-function.frag | 51 +++++++++++++++++++++
 .../beginInvocationInterlock-inside-while.frag     | 49 ++++++++++++++++++++
 .../endInvocationInterlock-after-discard.frag      | 28 ++++++++++++
 .../endInvocationInterlock-after-return.frag       | 52 ++++++++++++++++++++++
 .../endInvocationInterlock-inside-do-while.frag    | 49 ++++++++++++++++++++
 .../endInvocationInterlock-inside-for.frag         | 50 +++++++++++++++++++++
 .../compiler/endInvocationInterlock-inside-if.frag | 48 ++++++++++++++++++++
 ...vocationInterlock-inside-non-main-function.frag | 51 +++++++++++++++++++++
 .../endInvocationInterlock-inside-while.frag       | 50 +++++++++++++++++++++
 14 files changed, 653 insertions(+)
 create mode 100644 tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-after-discard.frag
 create mode 100644 tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-after-return.frag
 create mode 100644 tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-inside-do-while.frag
 create mode 100644 tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-inside-for.frag
 create mode 100644 tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-inside-if.frag
 create mode 100644 tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-inside-non-main-function.frag
 create mode 100644 tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-inside-while.frag
 create mode 100644 tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-after-discard.frag
 create mode 100644 tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-after-return.frag
 create mode 100644 tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-inside-do-while.frag
 create mode 100644 tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-inside-for.frag
 create mode 100644 tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-inside-if.frag
 create mode 100644 tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-inside-non-main-function.frag
 create mode 100644 tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-inside-while.frag

diff --git a/tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-after-discard.frag b/tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-after-discard.frag
new file mode 100644
index 000000000..1c74fa49c
--- /dev/null
+++ b/tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-after-discard.frag
@@ -0,0 +1,27 @@
+// [config]
+// expect_result: pass
+// glsl_version: 4.20
+// require_extensions: GL_ARB_fragment_shader_interlock
+// [end config]
+
+/* The GL_ARB_fragment_shader_interlock spec says:
+ *
+ *    The beginInvocationInterlockARB() and endInvocationInterlockARB() may
+ *    only be placed inside the function main() of a fragment shader and may
+ *    not be called within any flow control.  These functions may not be
+ *    called after a return statement in the function main(), but may be
+ *    called after a discard statement.
+ */
+#version 420
+#extension GL_ARB_fragment_shader_interlock: require
+
+in float f;
+
+void main()
+{
+	if (f < 0.5)
+		discard;
+
+	beginInvocationInterlockARB();
+	endInvocationInterlockARB();
+}
diff --git a/tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-after-return.frag b/tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-after-return.frag
new file mode 100644
index 000000000..29493ff9e
--- /dev/null
+++ b/tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-after-return.frag
@@ -0,0 +1,51 @@
+// [config]
+// expect_result: fail
+// glsl_version: 4.20
+// require_extensions: GL_ARB_fragment_shader_interlock
+// check_link: false
+// [end config]
+
+/* The GL_ARB_fragment_shader_interlock spec says:
+ *
+ *    The beginInvocationInterlockARB() and endInvocationInterlockARB() may
+ *    only be placed inside the function main() of a fragment shader and may
+ *    not be called within any flow control.  These functions may not be
+ *    called after a return statement in the function main(), but may be
+ *    called after a discard statement.
+ *
+ * and
+ *
+ *    (8) What restrictions should be imposed on the use of the
+ *        beginInvocationInterlockARB() and endInvocationInterlockARB()
+ *        functions delimiting a critical section?
+ *
+ *      RESOLVED:  We impose restrictions similar to those on the barrier()
+ *      built-in function in tessellation control shaders to ensure that any
+ *      shader using this functionality has a single critical section that can
+ *      be easily identified during compilation...
+ *
+ * The GLSL 4.60 spec says:
+ *
+ *    For tessellation control shaders, the barrier() function may only be
+ *    placed inside the function main() of the tessellation control shader and
+ *    may not be called within any control flow. Barriers are also disallowed
+ *    after a return statement in the function main(). Any such misplaced
+ *    barriers result in a compile-time error.
+ *
+ * From this we infer that the first errors mentioned in the
+ * GL_ARB_fragment_shader_interlock spec are intended to generate compile-time
+ * errors.
+ */
+#version 420
+#extension GL_ARB_fragment_shader_interlock: require
+
+uniform bool condition;
+
+void main()
+{
+	if (condition)
+		return;
+
+	beginInvocationInterlockARB();
+	endInvocationInterlockARB();
+}
diff --git a/tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-inside-do-while.frag b/tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-inside-do-while.frag
new file mode 100644
index 000000000..f68d7936a
--- /dev/null
+++ b/tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-inside-do-while.frag
@@ -0,0 +1,49 @@
+// [config]
+// expect_result: fail
+// glsl_version: 4.20
+// require_extensions: GL_ARB_fragment_shader_interlock
+// check_link: false
+// [end config]
+
+/* The GL_ARB_fragment_shader_interlock spec says:
+ *
+ *    The beginInvocationInterlockARB() and endInvocationInterlockARB() may
+ *    only be placed inside the function main() of a fragment shader and may
+ *    not be called within any flow control.  These functions may not be
+ *    called after a return statement in the function main(), but may be
+ *    called after a discard statement.
+ *
+ * and
+ *
+ *    (8) What restrictions should be imposed on the use of the
+ *        beginInvocationInterlockARB() and endInvocationInterlockARB()
+ *        functions delimiting a critical section?
+ *
+ *      RESOLVED:  We impose restrictions similar to those on the barrier()
+ *      built-in function in tessellation control shaders to ensure that any
+ *      shader using this functionality has a single critical section that can
+ *      be easily identified during compilation...
+ *
+ * The GLSL 4.60 spec says:
+ *
+ *    For tessellation control shaders, the barrier() function may only be
+ *    placed inside the function main() of the tessellation control shader and
+ *    may not be called within any control flow. Barriers are also disallowed
+ *    after a return statement in the function main(). Any such misplaced
+ *    barriers result in a compile-time error.
+ *
+ * From this we infer that the first errors mentioned in the
+ * GL_ARB_fragment_shader_interlock spec are intended to generate compile-time
+ * errors.
+ */
+#version 420
+#extension GL_ARB_fragment_shader_interlock: require
+
+void main()
+{
+	do {
+		beginInvocationInterlockARB();
+	} while (false);
+
+	endInvocationInterlockARB();
+}
diff --git a/tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-inside-for.frag b/tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-inside-for.frag
new file mode 100644
index 000000000..2ca54bc8a
--- /dev/null
+++ b/tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-inside-for.frag
@@ -0,0 +1,50 @@
+// [config]
+// expect_result: fail
+// glsl_version: 4.20
+// require_extensions: GL_ARB_fragment_shader_interlock
+// check_link: false
+// [end config]
+
+/* The GL_ARB_fragment_shader_interlock spec says:
+ *
+ *    The beginInvocationInterlockARB() and endInvocationInterlockARB() may
+ *    only be placed inside the function main() of a fragment shader and may
+ *    not be called within any flow control.  These functions may not be
+ *    called after a return statement in the function main(), but may be
+ *    called after a discard statement.
+ *
+ * and
+ *
+ *    (8) What restrictions should be imposed on the use of the
+ *        beginInvocationInterlockARB() and endInvocationInterlockARB()
+ *        functions delimiting a critical section?
+ *
+ *      RESOLVED:  We impose restrictions similar to those on the barrier()
+ *      built-in function in tessellation control shaders to ensure that any
+ *      shader using this functionality has a single critical section that can
+ *      be easily identified during compilation...
+ *
+ * The GLSL 4.60 spec says:
+ *
+ *    For tessellation control shaders, the barrier() function may only be
+ *    placed inside the function main() of the tessellation control shader and
+ *    may not be called within any control flow. Barriers are also disallowed
+ *    after a return statement in the function main(). Any such misplaced
+ *    barriers result in a compile-time error.
+ *
+ * From this we infer that the first errors mentioned in the
+ * GL_ARB_fragment_shader_interlock spec are intended to generate compile-time
+ * errors.
+ */
+#version 420
+#extension GL_ARB_fragment_shader_interlock: require
+
+void main()
+{
+	for (;;) {
+		beginInvocationInterlockARB();
+		break;
+	}
+
+	endInvocationInterlockARB();
+}
diff --git a/tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-inside-if.frag b/tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-inside-if.frag
new file mode 100644
index 000000000..53fe7e7d9
--- /dev/null
+++ b/tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-inside-if.frag
@@ -0,0 +1,48 @@
+// [config]
+// expect_result: fail
+// glsl_version: 4.20
+// require_extensions: GL_ARB_fragment_shader_interlock
+// check_link: false
+// [end config]
+
+/* The GL_ARB_fragment_shader_interlock spec says:
+ *
+ *    The beginInvocationInterlockARB() and endInvocationInterlockARB() may
+ *    only be placed inside the function main() of a fragment shader and may
+ *    not be called within any flow control.  These functions may not be
+ *    called after a return statement in the function main(), but may be
+ *    called after a discard statement.
+ *
+ * and
+ *
+ *    (8) What restrictions should be imposed on the use of the
+ *        beginInvocationInterlockARB() and endInvocationInterlockARB()
+ *        functions delimiting a critical section?
+ *
+ *      RESOLVED:  We impose restrictions similar to those on the barrier()
+ *      built-in function in tessellation control shaders to ensure that any
+ *      shader using this functionality has a single critical section that can
+ *      be easily identified during compilation...
+ *
+ * The GLSL 4.60 spec says:
+ *
+ *    For tessellation control shaders, the barrier() function may only be
+ *    placed inside the function main() of the tessellation control shader and
+ *    may not be called within any control flow. Barriers are also disallowed
+ *    after a return statement in the function main(). Any such misplaced
+ *    barriers result in a compile-time error.
+ *
+ * From this we infer that the first errors mentioned in the
+ * GL_ARB_fragment_shader_interlock spec are intended to generate compile-time
+ * errors.
+ */
+#version 420
+#extension GL_ARB_fragment_shader_interlock: require
+
+void main()
+{
+	if (true)
+		beginInvocationInterlockARB();
+
+	endInvocationInterlockARB();
+}
diff --git a/tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-inside-non-main-function.frag b/tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-inside-non-main-function.frag
new file mode 100644
index 000000000..63c1c6c4b
--- /dev/null
+++ b/tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-inside-non-main-function.frag
@@ -0,0 +1,51 @@
+// [config]
+// expect_result: fail
+// glsl_version: 4.20
+// require_extensions: GL_ARB_fragment_shader_interlock
+// check_link: false
+// [end config]
+
+/* The GL_ARB_fragment_shader_interlock spec says:
+ *
+ *    The beginInvocationInterlockARB() and endInvocationInterlockARB() may
+ *    only be placed inside the function main() of a fragment shader and may
+ *    not be called within any flow control.  These functions may not be
+ *    called after a return statement in the function main(), but may be
+ *    called after a discard statement.
+ *
+ * and
+ *
+ *    (8) What restrictions should be imposed on the use of the
+ *        beginInvocationInterlockARB() and endInvocationInterlockARB()
+ *        functions delimiting a critical section?
+ *
+ *      RESOLVED:  We impose restrictions similar to those on the barrier()
+ *      built-in function in tessellation control shaders to ensure that any
+ *      shader using this functionality has a single critical section that can
+ *      be easily identified during compilation...
+ *
+ * The GLSL 4.60 spec says:
+ *
+ *    For tessellation control shaders, the barrier() function may only be
+ *    placed inside the function main() of the tessellation control shader and
+ *    may not be called within any control flow. Barriers are also disallowed
+ *    after a return statement in the function main(). Any such misplaced
+ *    barriers result in a compile-time error.
+ *
+ * From this we infer that the first errors mentioned in the
+ * GL_ARB_fragment_shader_interlock spec are intended to generate compile-time
+ * errors.
+ */
+#version 420
+#extension GL_ARB_fragment_shader_interlock: require
+
+void wrapper()
+{
+	beginInvocationInterlockARB();
+}
+
+void main()
+{
+	wrapper();
+	endInvocationInterlockARB();
+}
diff --git a/tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-inside-while.frag b/tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-inside-while.frag
new file mode 100644
index 000000000..6283c5ef7
--- /dev/null
+++ b/tests/spec/arb_fragment_shader_interlock/compiler/beginInvocationInterlock-inside-while.frag
@@ -0,0 +1,49 @@
+// [config]
+// expect_result: fail
+// glsl_version: 4.20
+// require_extensions: GL_ARB_fragment_shader_interlock
+// check_link: false
+// [end config]
+
+/* The GL_ARB_fragment_shader_interlock spec says:
+ *
+ *    A compile- or link-time error will be generated if main() calls either
+ *    function more than once, contains a call to one function without a
+ *    matching call to the other, or calls endInvocationInterlockARB() before
+ *    calling beginInvocationInterlockARB().
+ *
+ * and
+ *
+ *    (8) What restrictions should be imposed on the use of the
+ *        beginInvocationInterlockARB() and endInvocationInterlockARB() functions
+ *        delimiting a critical section?
+ *
+ *      RESOLVED:  We impose restrictions similar to those on the barrier()
+ *      built-in function in tessellation control shaders to ensure that any
+ *      shader using this functionality has a single critical section that can
+ *      be easily identified during compilation...
+ *
+ * The GLSL 4.60 spec says:
+ *
+ *    For tessellation control shaders, the barrier() function may only be
+ *    placed inside the function main() of the tessellation control shader and
+ *    may not be called within any control flow. Barriers are also disallowed
+ *    after a return statement in the function main(). Any such misplaced
+ *    barriers result in a compile-time error.
+ *
+ * From this we infer that the first errors mentioned in the
+ * GL_ARB_fragment_shader_interlock spec are intended to generate compile-time
+ * errors.
+ */
+#version 420
+#extension GL_ARB_fragment_shader_interlock: require
+
+void main()
+{
+	while (true) {
+		beginInvocationInterlockARB();
+		break;
+	}
+
+	endInvocationInterlockARB();
+}
diff --git a/tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-after-discard.frag b/tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-after-discard.frag
new file mode 100644
index 000000000..82344231d
--- /dev/null
+++ b/tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-after-discard.frag
@@ -0,0 +1,28 @@
+// [config]
+// expect_result: pass
+// glsl_version: 4.20
+// require_extensions: GL_ARB_fragment_shader_interlock
+// [end config]
+
+/* The GL_ARB_fragment_shader_interlock spec says:
+ *
+ *    The beginInvocationInterlockARB() and endInvocationInterlockARB() may
+ *    only be placed inside the function main() of a fragment shader and may
+ *    not be called within any flow control.  These functions may not be
+ *    called after a return statement in the function main(), but may be
+ *    called after a discard statement.
+ */
+#version 420
+#extension GL_ARB_fragment_shader_interlock: require
+
+in float f;
+
+void main()
+{
+	beginInvocationInterlockARB();
+
+	if (f < 0.5)
+		discard;
+
+	endInvocationInterlockARB();
+}
diff --git a/tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-after-return.frag b/tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-after-return.frag
new file mode 100644
index 000000000..83fcaf47a
--- /dev/null
+++ b/tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-after-return.frag
@@ -0,0 +1,52 @@
+// [config]
+// expect_result: fail
+// glsl_version: 4.20
+// require_extensions: GL_ARB_fragment_shader_interlock
+// check_link: false
+// [end config]
+
+/* The GL_ARB_fragment_shader_interlock spec says:
+ *
+ *    The beginInvocationInterlockARB() and endInvocationInterlockARB() may
+ *    only be placed inside the function main() of a fragment shader and may
+ *    not be called within any flow control.  These functions may not be
+ *    called after a return statement in the function main(), but may be
+ *    called after a discard statement.
+ *
+ * and
+ *
+ *    (8) What restrictions should be imposed on the use of the
+ *        beginInvocationInterlockARB() and endInvocationInterlockARB()
+ *        functions delimiting a critical section?
+ *
+ *      RESOLVED:  We impose restrictions similar to those on the barrier()
+ *      built-in function in tessellation control shaders to ensure that any
+ *      shader using this functionality has a single critical section that can
+ *      be easily identified during compilation...
+ *
+ * The GLSL 4.60 spec says:
+ *
+ *    For tessellation control shaders, the barrier() function may only be
+ *    placed inside the function main() of the tessellation control shader and
+ *    may not be called within any control flow. Barriers are also disallowed
+ *    after a return statement in the function main(). Any such misplaced
+ *    barriers result in a compile-time error.
+ *
+ * From this we infer that the first errors mentioned in the
+ * GL_ARB_fragment_shader_interlock spec are intended to generate compile-time
+ * errors.
+ */
+#version 420
+#extension GL_ARB_fragment_shader_interlock: require
+
+uniform bool condition;
+
+void main()
+{
+	beginInvocationInterlockARB();
+
+	if (condition)
+		return;
+
+	endInvocationInterlockARB();
+}
diff --git a/tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-inside-do-while.frag b/tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-inside-do-while.frag
new file mode 100644
index 000000000..8875e1ff7
--- /dev/null
+++ b/tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-inside-do-while.frag
@@ -0,0 +1,49 @@
+// [config]
+// expect_result: fail
+// glsl_version: 4.20
+// require_extensions: GL_ARB_fragment_shader_interlock
+// check_link: false
+// [end config]
+
+/* The GL_ARB_fragment_shader_interlock spec says:
+ *
+ *    The beginInvocationInterlockARB() and endInvocationInterlockARB() may
+ *    only be placed inside the function main() of a fragment shader and may
+ *    not be called within any flow control.  These functions may not be
+ *    called after a return statement in the function main(), but may be
+ *    called after a discard statement.
+ *
+ * and
+ *
+ *    (8) What restrictions should be imposed on the use of the
+ *        beginInvocationInterlockARB() and endInvocationInterlockARB()
+ *        functions delimiting a critical section?
+ *
+ *      RESOLVED:  We impose restrictions similar to those on the barrier()
+ *      built-in function in tessellation control shaders to ensure that any
+ *      shader using this functionality has a single critical section that can
+ *      be easily identified during compilation...
+ *
+ * The GLSL 4.60 spec says:
+ *
+ *    For tessellation control shaders, the barrier() function may only be
+ *    placed inside the function main() of the tessellation control shader and
+ *    may not be called within any control flow. Barriers are also disallowed
+ *    after a return statement in the function main(). Any such misplaced
+ *    barriers result in a compile-time error.
+ *
+ * From this we infer that the first errors mentioned in the
+ * GL_ARB_fragment_shader_interlock spec are intended to generate compile-time
+ * errors.
+ */
+#version 420
+#extension GL_ARB_fragment_shader_interlock: require
+
+void main()
+{
+	beginInvocationInterlockARB();
+
+	do {
+		endInvocationInterlockARB();
+	} while (false);
+}
diff --git a/tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-inside-for.frag b/tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-inside-for.frag
new file mode 100644
index 000000000..468054fbf
--- /dev/null
+++ b/tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-inside-for.frag
@@ -0,0 +1,50 @@
+// [config]
+// expect_result: fail
+// glsl_version: 4.20
+// require_extensions: GL_ARB_fragment_shader_interlock
+// check_link: false
+// [end config]
+
+/* The GL_ARB_fragment_shader_interlock spec says:
+ *
+ *    The beginInvocationInterlockARB() and endInvocationInterlockARB() may
+ *    only be placed inside the function main() of a fragment shader and may
+ *    not be called within any flow control.  These functions may not be
+ *    called after a return statement in the function main(), but may be
+ *    called after a discard statement.
+ *
+ * and
+ *
+ *    (8) What restrictions should be imposed on the use of the
+ *        beginInvocationInterlockARB() and endInvocationInterlockARB()
+ *        functions delimiting a critical section?
+ *
+ *      RESOLVED:  We impose restrictions similar to those on the barrier()
+ *      built-in function in tessellation control shaders to ensure that any
+ *      shader using this functionality has a single critical section that can
+ *      be easily identified during compilation...
+ *
+ * The GLSL 4.60 spec says:
+ *
+ *    For tessellation control shaders, the barrier() function may only be
+ *    placed inside the function main() of the tessellation control shader and
+ *    may not be called within any control flow. Barriers are also disallowed
+ *    after a return statement in the function main(). Any such misplaced
+ *    barriers result in a compile-time error.
+ *
+ * From this we infer that the first errors mentioned in the
+ * GL_ARB_fragment_shader_interlock spec are intended to generate compile-time
+ * errors.
+ */
+#version 420
+#extension GL_ARB_fragment_shader_interlock: require
+
+void main()
+{
+	beginInvocationInterlockARB();
+
+	for (;;) {
+		endInvocationInterlockARB();
+		break;
+	}
+}
diff --git a/tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-inside-if.frag b/tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-inside-if.frag
new file mode 100644
index 000000000..648f10709
--- /dev/null
+++ b/tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-inside-if.frag
@@ -0,0 +1,48 @@
+// [config]
+// expect_result: fail
+// glsl_version: 4.20
+// require_extensions: GL_ARB_fragment_shader_interlock
+// check_link: false
+// [end config]
+
+/* The GL_ARB_fragment_shader_interlock spec says:
+ *
+ *    The beginInvocationInterlockARB() and endInvocationInterlockARB() may
+ *    only be placed inside the function main() of a fragment shader and may
+ *    not be called within any flow control.  These functions may not be
+ *    called after a return statement in the function main(), but may be
+ *    called after a discard statement.
+ *
+ * and
+ *
+ *    (8) What restrictions should be imposed on the use of the
+ *        beginInvocationInterlockARB() and endInvocationInterlockARB()
+ *        functions delimiting a critical section?
+ *
+ *      RESOLVED:  We impose restrictions similar to those on the barrier()
+ *      built-in function in tessellation control shaders to ensure that any
+ *      shader using this functionality has a single critical section that can
+ *      be easily identified during compilation...
+ *
+ * The GLSL 4.60 spec says:
+ *
+ *    For tessellation control shaders, the barrier() function may only be
+ *    placed inside the function main() of the tessellation control shader and
+ *    may not be called within any control flow. Barriers are also disallowed
+ *    after a return statement in the function main(). Any such misplaced
+ *    barriers result in a compile-time error.
+ *
+ * From this we infer that the first errors mentioned in the
+ * GL_ARB_fragment_shader_interlock spec are intended to generate compile-time
+ * errors.
+ */
+#version 420
+#extension GL_ARB_fragment_shader_interlock: require
+
+void main()
+{
+	beginInvocationInterlockARB();
+
+	if (true)
+		endInvocationInterlockARB();
+}
diff --git a/tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-inside-non-main-function.frag b/tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-inside-non-main-function.frag
new file mode 100644
index 000000000..0d34cb765
--- /dev/null
+++ b/tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-inside-non-main-function.frag
@@ -0,0 +1,51 @@
+// [config]
+// expect_result: fail
+// glsl_version: 4.20
+// require_extensions: GL_ARB_fragment_shader_interlock
+// check_link: false
+// [end config]
+
+/* The GL_ARB_fragment_shader_interlock spec says:
+ *
+ *    The beginInvocationInterlockARB() and endInvocationInterlockARB() may
+ *    only be placed inside the function main() of a fragment shader and may
+ *    not be called within any flow control.  These functions may not be
+ *    called after a return statement in the function main(), but may be
+ *    called after a discard statement.
+ *
+ * and
+ *
+ *    (8) What restrictions should be imposed on the use of the
+ *        beginInvocationInterlockARB() and endInvocationInterlockARB()
+ *        functions delimiting a critical section?
+ *
+ *      RESOLVED:  We impose restrictions similar to those on the barrier()
+ *      built-in function in tessellation control shaders to ensure that any
+ *      shader using this functionality has a single critical section that can
+ *      be easily identified during compilation...
+ *
+ * The GLSL 4.60 spec says:
+ *
+ *    For tessellation control shaders, the barrier() function may only be
+ *    placed inside the function main() of the tessellation control shader and
+ *    may not be called within any control flow. Barriers are also disallowed
+ *    after a return statement in the function main(). Any such misplaced
+ *    barriers result in a compile-time error.
+ *
+ * From this we infer that the first errors mentioned in the
+ * GL_ARB_fragment_shader_interlock spec are intended to generate compile-time
+ * errors.
+ */
+#version 420
+#extension GL_ARB_fragment_shader_interlock: require
+
+void wrapper()
+{
+	endInvocationInterlockARB();
+}
+
+void main()
+{
+	beginInvocationInterlockARB();
+	wrapper();
+}
diff --git a/tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-inside-while.frag b/tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-inside-while.frag
new file mode 100644
index 000000000..9b3fc424d
--- /dev/null
+++ b/tests/spec/arb_fragment_shader_interlock/compiler/endInvocationInterlock-inside-while.frag
@@ -0,0 +1,50 @@
+// [config]
+// expect_result: fail
+// glsl_version: 4.20
+// require_extensions: GL_ARB_fragment_shader_interlock
+// check_link: false
+// [end config]
+
+/* The GL_ARB_fragment_shader_interlock spec says:
+ *
+ *    The beginInvocationInterlockARB() and endInvocationInterlockARB() may
+ *    only be placed inside the function main() of a fragment shader and may
+ *    not be called within any flow control.  These functions may not be
+ *    called after a return statement in the function main(), but may be
+ *    called after a discard statement.
+ *
+ * and
+ *
+ *    (8) What restrictions should be imposed on the use of the
+ *        beginInvocationInterlockARB() and endInvocationInterlockARB()
+ *        functions delimiting a critical section?
+ *
+ *      RESOLVED:  We impose restrictions similar to those on the barrier()
+ *      built-in function in tessellation control shaders to ensure that any
+ *      shader using this functionality has a single critical section that can
+ *      be easily identified during compilation...
+ *
+ * The GLSL 4.60 spec says:
+ *
+ *    For tessellation control shaders, the barrier() function may only be
+ *    placed inside the function main() of the tessellation control shader and
+ *    may not be called within any control flow. Barriers are also disallowed
+ *    after a return statement in the function main(). Any such misplaced
+ *    barriers result in a compile-time error.
+ *
+ * From this we infer that the first errors mentioned in the
+ * GL_ARB_fragment_shader_interlock spec are intended to generate compile-time
+ * errors.
+ */
+#version 420
+#extension GL_ARB_fragment_shader_interlock: require
+
+void main()
+{
+	beginInvocationInterlockARB();
+
+	while (true) {
+		endInvocationInterlockARB();
+		break;
+	}
+}
-- 
2.14.4



More information about the Piglit mailing list