From 78d3098c05cfbf5c51cf92483d1f894a41e46e7c Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Sun, 14 Feb 2016 14:45:04 +1100 Subject: [PATCH] glsl: rework parsing of blocks MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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. Reviewed-by: Samuel Iglesias Gonsálvez --- 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 9aa5bb99f49..4dc9674e424 100644 --- a/src/compiler/glsl/ast.h +++ b/src/compiler/glsl/ast.h @@ -1061,10 +1061,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 99bd0e61d0e..9d6ea29355f 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 TYPE_IDENTIFIER NEW_IDENTIFIER %type any_identifier %type instance_name_opt -%type buffer_instance_name_opt %token FLOATCONSTANT %token DOUBLECONSTANT %token INTCONSTANT UINTCONSTANT BOOLCONSTANT @@ -220,6 +219,7 @@ static bool match_layout_qualifier(const char *s1, const char *s2, %type subroutine_qualifier %type subroutine_type_list %type interface_qualifier +%type uniform_interface_qualifier %type buffer_interface_qualifier %type type_specifier %type type_specifier_nonarray @@ -2625,10 +2625,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); @@ -2649,7 +2662,10 @@ interface_qualifier: memset(& $$, 0, sizeof($$)); $$.flags.q.out = 1; } - | UNIFORM + ; + +uniform_interface_qualifier: + UNIFORM { memset(& $$, 0, sizeof($$)); $$.flags.q.uniform = 1; @@ -2667,39 +2683,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); } ; -- 2.30.2