[Mesa-dev] [PATCH 08/17] glsl parser: allow in & out for interface block members

Kenneth Graunke kenneth at whitecape.org
Sun Apr 21 12:06:41 PDT 2013


On 04/19/2013 12:35 PM, Jordan Justen wrote:
> Previously uniform blocks allowed for the 'uniform' keyword
> to be used with members of a uniform blocks. With interface
> blocks 'in' can be used on 'in' interface block members and
> 'out' can be used on 'out' interface block members.
>
> The basic_interface_block rule will verify that the same
> qualifier type is used with the block and each member.
>
> Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
> ---
>   src/glsl/glsl_parser.yy |   47 ++++++++++++++++++++++++++++++-----------------
>   1 file changed, 30 insertions(+), 17 deletions(-)
>
> diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy
> index c254a2f..6d88263 100644
> --- a/src/glsl/glsl_parser.yy
> +++ b/src/glsl/glsl_parser.yy
> @@ -2051,41 +2051,54 @@ member_list:
>   	}
>   	;
>
> -/* Specifying "uniform" inside of a uniform block is redundant. */
> -uniformopt:
> -	/* nothing */
> -	| UNIFORM
> -	;
> -
>   member_declaration:
> -	layout_qualifier uniformopt type_specifier struct_declarator_list ';'
> +	layout_qualifier fully_specified_type struct_declarator_list ';'

I don't think this is right.  The fully_specified_type production rule 
expands to "type_qualifier type_specifier".  type_qualifier expands to:

type_qualifier:
         storage_qualifier
         | layout_qualifier
         | layout_qualifier storage_qualifier

at which point you have:

layout_qualifier layout_qualifier storage_qualifier type_specifier 
struct_declarator_list ';'

I like the move to use fully_specified_type, but I think you need to 
make the rule simply:

         fully_specified_type struct_declarator_list ';'

I'm also a bit concerned that this may allow too much.  For example, is 
"invariant" allowed?  If not, are you checking that somewhere?

>   	{
>   	   void *ctx = state;
> -	   ast_fully_specified_type *type = new(ctx) ast_fully_specified_type();
> +	   ast_fully_specified_type *type = $2;
>   	   type->set_location(yylloc);
>
> -	   type->qualifier = $1;
> -	   type->qualifier.flags.q.uniform = true;
> -	   type->specifier = $3;
> +	   if (!type->qualifier.merge_qualifier(& @1, state, $1)) {
> +	      YYERROR;
> +	   }
> +
> +	   if (type->qualifier.flags.q.attribute) {
> +	      _mesa_glsl_error(& @1, state,
> +	                      "keyword 'attribute' cannot be used with "
> +	                      "interface block member\n");
> +	   } else if (type->qualifier.flags.q.varying) {
> +	      _mesa_glsl_error(& @1, state,
> +	                      "keyword 'varying' cannot be used with "
> +	                      "interface block member\n");
> +	   }
> +
>   	   $$ = new(ctx) ast_declarator_list(type);
>   	   $$->set_location(yylloc);
>   	   $$->ubo_qualifiers_valid = true;
>
> -	   $$->declarations.push_degenerate_list_at_head(& $4->link);
> +	   $$->declarations.push_degenerate_list_at_head(& $3->link);
>   	}
> -	| uniformopt type_specifier struct_declarator_list ';'
> +	| fully_specified_type struct_declarator_list ';'

The nice part is by eliminating the layout_qualifier redundancy, you can 
drop one of these two mostly-duplicated blocks :)

>   	{
>   	   void *ctx = state;
> -	   ast_fully_specified_type *type = new(ctx) ast_fully_specified_type();
> +	   ast_fully_specified_type *type = $1;
>   	   type->set_location(yylloc);
>
> -	   type->qualifier.flags.q.uniform = true;
> -	   type->specifier = $2;
> +	   if (type->qualifier.flags.q.attribute) {
> +	      _mesa_glsl_error(& @1, state,
> +	                      "keyword 'attribute' cannot be used in "
> +	                      "interface block\n");
> +	   } else if (type->qualifier.flags.q.varying) {
> +	      _mesa_glsl_error(& @1, state,
> +	                      "keyword 'varying' cannot be used in "
> +	                      "interface block\n");
> +	   }
> +
>   	   $$ = new(ctx) ast_declarator_list(type);
>   	   $$->set_location(yylloc);
>   	   $$->ubo_qualifiers_valid = true;
>
> -	   $$->declarations.push_degenerate_list_at_head(& $3->link);
> +	   $$->declarations.push_degenerate_list_at_head(& $2->link);
>   	}
>   	;
>
>



More information about the mesa-dev mailing list