On Mon, 2016-11-14 at 19:15 +0200, Andres Gomez wrote: > 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.
I'm not entirely sure if we need to call it in all these locations but I guess it won't hurt to much. Reviewed-by: Timothy Arceri <timothy.arc...@collabora.com> > > Signed-off-by: Andres Gomez <ago...@igalia.com> > --- > src/compiler/glsl/ast.h | 6 +++++ > src/compiler/glsl/ast_type.cpp | 48 ++++++++++++++++++++++------ > ------------ > src/compiler/glsl/glsl_parser.yy | 27 +++++++++++++++++++++- > 3 files changed, 58 insertions(+), 23 deletions(-) > > diff --git a/src/compiler/glsl/ast.h b/src/compiler/glsl/ast.h > index e40387b..d8b425c 100644 > --- a/src/compiler/glsl/ast.h > +++ b/src/compiler/glsl/ast.h > @@ -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, > diff --git a/src/compiler/glsl/ast_type.cpp > b/src/compiler/glsl/ast_type.cpp > index b50e534..01ce641 100644 > --- a/src/compiler/glsl/ast_type.cpp > +++ b/src/compiler/glsl/ast_type.cpp > @@ -276,29 +276,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); > - } > - } > } > } > > @@ -654,6 +635,29 @@ > 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. > * > diff --git a/src/compiler/glsl/glsl_parser.yy > b/src/compiler/glsl/glsl_parser.yy > index f3c0884..441ed9d 100644 > --- a/src/compiler/glsl/glsl_parser.yy > +++ b/src/compiler/glsl/glsl_parser.yy > @@ -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) { > @@ -2907,6 +2918,10 @@ layout_defaults: > merge_qualifier(& @1, state, $1, false)) { > YYERROR; > } > + if (!state->default_uniform_qualifier-> > + push_to_global(& @1, state)) { > + YYERROR; > + } > } > | layout_buffer_defaults > { > @@ -2915,6 +2930,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: > * > @@ -2932,6 +2951,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 > { > @@ -2939,5 +2961,8 @@ layout_defaults: > if (!$1.merge_into_out_qualifier(& @1, state, $$)) { > YYERROR; > } > + if (!state->out_qualifier->push_to_global(& @1, state)) { > + YYERROR; > + } > } > ; _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev