glsl: push layout-qualifier-name values from variable declarations to global
authorAndres Gomez <agomez@igalia.com>
Thu, 6 Oct 2016 22:52:06 +0000 (01:52 +0300)
committerAndres Gomez <agomez@igalia.com>
Fri, 25 Nov 2016 11:18:30 +0000 (13:18 +0200)
After the previous modifications in the merging of the
layout-qualifier-name values, we no longer push the final value in a
declaration to the global values.

This regression happens because we don't call for merging on the
right-most layout qualifier of a declaration which is also the
overriding one in case of multiple appearances.

Now, we add a new method to push these values to the global ones and
we call for this just after all the layout-qualifier collapsing has
happened in a declaration.

This simplifies how this was working in two ways; we make a clear
differentiation of when we are pushing this to the global values since
before it was mixed in the merging call and we only run this once all
the processing for layout-qualifiers in a declaration has happened.

Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
Signed-off-by: Andres Gomez <agomez@igalia.com>
src/compiler/glsl/ast.h
src/compiler/glsl/ast_type.cpp
src/compiler/glsl/glsl_parser.yy

index e40387b8f657657c873eb1152d6e361fa292e7c4..d8b425c5981cecc2eaaa0a570c332e4011739431 100644 (file)
@@ -782,6 +782,12 @@ struct ast_type_qualifier {
                                 _mesa_glsl_parse_state *state,
                                 ast_node* &node);
 
+   /**
+    * Push pending layout qualifiers to the global values.
+    */
+   bool push_to_global(YYLTYPE *loc,
+                       _mesa_glsl_parse_state *state);
+
    bool validate_flags(YYLTYPE *loc,
                        _mesa_glsl_parse_state *state,
                        const ast_type_qualifier &allowed_flags,
index 788f734b662443e50b4728db1d3ccf21e7933e01..dc4f2073fc9e43b0a25fa89622b288b32cca5278 100644 (file)
@@ -337,29 +337,10 @@ ast_type_qualifier::merge_qualifier(YYLTYPE *loc,
          }
       }
 
-      if (q.flags.q.explicit_xfb_stride)
+      if (q.flags.q.explicit_xfb_stride) {
+         this->flags.q.xfb_stride = 1;
+         this->flags.q.explicit_xfb_stride = 1;
          this->xfb_stride = q.xfb_stride;
-
-      /* Merge all we xfb_stride qualifiers into the global out */
-      if (q.flags.q.explicit_xfb_stride || this->flags.q.xfb_stride) {
-
-         /* Set xfb_stride flag to 0 to avoid adding duplicates every time
-          * there is a merge.
-          */
-         this->flags.q.xfb_stride = 0;
-
-         unsigned buff_idx;
-         if (process_qualifier_constant(state, loc, "xfb_buffer",
-                                        this->xfb_buffer, &buff_idx)) {
-            if (state->out_qualifier->out_xfb_stride[buff_idx]
-                && !is_single_layout_merge && !is_multiple_layouts_merge) {
-               state->out_qualifier->out_xfb_stride[buff_idx]->merge_qualifier(
-                  new(state->linalloc) ast_layout_expression(*loc, this->xfb_stride));
-            } else {
-               state->out_qualifier->out_xfb_stride[buff_idx] =
-                  new(state->linalloc) ast_layout_expression(*loc, this->xfb_stride);
-            }
-         }
       }
    }
 
@@ -672,6 +653,31 @@ ast_type_qualifier::merge_into_in_qualifier(YYLTYPE *loc,
    return r;
 }
 
+bool
+ast_type_qualifier::push_to_global(YYLTYPE *loc,
+                                   _mesa_glsl_parse_state *state)
+{
+   if (this->flags.q.xfb_stride) {
+      this->flags.q.xfb_stride = 0;
+
+      unsigned buff_idx;
+      if (process_qualifier_constant(state, loc, "xfb_buffer",
+                                     this->xfb_buffer, &buff_idx)) {
+         if (state->out_qualifier->out_xfb_stride[buff_idx]) {
+            state->out_qualifier->out_xfb_stride[buff_idx]->merge_qualifier(
+               new(state->linalloc) ast_layout_expression(*loc,
+                                                          this->xfb_stride));
+         } else {
+            state->out_qualifier->out_xfb_stride[buff_idx] =
+               new(state->linalloc) ast_layout_expression(*loc,
+                                                          this->xfb_stride);
+         }
+      }
+   }
+
+   return true;
+}
+
 /**
  * Check if the current type qualifier has any illegal flags.
  *
index 9136fddbd14c658d47de9c890eff006761332803..0c3781c33616a619f559191fba62f180c958f991 100644 (file)
@@ -845,7 +845,9 @@ declaration:
          }
       }
       block->layout = block->default_layout;
-
+      if (!block->layout.push_to_global(& @1, state)) {
+         YYERROR;
+      }
       $$ = $1;
    }
    ;
@@ -921,6 +923,9 @@ parameter_declaration:
    {
       $$ = $2;
       $$->type->qualifier = $1;
+      if (!$$->type->qualifier.push_to_global(& @1, state)) {
+         YYERROR;
+      }
    }
    | parameter_qualifier parameter_type_specifier
    {
@@ -930,6 +935,9 @@ parameter_declaration:
       $$->type = new(ctx) ast_fully_specified_type();
       $$->type->set_location_range(@1, @2);
       $$->type->qualifier = $1;
+      if (!$$->type->qualifier.push_to_global(& @1, state)) {
+         YYERROR;
+      }
       $$->type->specifier = $2;
    }
    ;
@@ -1145,6 +1153,9 @@ fully_specified_type:
       $$ = new(ctx) ast_fully_specified_type();
       $$->set_location_range(@1, @2);
       $$->qualifier = $1;
+      if (!$$->qualifier.push_to_global(& @1, state)) {
+         YYERROR;
+      }
       $$->specifier = $2;
       if ($$->specifier->structure != NULL &&
           $$->specifier->structure->is_declaration) {
@@ -2911,6 +2922,10 @@ layout_defaults:
              merge_qualifier(& @1, state, $1, false)) {
          YYERROR;
       }
+      if (!state->default_uniform_qualifier->
+             push_to_global(& @1, state)) {
+         YYERROR;
+      }
    }
    | layout_buffer_defaults
    {
@@ -2919,6 +2934,10 @@ layout_defaults:
              merge_qualifier(& @1, state, $1, false)) {
          YYERROR;
       }
+      if (!state->default_shader_storage_qualifier->
+             push_to_global(& @1, state)) {
+         YYERROR;
+      }
 
       /* From the GLSL 4.50 spec, section 4.4.5:
        *
@@ -2936,6 +2955,9 @@ layout_defaults:
       if (!$1.merge_into_in_qualifier(& @1, state, $$)) {
          YYERROR;
       }
+      if (!state->in_qualifier->push_to_global(& @1, state)) {
+         YYERROR;
+      }
    }
    | layout_out_defaults
    {
@@ -2943,5 +2965,8 @@ layout_defaults:
       if (!$1.merge_into_out_qualifier(& @1, state, $$)) {
          YYERROR;
       }
+      if (!state->out_qualifier->push_to_global(& @1, state)) {
+         YYERROR;
+      }
    }
    ;