From 0d2e6336a21e20afe37861030ac2161aadd0499e Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Tue, 27 Nov 2012 23:21:56 -0800 Subject: [PATCH] glsl: Refactor uniform block parser rules. 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 Reviewed-by: Chad Versace Reviewed-by: Kenneth Graunke --- 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 88aae64d424..16173660cac 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 declaration %type declaration_statement %type jump_statement -%type uniform_block +%type uniform_block basic_uniform_block %type struct_specifier %type struct_declaration_list %type struct_declaration @@ -1884,6 +1884,21 @@ function_definition: /* layout_qualifieropt is packed into this rule */ uniform_block: + basic_uniform_block + { + $$ = $1; + } + | layout_qualifier basic_uniform_block + { + ast_uniform_block *block = (ast_uniform_block *) $2; + if (!block->layout.merge_qualifier(& @1, state, $1)) { + YYERROR; + } + $$ = block; + } + ; + +basic_uniform_block: UNIFORM NEW_IDENTIFIER '{' member_list '}' ';' { void *ctx = state; @@ -1900,26 +1915,6 @@ uniform_block: "required for defining uniform blocks\n"); } } - | layout_qualifier UNIFORM NEW_IDENTIFIER '{' member_list '}' ';' - { - void *ctx = state; - - ast_type_qualifier qual = *state->default_uniform_qualifier; - if (!qual.merge_qualifier(& @1, state, $1)) { - YYERROR; - } - $$ = new(ctx) ast_uniform_block(qual, $3, $5); - - 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"); - } - } ; member_list: