glsl: allow layout qualifier overrides with ARB_shading_language_420pack
authorDave Airlie <airlied@redhat.com>
Mon, 23 May 2016 04:29:09 +0000 (14:29 +1000)
committerDave Airlie <airlied@redhat.com>
Mon, 23 May 2016 06:19:57 +0000 (16:19 +1000)
GLSL 4.20 allows overriding the layout qualifiers.

This helps fix:
GL45-CTS.shading_language_420pack.qualifier_override_layout

Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/compiler/glsl/ast_type.cpp

index c44dcc605aec346483a56ed086937651734cc0e5..54e9dadaa946ea1a836d1cd680832ede95adba48 100644 (file)
@@ -711,7 +711,12 @@ ast_layout_expression::process_qualifier_constant(struct _mesa_glsl_parse_state
          return false;
       }
 
-      if (!first_pass && *value != const_int->value.u[0]) {
+      /* From section 4.4 "Layout Qualifiers" of the GLSL 4.50 spec:
+       * "When the same layout-qualifier-name occurs multiple times,
+       *  in a single declaration, the last occurrence overrides the
+       *  former occurrence(s)."
+       */
+      if (!state->has_420pack() && !first_pass && *value != const_int->value.u[0]) {
          YYLTYPE loc = const_expression->get_location();
          _mesa_glsl_error(&loc, state, "%s layout qualifier does not "
                          "match previous declaration (%d vs %d)",