On 22 January 2013 00:51, Ian Romanick <i...@freedesktop.org> wrote: > From: Kenneth Graunke <kenn...@whitecape.org> > > In GLSL ES 3.00 (and GLSL 1.50), uniform blocks can have an associated > "instance name", which essentially namespaces the variables inside. > > This patch adds basic parsing for this new feature, but doesn't yet hook > it up to actually do anything yet. > > It does not support for arrays of interface blocks; a later commit will > take care of that. > > This change temporarily regresses the piglit test > interface-name-access-without-interface-name.vert. This shader failed > to compile before (the expected result), but it failed to compile for > the wrong reason. This is not a real regression. > --- > src/glsl/ast.h | 6 ++++-- > src/glsl/glsl_parser.yy | 20 ++++++++++++++++++-- > 2 files changed, 22 insertions(+), 4 deletions(-) > > diff --git a/src/glsl/ast.h b/src/glsl/ast.h > index 5074782..bcec6bb 100644 > --- a/src/glsl/ast.h > +++ b/src/glsl/ast.h > @@ -805,8 +805,9 @@ class ast_uniform_block : public ast_node { > public: > ast_uniform_block(ast_type_qualifier layout, > const char *block_name, > - ast_declarator_list *member_list) > - : layout(layout), block_name(block_name) > + ast_declarator_list *member_list, > + const char *instance_name) > + : layout(layout), block_name(block_name), instance_name(instance_name) > { > declarations.push_degenerate_list_at_head(&member_list->link); > } > @@ -816,6 +817,7 @@ public: > > ast_type_qualifier layout; > const char *block_name; > + const char *instance_name; >
It would be nice to have a comment above this field explaining that instance_name is NULL if there is no instance name. > /** List of ast_declarator_list * */ > exec_list declarations; > }; > diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy > index 1617366..81ae5d5 100644 > --- a/src/glsl/glsl_parser.yy > +++ b/src/glsl/glsl_parser.yy > @@ -112,6 +112,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 > %token <real> FLOATCONSTANT > %token <n> INTCONSTANT UINTCONSTANT BOOLCONSTANT > %token <identifier> FIELD_SELECTION > @@ -1899,11 +1900,11 @@ uniform_block: > ; > > basic_uniform_block: > - UNIFORM NEW_IDENTIFIER '{' member_list '}' ';' > + UNIFORM NEW_IDENTIFIER '{' member_list '}' instance_name_opt ';' > { > void *ctx = state; > $$ = new(ctx) > ast_uniform_block(*state->default_uniform_qualifier, > - $2, $4); > + $2, $4, $6); > > if (!state->ARB_uniform_buffer_object_enable) { > _mesa_glsl_error(& @1, state, > @@ -1917,6 +1918,21 @@ basic_uniform_block: > } > ; > > +instance_name_opt: > + /* empty */ > + { > + $$ = NULL; > + } > + | NEW_IDENTIFIER > + { > + if (!(state->language_version == 300 && state->es_shader)) { > I've been trying to replace ad-hoc cheks like this with calls to a common function that does the same job: if (!state->is_version(150, 300)) { > + _mesa_glsl_error(& @1, state, > + "#version 300 es required for using uniform > " > + "blocks with an instance name\n"); > + } > + } > + ; > + > member_list: > member_declaration > { > -- > 1.7.11.7 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev > With those two minor changes, this patch is: Reviewed-by: Paul Berry <stereotype...@gmail.com>
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev