summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2010-09-07 02:59:38 -0700
committerKenneth Graunke <kenneth@whitecape.org>2010-09-07 17:30:39 -0700
commit10eaa8bcbce1cd6d2e120e913f7abafde9675215 (patch)
treebfdfdf4a0e9591d3e1f2287b9d7ea6863e93d097
parenta98d5a5ac8b61edc14f60836e5a997bb88fc5c80 (diff)
ast_to_hir: Mark arrays as lvalues in GLSL ES, but prohibit assignment.
This allows them to be passed as out/inout parameters, but still prevents them from being used as the target of an assignment. This is per section 5.8 of the GLSL ES 1.00 specification.
-rw-r--r--src/glsl/ast_to_hir.cpp8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index 8322dbfdc2..3de6caac70 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -516,6 +516,12 @@ do_assignment(exec_list *instructions, struct _mesa_glsl_parse_state *state,
_mesa_glsl_error(& lhs_loc, state, "non-lvalue in assignment");
error_emitted = true;
}
+
+ if (state->es_shader && lhs->type->is_array()) {
+ _mesa_glsl_error(&lhs_loc, state, "whole array assignment is not "
+ "allowed in GLSL ES 1.00.");
+ error_emitted = true;
+ }
}
ir_rvalue *new_rhs = validate_assignment(state, lhs->type, rhs);
@@ -1624,7 +1630,7 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual,
qual_string);
}
- if (var->type->is_array() && (state->language_version >= 120)) {
+ if (var->type->is_array() && state->language_version != 110) {
var->array_lvalue = true;
}
}