[Mesa-dev] [PATCH 06/17] glsl parser: handle interface block member qualifier
Jordan Justen
jordan.l.justen at intel.com
Fri Apr 19 12:35:42 PDT 2013
An interface block member may specify the type:
in {
in vec4 in_var_with_qualifier;
};
When specified with the member, it must match the same
type as interface block type.
It can also omit the qualifier:
uniform {
vec4 uniform_var_without_qualifier;
};
When the type is not specified with the member,
it will adopt the same type as the interface block.
Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
---
src/glsl/glsl_parser.yy | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy
index 70764d6..c254a2f 100644
--- a/src/glsl/glsl_parser.yy
+++ b/src/glsl/glsl_parser.yy
@@ -1958,8 +1958,34 @@ basic_interface_block:
"an instance name are not allowed");
}
+ unsigned interface_type_mask, interface_type_flags;
+ struct ast_type_qualifier temp_type_qualifier;
+
+ temp_type_qualifier.flags.i = 0;
+ temp_type_qualifier.flags.q.uniform = true;
+ temp_type_qualifier.flags.q.in = true;
+ temp_type_qualifier.flags.q.out = true;
+ interface_type_mask = temp_type_qualifier.flags.i;
+ interface_type_flags = $1.flags.i & interface_type_mask;
block->layout.flags.i |= $1.flags.i;
+ foreach_list_typed (ast_declarator_list, member, link, &block->declarations) {
+ ast_type_qualifier& qualifier = member->type->qualifier;
+ if ((qualifier.flags.i & interface_type_mask) == 0) {
+ qualifier.flags.i |= interface_type_flags;
+ } else if ((qualifier.flags.i & interface_type_mask) !=
+ interface_type_flags) {
+ /* GLSLangSpec.1.50.11, 4.3.7 Interface Blocks:
+ * "Input variables, output variables, and uniform variables can only
+ * be in in blocks, out blocks, and uniform blocks, respectively."
+ */
+ _mesa_glsl_error(& @1, state,
+ "uniform/in/out qualifier on "
+ "interface block member does not match "
+ "the interface block\n");
+ }
+ }
+
$$ = block;
}
;
--
1.7.10.4
More information about the mesa-dev
mailing list