glsl: Refactor uniform block parser rules.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 28 Nov 2012 07:21:56 +0000 (23:21 -0800)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 25 Jan 2013 14:07:33 +0000 (09:07 -0500)
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.

Reviewed-by: Carl Worth <cworth@cworth.org>
Reviewed-by: Chad Versace <chad.versace@linux.intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/glsl/glsl_parser.yy

index 88aae64..1617366 100644 (file)
@@ -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,