Mesa (9.2): glsl: Disallow uniform block layout qualifiers on non-uniform block vars.
Matt Turner
mattst88 at kemper.freedesktop.org
Tue Aug 27 06:20:36 UTC 2013
Module: Mesa
Branch: 9.2
Commit: 6fb2032c351e101da2e4a80dcee7b2565d396671
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6fb2032c351e101da2e4a80dcee7b2565d396671
Author: Matt Turner <mattst88 at gmail.com>
Date: Mon Aug 26 14:14:03 2013 -0700
glsl: Disallow uniform block layout qualifiers on non-uniform block vars.
Cc: 9.2 <mesa-stable at lists.freedesktop.org>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=68460
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
---
src/glsl/ast_to_hir.cpp | 17 +++++++++++++----
1 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index d474683..6164f76 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -1847,9 +1847,18 @@ is_varying_var(ir_variable *var, _mesa_glsl_parser_targets target)
static void
validate_matrix_layout_for_type(struct _mesa_glsl_parse_state *state,
YYLTYPE *loc,
- const glsl_type *type)
+ const glsl_type *type,
+ ir_variable *var)
{
- if (!type->is_matrix()) {
+ if (var && !var->is_in_uniform_block()) {
+ /* Layout qualifiers may only apply to interface blocks and fields in
+ * them.
+ */
+ _mesa_glsl_error(loc, state,
+ "uniform block layout qualifiers row_major and "
+ "column_major may not be applied to variables "
+ "outside of uniform blocks");
+ } else if (!type->is_matrix()) {
/* The OpenGL ES 3.0 conformance tests did not originally allow
* matrix layout qualifiers on non-matrices. However, the OpenGL
* 4.4 and OpenGL ES 3.0 (revision TBD) specifications were
@@ -2287,7 +2296,7 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual,
}
if (qual->flags.q.row_major || qual->flags.q.column_major) {
- validate_matrix_layout_for_type(state, loc, var->type);
+ validate_matrix_layout_for_type(state, loc, var->type, var);
}
}
@@ -4350,7 +4359,7 @@ ast_process_structure_or_interface_block(exec_list *instructions,
"row_major and column_major can only be "
"applied to uniform interface blocks");
} else
- validate_matrix_layout_for_type(state, &loc, field_type);
+ validate_matrix_layout_for_type(state, &loc, field_type, NULL);
}
if (qual->flags.q.uniform && qual->has_interpolation()) {
More information about the mesa-commit
mailing list