[Mesa-dev] [PATCH 05/32] glsl: Parse non-array uniform block instance names in GLSL ES 3.00.

Ian Romanick idr at freedesktop.org
Tue Jan 22 00:51:56 PST 2013


From: Kenneth Graunke <kenneth at 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;
    /** 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)) {
+	      _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



More information about the mesa-dev mailing list