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

Jordan Justen jordan.l.justen at intel.com
Tue Mar 12 13:35:44 PDT 2013


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 1fd8cc2..d21ca2d 100644
--- a/src/glsl/glsl_parser.yy
+++ b/src/glsl/glsl_parser.yy
@@ -2041,41 +2041,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 ';'
 	{
 	   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 ';'
 	{
 	   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);
 	}
 	;
 
-- 
1.7.10.4



More information about the mesa-dev mailing list