glsl parser: allow in & out for interface block members
authorJordan Justen <jordan.l.justen@intel.com>
Sat, 9 Mar 2013 22:52:14 +0000 (14:52 -0800)
committerJordan Justen <jordan.l.justen@intel.com>
Thu, 23 May 2013 16:37:11 +0000 (09:37 -0700)
Previously uniform blocks allowed for the 'uniform' keyword
to be used with members of a uniform blocks. With interface
blocks 'in' can be used on 'in' interface block members and
'out' can be used on 'out' interface block members.

The basic_interface_block rule will verify that the same
qualifier type is used with the block and each member.

Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/glsl/glsl_parser.yy

index baac84568cae00dfcc7c0d7559cfef3833e405ae..6e92c26517bb1b3dd4800408a5929ed4639d08a8 100644 (file)
@@ -2067,41 +2067,28 @@ member_list:
        }
        ;
 
-/* Specifying "uniform" inside of a uniform block is redundant. */
-uniformopt:
-       /* nothing */
-       | UNIFORM
-       ;
-
 member_declaration:
-       layout_qualifier uniformopt type_specifier struct_declarator_list ';'
+       fully_specified_type struct_declarator_list ';'
        {
           void *ctx = state;
-          ast_fully_specified_type *type = new(ctx) ast_fully_specified_type();
+          ast_fully_specified_type *type = $1;
           type->set_location(yylloc);
 
-          type->qualifier = $1;
-          type->qualifier.flags.q.uniform = true;
-          type->specifier = $3;
-          $$ = new(ctx) ast_declarator_list(type);
-          $$->set_location(yylloc);
-          $$->ubo_qualifiers_valid = true;
-
-          $$->declarations.push_degenerate_list_at_head(& $4->link);
-       }
-       | uniformopt type_specifier struct_declarator_list ';'
-       {
-          void *ctx = state;
-          ast_fully_specified_type *type = new(ctx) ast_fully_specified_type();
-          type->set_location(yylloc);
+          if (type->qualifier.flags.q.attribute) {
+             _mesa_glsl_error(& @1, state,
+                             "keyword 'attribute' cannot be used with "
+                             "interface block member\n");
+          } else if (type->qualifier.flags.q.varying) {
+             _mesa_glsl_error(& @1, state,
+                             "keyword 'varying' cannot be used with "
+                             "interface block member\n");
+          }
 
-          type->qualifier.flags.q.uniform = true;
-          type->specifier = $2;
           $$ = new(ctx) ast_declarator_list(type);
           $$->set_location(yylloc);
           $$->ubo_qualifiers_valid = true;
 
-          $$->declarations.push_degenerate_list_at_head(& $3->link);
+          $$->declarations.push_degenerate_list_at_head(& $2->link);
        }
        ;