[Mesa-dev] [PATCH 1/3] glsl: Compile error if fs defines conflicting qualifiers for gl_FragCoord

Anuj Phogat anuj.phogat at gmail.com
Mon Feb 10 17:29:56 PST 2014


GLSL 1.50 spec says:
   "If gl_FragCoord is redeclared in any fragment shader in a program,
    it must be redeclared in all the fragment shaders in that
    program that have a static use gl_FragCoord. All redeclarations of
    gl_FragCoord in all fragment shaders in a single program must
    have the same set of qualifiers."

This patch makes the glsl compiler to generate an error if we have a
fragment shader defined with conflicting layout qualifier declarations
for gl_FragCoord. For example:

layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord;
layout(pixel_center_integer) in vec4 gl_FragCoord;
void main()
{
   gl_FragColor = gl_FragCoord.xyzz;
}

Cc: <mesa-stable at lists.freedesktop.org>
Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
---
 src/glsl/ast_to_hir.cpp         | 39 +++++++++++++++++++++++++++++++++++++++
 src/glsl/glsl_parser_extras.cpp |  3 +++
 src/glsl/glsl_parser_extras.h   | 10 ++++++++++
 3 files changed, 52 insertions(+)

diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index c89a26b..7d7d89b 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -2374,6 +2374,45 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual,
 		       qual_string);
    }
 
+   /* Make sure all gl_FragCoord redeclarations specify the same layout
+    * qualifier type.
+    */
+   bool conflicting_pixel_center_integer =
+      state->fs_pixel_center_integer &&
+      !qual->flags.q.pixel_center_integer;
+
+   bool conflicting_origin_upper_left =
+      state->fs_origin_upper_left &&
+      !qual->flags.q.origin_upper_left;
+
+   if (conflicting_pixel_center_integer || conflicting_origin_upper_left) {
+      const char *const qual_string =
+         (conflicting_pixel_center_integer && conflicting_origin_upper_left) ?
+         "pixel_center_integer, origin_upper_left" :
+         (conflicting_pixel_center_integer ?
+         "origin_upper_left" : "pixel_center_integer");
+
+      const char *const state_string =
+         (state->fs_pixel_center_integer &&
+          state->fs_origin_upper_left) ?
+         "pixel_center_integer, origin_upper_left" :
+         (state->fs_origin_upper_left ?
+         "origin_upper_left" : "pixel_center_integer");
+
+      _mesa_glsl_error(loc, state,
+                       "different layout qualifiers were specified with "
+                       "`gl_FragCoord' (%s) and (%s) "
+                       "redeclare fragment shader input `gl_FragCoord'",
+                       state_string,
+                       qual_string);
+   }
+
+   if (qual->flags.q.pixel_center_integer)
+      state->fs_pixel_center_integer = true;
+
+   if (qual->flags.q.origin_upper_left)
+      state->fs_origin_upper_left = true;
+
    if (qual->flags.q.explicit_location) {
       validate_explicit_location(qual, var, state, loc);
    } else if (qual->flags.q.explicit_index) {
diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
index b822d22..b06337e 100644
--- a/src/glsl/glsl_parser_extras.cpp
+++ b/src/glsl/glsl_parser_extras.cpp
@@ -193,6 +193,9 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx,
    this->default_uniform_qualifier->flags.q.shared = 1;
    this->default_uniform_qualifier->flags.q.column_major = 1;
 
+   this->fs_origin_upper_left = false;
+   this->fs_pixel_center_integer = false;
+
    this->gs_input_prim_type_specified = false;
    this->gs_input_prim_type = GL_POINTS;
    this->gs_input_size = 0;
diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h
index 7d66147..674dae5 100644
--- a/src/glsl/glsl_parser_extras.h
+++ b/src/glsl/glsl_parser_extras.h
@@ -182,6 +182,16 @@ struct _mesa_glsl_parse_state {
    struct ast_type_qualifier *default_uniform_qualifier;
 
    /**
+    * True if a fragment shader has an input layout for redeclaring the
+    * built-in variable gl_FragCoord.
+    *
+    * Note: this value is computed at ast_to_hir time rather than at parse
+    * time.
+    */
+   bool fs_origin_upper_left;
+   bool fs_pixel_center_integer;
+
+   /**
     * True if a geometry shader input primitive type was specified using a
     * layout directive.
     *
-- 
1.8.3.1



More information about the mesa-dev mailing list