glsl: throw error when using invariant(all) in a fragment shader
authorTapani Pälli <tapani.palli@intel.com>
Tue, 4 Nov 2014 12:20:15 +0000 (14:20 +0200)
committerTapani Pälli <tapani.palli@intel.com>
Wed, 3 Dec 2014 06:56:19 +0000 (08:56 +0200)
Note that some of the GLSL specifications explicitly state this as
compile error, some simply state that 'it is an error'.

Signed-off-by: Tapani Pälli <tapani.palli@intel.com>
Reviewed-by: Chris Forbes <chrisf@ijw.co.nz>
src/glsl/glsl_parser.yy

index 6160e265e79dcfad6427774e97e57dadb3cb6b67..6a55a4e6bf610c2875f516b24ff7054f31c64a12 100644 (file)
@@ -331,7 +331,18 @@ pragma_statement:
    | PRAGMA_OPTIMIZE_OFF EOL
    | PRAGMA_INVARIANT_ALL EOL
    {
-      if (!state->is_version(120, 100)) {
+      /* Pragma invariant(all) cannot be used in a fragment shader.
+       *
+       * Page 27 of the GLSL 1.20 spec, Page 53 of the GLSL ES 3.00 spec:
+       *
+       *     "It is an error to use this pragma in a fragment shader."
+       */
+      if (state->is_version(120, 300) &&
+          state->stage == MESA_SHADER_FRAGMENT) {
+         _mesa_glsl_error(& @1, state,
+                          "pragma `invariant(all)' cannot be used "
+                          "in a fragment shader.");
+      } else if (!state->is_version(120, 100)) {
          _mesa_glsl_warning(& @1, state,
                             "pragma `invariant(all)' not supported in %s "
                             "(GLSL ES 1.00 or GLSL 1.20 required)",