glsl: Compile error if fs uses gl_FragCoord before first redeclaration
authorAnuj Phogat <anuj.phogat@gmail.com>
Fri, 21 Feb 2014 02:32:25 +0000 (18:32 -0800)
committerAnuj Phogat <anuj.phogat@gmail.com>
Thu, 1 May 2014 17:58:39 +0000 (10:58 -0700)
Section 4.3.8.1, page 39 of GLSL 1.50 spec says:
  "Within any shader, the first redeclarations of gl_FragCoord
   must appear before any use of gl_FragCoord."

GLSL compiler should generate an error in following case:

vec4 p = gl_FragCoord;
layout(origin_upper_left) in vec4 gl_FragCoord;

void main()
{
}

Signed-off-by: Anuj Phogat <anuj.phogat@gmail.com>
Cc: <mesa-stable@lists.freedesktop.org>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/glsl/ast_to_hir.cpp

index 35220dd8cf5863459b80a4f032d291b2875f178a..f257a24868047aa0e1960c077c0c24b5f6d546e7 100644 (file)
@@ -2535,6 +2535,23 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual,
 
    if (var->name != NULL && strcmp(var->name, "gl_FragCoord") == 0) {
 
+      /* Section 4.3.8.1, page 39 of GLSL 1.50 spec says:
+       *
+       *    "Within any shader, the first redeclarations of gl_FragCoord
+       *     must appear before any use of gl_FragCoord."
+       *
+       * Generate a compiler error if above condition is not met by the
+       * fragment shader.
+       */
+      ir_variable *earlier = state->symbols->get_variable("gl_FragCoord");
+      if (earlier != NULL &&
+          earlier->data.used &&
+          !state->fs_redeclares_gl_fragcoord) {
+         _mesa_glsl_error(loc, state,
+                          "gl_FragCoord used before its first redeclaration "
+                          "in fragment shader");
+      }
+
       /* Make sure all gl_FragCoord redeclarations specify the same layout
        * qualifiers.
        */