diff options
-rw-r--r-- | src/compiler/glsl/ast.h | 6 | ||||
-rw-r--r-- | src/compiler/glsl/ast_type.cpp | 50 | ||||
-rw-r--r-- | src/compiler/glsl/glsl_parser.yy | 27 |
3 files changed, 60 insertions, 23 deletions
diff --git a/src/compiler/glsl/ast.h b/src/compiler/glsl/ast.h index e40387b8f65..d8b425c5981 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 788f734b662..dc4f2073fc9 100644 --- a/src/compiler/glsl/ast_type.cpp +++ b/src/compiler/glsl/ast_type.cpp @@ -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. * diff --git a/src/compiler/glsl/glsl_parser.yy b/src/compiler/glsl/glsl_parser.yy index 9136fddbd14..0c3781c3361 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) { @@ -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; + } } ; |