[Mesa-dev] [PATCH 2/3] glsl: rework parsing of blocks
Samuel Iglesias Gonsálvez
siglesias at igalia.com
Mon Feb 22 13:24:16 UTC 2016
Reviewed-by: Samuel Iglesias Gonsálvez <siglesias at 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);
> }
> ;
More information about the mesa-dev
mailing list