diff options
Diffstat (limited to 'src/compiler/glsl')
-rw-r--r-- | src/compiler/glsl/ast.h | 5 | ||||
-rw-r--r-- | 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> 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 @@ -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); } ; |