<div dir="ltr">On 22 January 2013 00:51, Ian Romanick <span dir="ltr"><<a href="mailto:idr@freedesktop.org" target="_blank">idr@freedesktop.org</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Kenneth Graunke <<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>><br>
<br>
In GLSL ES 3.00 (and GLSL 1.50), uniform blocks can have an associated<br>
"instance name", which essentially namespaces the variables inside.<br>
<br>
This patch adds basic parsing for this new feature, but doesn't yet hook<br>
it up to actually do anything yet.<br>
<br>
It does not support for arrays of interface blocks; a later commit will<br>
take care of that.<br>
<br>
This change temporarily regresses the piglit test<br>
interface-name-access-without-interface-name.vert.  This shader failed<br>
to compile before (the expected result), but it failed to compile for<br>
the wrong reason.  This is not a real regression.<br>
---<br>
 src/glsl/ast.h          |  6 ++++--<br>
 src/glsl/glsl_parser.yy | 20 ++++++++++++++++++--<br>
 2 files changed, 22 insertions(+), 4 deletions(-)<br>
<br>
diff --git a/src/glsl/ast.h b/src/glsl/ast.h<br>
index 5074782..bcec6bb 100644<br>
--- a/src/glsl/ast.h<br>
+++ b/src/glsl/ast.h<br>
@@ -805,8 +805,9 @@ class ast_uniform_block : public ast_node {<br>
 public:<br>
    ast_uniform_block(ast_type_qualifier layout,<br>
                     const char *block_name,<br>
-                    ast_declarator_list *member_list)<br>
-   : layout(layout), block_name(block_name)<br>
+                    ast_declarator_list *member_list,<br>
+                     const char *instance_name)<br>
+   : layout(layout), block_name(block_name), instance_name(instance_name)<br>
    {<br>
       declarations.push_degenerate_list_at_head(&member_list->link);<br>
    }<br>
@@ -816,6 +817,7 @@ public:<br>
<br>
    ast_type_qualifier layout;<br>
    const char *block_name;<br>
+   const char *instance_name;<br></blockquote><div><br></div><div>It would be nice to have a comment above this field explaining that instance_name is NULL if there is no instance name.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

    /** List of ast_declarator_list * */<br>
    exec_list declarations;<br>
 };<br>
diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy<br>
index 1617366..81ae5d5 100644<br>
--- a/src/glsl/glsl_parser.yy<br>
+++ b/src/glsl/glsl_parser.yy<br>
@@ -112,6 +112,7 @@ static void yyerror(YYLTYPE *loc, _mesa_glsl_parse_state *st, const char *msg)<br>
 %token STRUCT VOID_TOK WHILE<br>
 %token <identifier> IDENTIFIER TYPE_IDENTIFIER NEW_IDENTIFIER<br>
 %type <identifier> any_identifier<br>
+%type <identifier> instance_name_opt<br>
 %token <real> FLOATCONSTANT<br>
 %token <n> INTCONSTANT UINTCONSTANT BOOLCONSTANT<br>
 %token <identifier> FIELD_SELECTION<br>
@@ -1899,11 +1900,11 @@ uniform_block:<br>
        ;<br>
<br>
 basic_uniform_block:<br>
-       UNIFORM NEW_IDENTIFIER '{' member_list '}' ';'<br>
+       UNIFORM NEW_IDENTIFIER '{' member_list '}' instance_name_opt ';'<br>
        {<br>
           void *ctx = state;<br>
           $$ = new(ctx) ast_uniform_block(*state->default_uniform_qualifier,<br>
-                                          $2, $4);<br>
+                                          $2, $4, $6);<br>
<br>
           if (!state->ARB_uniform_buffer_object_enable) {<br>
              _mesa_glsl_error(& @1, state,<br>
@@ -1917,6 +1918,21 @@ basic_uniform_block:<br>
        }<br>
        ;<br>
<br>
+instance_name_opt:<br>
+       /* empty */<br>
+       {<br>
+          $$ = NULL;<br>
+       }<br>
+       | NEW_IDENTIFIER<br>
+       {<br>
+          if (!(state->language_version == 300 && state->es_shader)) {<br></blockquote><div><br></div><div>I've been trying to replace ad-hoc cheks like this with calls to a common function that does the same job:<br>
<br></div><div>if (!state->is_version(150, 300)) {<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+             _mesa_glsl_error(& @1, state,<br>
+                              "#version 300 es required for using uniform "<br>
+                              "blocks with an instance name\n");<br>
+          }<br>
+       }<br>
+       ;<br>
+<br>
 member_list:<br>
        member_declaration<br>
        {<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.7.11.7<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div><div class="gmail_extra">With those two minor changes, this patch is:<br><br>Reviewed-by: Paul Berry <<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>><br>
</div></div>