From 10eaa8bcbce1cd6d2e120e913f7abafde9675215 Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Tue, 7 Sep 2010 02:59:38 -0700 Subject: [PATCH] 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. --- src/glsl/ast_to_hir.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index 8322dbfdc2c..3de6caac701 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; } }