glsl: Treat an interface block specifier as a level of struct nesting
authorChris Forbes <chrisf@ijw.co.nz>
Sun, 15 Jun 2014 00:57:20 +0000 (12:57 +1200)
committerChris Forbes <chrisf@ijw.co.nz>
Wed, 25 Jun 2014 19:58:32 +0000 (07:58 +1200)
Fixes the piglit test:

   spec/glsl-1.50/compiler/interface-blocks-structs-defined-within-block-instanced.vert

Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/glsl/ast_to_hir.cpp

index 92e0f90b81c87563779f459aede21463633790e8..7ba04a808c299f5d44656cd965d7b457a21f582b 100644 (file)
@@ -5287,6 +5287,12 @@ ast_interface_block::hir(exec_list *instructions,
    bool block_row_major = this->layout.flags.q.row_major;
    exec_list declared_variables;
    glsl_struct_field *fields;
+
+   /* Treat an interface block as one level of nesting, so that embedded struct
+    * specifiers will be disallowed.
+    */
+   state->struct_specifier_depth++;
+
    unsigned int num_variables =
       ast_process_structure_or_interface_block(&declared_variables,
                                                state,
@@ -5298,6 +5304,8 @@ ast_interface_block::hir(exec_list *instructions,
                                                redeclaring_per_vertex,
                                                var_mode);
 
+   state->struct_specifier_depth--;
+
    if (!redeclaring_per_vertex)
       validate_identifier(this->block_name, loc, state);