Reviewed-by: Samuel Iglesias Gonsálvez <sigles...@igalia.com>
On Sun, 2016-02-14 at 20:28 +1100, Timothy Arceri wrote: > Previously interface blocks were giving the global default flags of > uniform blocks. This meant we could not check for invalid qualifiers > on interface blocks because they always contained invalid flags. > > This changes parsing so that interface blocks now get an empty > set of layouts. > --- > src/compiler/glsl/ast.h | 5 ++-- > src/compiler/glsl/glsl_parser.yy | 51 +++++++++++++++++------------- > ---------- > 2 files changed, 24 insertions(+), 32 deletions(-) > > diff --git a/src/compiler/glsl/ast.h b/src/compiler/glsl/ast.h > index 3b1295c..275e1b3 100644 > --- a/src/compiler/glsl/ast.h > +++ b/src/compiler/glsl/ast.h > @@ -1087,10 +1087,9 @@ public: > > class ast_interface_block : public ast_node { > public: > - ast_interface_block(ast_type_qualifier layout, > - const char *instance_name, > + ast_interface_block(const char *instance_name, > ast_array_specifier *array_specifier) > - : layout(layout), block_name(NULL), instance_name(instance_name), > + : block_name(NULL), instance_name(instance_name), > array_specifier(array_specifier) > { > } > diff --git a/src/compiler/glsl/glsl_parser.yy > b/src/compiler/glsl/glsl_parser.yy > index 53c3225..641d046 100644 > --- a/src/compiler/glsl/glsl_parser.yy > +++ b/src/compiler/glsl/glsl_parser.yy > @@ -170,7 +170,6 @@ static bool match_layout_qualifier(const char > *s1, const char *s2, > %token <identifier> IDENTIFIER TYPE_IDENTIFIER NEW_IDENTIFIER > %type <identifier> any_identifier > %type <interface_block> instance_name_opt > -%type <interface_block> buffer_instance_name_opt > %token <real> FLOATCONSTANT > %token <dreal> DOUBLECONSTANT > %token <n> INTCONSTANT UINTCONSTANT BOOLCONSTANT > @@ -220,6 +219,7 @@ static bool match_layout_qualifier(const char > *s1, const char *s2, > %type <type_qualifier> subroutine_qualifier > %type <subroutine_list> subroutine_type_list > %type <type_qualifier> interface_qualifier > +%type <type_qualifier> uniform_interface_qualifier > %type <type_qualifier> buffer_interface_qualifier > %type <type_specifier> type_specifier > %type <type_specifier> type_specifier_nonarray > @@ -2636,10 +2636,23 @@ basic_interface_block: > > $$ = block; > } > - | buffer_interface_qualifier NEW_IDENTIFIER '{' member_list '}' > buffer_instance_name_opt ';' > + | uniform_interface_qualifier NEW_IDENTIFIER '{' member_list '}' > instance_name_opt ';' > { > ast_interface_block *const block = $6; > > + block->layout = *state->default_uniform_qualifier; > + block->block_name = $2; > + block->declarations.push_degenerate_list_at_head(& $4->link); > + > + _mesa_ast_process_interface_block(& @1, state, block, $1); > + > + $$ = block; > + } > + | buffer_interface_qualifier NEW_IDENTIFIER '{' member_list '}' > instance_name_opt ';' > + { > + ast_interface_block *const block = $6; > + > + block->layout = *state->default_shader_storage_qualifier; > block->block_name = $2; > block->declarations.push_degenerate_list_at_head(& $4->link); > > @@ -2660,7 +2673,10 @@ interface_qualifier: > memset(& $$, 0, sizeof($$)); > $$.flags.q.out = 1; > } > - | UNIFORM > + ; > + > +uniform_interface_qualifier: > + UNIFORM > { > memset(& $$, 0, sizeof($$)); > $$.flags.q.uniform = 1; > @@ -2678,39 +2694,16 @@ buffer_interface_qualifier: > instance_name_opt: > /* empty */ > { > - $$ = new(state) ast_interface_block(*state- > >default_uniform_qualifier, > - NULL, NULL); > - } > - | NEW_IDENTIFIER > - { > - $$ = new(state) ast_interface_block(*state- > >default_uniform_qualifier, > - $1, NULL); > - $$->set_location(@1); > - } > - | NEW_IDENTIFIER array_specifier > - { > - $$ = new(state) ast_interface_block(*state- > >default_uniform_qualifier, > - $1, $2); > - $$->set_location_range(@1, @2); > - } > - ; > - > -buffer_instance_name_opt: > - /* empty */ > - { > - $$ = new(state) ast_interface_block(*state- > >default_shader_storage_qualifier, > - NULL, NULL); > + $$ = new(state) ast_interface_block(NULL, NULL); > } > | NEW_IDENTIFIER > { > - $$ = new(state) ast_interface_block(*state- > >default_shader_storage_qualifier, > - $1, NULL); > + $$ = new(state) ast_interface_block($1, NULL); > $$->set_location(@1); > } > | NEW_IDENTIFIER array_specifier > { > - $$ = new(state) ast_interface_block(*state- > >default_shader_storage_qualifier, > - $1, $2); > + $$ = new(state) ast_interface_block($1, $2); > $$->set_location_range(@1, @2); > } > ; _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev