On 22 January 2013 00:51, Ian Romanick <i...@freedesktop.org> wrote: > From: Ian Romanick <ian.d.roman...@intel.com> > > For now, just drop the value on the floor. > > Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> > --- > src/glsl/ast.h | 12 ++++++----- > src/glsl/glsl_parser.yy | 55 > ++++++++++++++++++++++++++++++++++++++----------- > 2 files changed, 50 insertions(+), 17 deletions(-) > > diff --git a/src/glsl/ast.h b/src/glsl/ast.h > index bcec6bb..e525cb2 100644 > --- a/src/glsl/ast.h > +++ b/src/glsl/ast.h > @@ -804,12 +804,12 @@ public: > class ast_uniform_block : public ast_node { > public: > ast_uniform_block(ast_type_qualifier layout, > - const char *block_name, > - ast_declarator_list *member_list, > - const char *instance_name) > - : layout(layout), block_name(block_name), instance_name(instance_name) > + const char *instance_name, > + ast_expression *array_size) > + : layout(layout), block_name(NULL), instance_name(instance_name), > + array_size(array_size) > { > - declarations.push_degenerate_list_at_head(&member_list->link); > + /* empty */ > } > > virtual ir_rvalue *hir(exec_list *instructions, > @@ -820,6 +820,8 @@ public: > const char *instance_name; > /** List of ast_declarator_list * */ > exec_list declarations; > + > + ast_expression *array_size; >
It would be nice to have a comment here explaining that this member is NULL if the ast_uniform_block lacks array nature. > }; > /*@}*/ > > diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy > index 81ae5d5..154ce2d 100644 > --- a/src/glsl/glsl_parser.yy > +++ b/src/glsl/glsl_parser.yy > @@ -79,6 +79,7 @@ static void yyerror(YYLTYPE *loc, _mesa_glsl_parse_state > *st, const char *msg) > ast_case_label_list *case_label_list; > ast_case_statement *case_statement; > ast_case_statement_list *case_statement_list; > + ast_uniform_block *uniform_block; > > struct { > ast_node *cond; > @@ -112,7 +113,7 @@ static void yyerror(YYLTYPE *loc, > _mesa_glsl_parse_state *st, const char *msg) > %token STRUCT VOID_TOK WHILE > %token <identifier> IDENTIFIER TYPE_IDENTIFIER NEW_IDENTIFIER > %type <identifier> any_identifier > -%type <identifier> instance_name_opt > +%type <uniform_block> instance_name_opt > %token <real> FLOATCONSTANT > %token <n> INTCONSTANT UINTCONSTANT BOOLCONSTANT > %token <identifier> FIELD_SELECTION > @@ -221,7 +222,8 @@ 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 basic_uniform_block > +%type <node> uniform_block > +%type <uniform_block> basic_uniform_block > %type <struct_specifier> struct_specifier > %type <declarator_list> struct_declaration_list > %type <declarator_list> struct_declaration > @@ -1891,7 +1893,7 @@ uniform_block: > } > | layout_qualifier basic_uniform_block > { > - ast_uniform_block *block = (ast_uniform_block *) $2; > + ast_uniform_block *block = $2; > if (!block->layout.merge_qualifier(& @1, state, $1)) { > YYERROR; > } > @@ -1902,9 +1904,10 @@ uniform_block: > basic_uniform_block: > UNIFORM NEW_IDENTIFIER '{' member_list '}' instance_name_opt ';' > { > - void *ctx = state; > - $$ = new(ctx) > ast_uniform_block(*state->default_uniform_qualifier, > - $2, $4, $6); > + ast_uniform_block *const block = $6; > + > + block->block_name = $2; > + block->declarations.push_degenerate_list_at_head(& $4->link); > > if (!state->ARB_uniform_buffer_object_enable) { > _mesa_glsl_error(& @1, state, > @@ -1915,21 +1918,49 @@ basic_uniform_block: > "#version 140 / > GL_ARB_uniform_buffer_object " > "required for defining uniform blocks\n"); > } > + > + /* Since block arrays require names, and both features are > added in > + * the same language versions, we don't have to explicitly > + * version-check both things. > + */ > + if (block->instance_name != NULL > + && !(state->language_version == 300 && state->es_shader)) { > This would be another good place to use _mesa_glsl_parse_state::is_version(). Or, if you prefer, you can use _mesa_glsl_parse_state::check_version(), which also takes care of generating an appropriate error message. > + _mesa_glsl_error(& @1, state, > + "#version 300 es required for using uniform > " > + "blocks with an instance name\n"); > + } > + > + $$ = block; > } > ; > > instance_name_opt: > /* empty */ > { > - $$ = NULL; > + $$ = new(state) > ast_uniform_block(*state->default_uniform_qualifier, > + NULL, > + NULL); > } > | NEW_IDENTIFIER > { > - if (!(state->language_version == 300 && state->es_shader)) { > - _mesa_glsl_error(& @1, state, > - "#version 300 es required for using uniform > " > - "blocks with an instance name\n"); > - } > + $$ = new(state) > ast_uniform_block(*state->default_uniform_qualifier, > + $1, > + NULL); > + } > + | NEW_IDENTIFIER '[' constant_expression ']' > + { > + $$ = new(state) > ast_uniform_block(*state->default_uniform_qualifier, > + $1, > + $3); > + } > + | NEW_IDENTIFIER '[' ']' > + { > + _mesa_glsl_error(& @1, state, > + "instance block arrays must be explicitly > sized\n"); > + > + $$ = new(state) > ast_uniform_block(*state->default_uniform_qualifier, > + $1, > + NULL); > } > ; > > -- > 1.7.11.7 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev > With those changes, Reviewed-by: Paul Berry <stereotype...@gmail.com>
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev