[Mesa-dev] [PATCH 04/32] glsl: Refactor uniform block parser rules.

Ian Romanick idr at freedesktop.org
Tue Jan 22 00:51:55 PST 2013


From: Kenneth Graunke <kenneth at whitecape.org>

The existing code has a lot of duplication; the only difference between
the two cases is whether we merge in an additional layout qualifier.

Apparently creating a layout_qualifieropt rule that can be empty causes
a lot of conflicts and confusion.  However, refactoring out the guts of
the ast_uniform_block creation works fine.
---
 src/glsl/glsl_parser.yy | 37 ++++++++++++++++---------------------
 1 file changed, 16 insertions(+), 21 deletions(-)

diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy
index 88aae64..1617366 100644
--- a/src/glsl/glsl_parser.yy
+++ b/src/glsl/glsl_parser.yy
@@ -220,7 +220,7 @@ static void yyerror(YYLTYPE *loc, _mesa_glsl_parse_state *st, const char *msg)
 %type <node> declaration
 %type <node> declaration_statement
 %type <node> jump_statement
-%type <node> uniform_block
+%type <node> uniform_block basic_uniform_block
 %type <struct_specifier> struct_specifier
 %type <declarator_list> struct_declaration_list
 %type <declarator_list> struct_declaration
@@ -1884,31 +1884,26 @@ function_definition:
 
 /* layout_qualifieropt is packed into this rule */
 uniform_block:
-	UNIFORM NEW_IDENTIFIER '{' member_list '}' ';'
+	basic_uniform_block
 	{
-	   void *ctx = state;
-	   $$ = new(ctx) ast_uniform_block(*state->default_uniform_qualifier,
-					   $2, $4);
-
-	   if (!state->ARB_uniform_buffer_object_enable) {
-	      _mesa_glsl_error(& @1, state,
-			       "#version 140 / GL_ARB_uniform_buffer_object "
-			       "required for defining uniform blocks\n");
-	   } else if (state->ARB_uniform_buffer_object_warn) {
-	      _mesa_glsl_warning(& @1, state,
-				 "#version 140 / GL_ARB_uniform_buffer_object "
-				 "required for defining uniform blocks\n");
-	   }
+	   $$ = $1;
 	}
-	| layout_qualifier UNIFORM NEW_IDENTIFIER '{' member_list '}' ';'
+	| layout_qualifier basic_uniform_block
 	{
-	   void *ctx = state;
-
-	   ast_type_qualifier qual = *state->default_uniform_qualifier;
-	   if (!qual.merge_qualifier(& @1, state, $1)) {
+	   ast_uniform_block *block = (ast_uniform_block *) $2;
+	   if (!block->layout.merge_qualifier(& @1, state, $1)) {
 	      YYERROR;
 	   }
-	   $$ = new(ctx) ast_uniform_block(qual, $3, $5);
+	   $$ = block;
+	}
+	;
+
+basic_uniform_block:
+	UNIFORM NEW_IDENTIFIER '{' member_list '}' ';'
+	{
+	   void *ctx = state;
+	   $$ = new(ctx) ast_uniform_block(*state->default_uniform_qualifier,
+					   $2, $4);
 
 	   if (!state->ARB_uniform_buffer_object_enable) {
 	      _mesa_glsl_error(& @1, state,
-- 
1.7.11.7



More information about the mesa-dev mailing list