summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnuj Phogat <anuj.phogat@gmail.com>2014-02-20 18:32:25 -0800
committerAnuj Phogat <anuj.phogat@gmail.com>2014-05-01 10:58:39 -0700
commita751adf07117ec4b3659fe60d0a833ebfcd4f840 (patch)
tree7ffc1e27b49da12797ba2d8305beef19724bfa7e
parent581e4acb0d68eb1063df3919e19e0ef9d86eebff (diff)
glsl: Compile error if fs uses gl_FragCoord before first redeclaration
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>
-rw-r--r--src/glsl/ast_to_hir.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index 35220dd8cf5..f257a248680 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -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.
*/