summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/glsl/ast.h14
-rw-r--r--src/glsl/glsl_parser.yy20
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
{