diff options
-rw-r--r-- | src/glsl/ast.h | 14 | ||||
-rw-r--r-- | src/glsl/glsl_parser.yy | 20 |
2 files changed, 30 insertions, 4 deletions
diff --git a/src/glsl/ast.h b/src/glsl/ast.h index 50747822d2a..7d7f72d54a4 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,15 @@ public: ast_type_qualifier layout; const char *block_name; + + /** + * Declared name of the block instance, if specified. + * + * If the block does not have an instance name, this field will be + * \c NULL. + */ + const char *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 16173660cac..81ae5d51948 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)) { + _mesa_glsl_error(& @1, state, + "#version 300 es required for using uniform " + "blocks with an instance name\n"); + } + } + ; + member_list: member_declaration { |