[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