ast_to_hir: Mark arrays as lvalues in GLSL ES, but prohibit assignment.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 7 Sep 2010 09:59:38 +0000 (02:59 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 8 Sep 2010 00:30:39 +0000 (17:30 -0700)
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

index 8322dbfdc2c54732daaee3a2afe2855f3d4cbbbf..3de6caac70137d888b5dd27cb6cdd8a1e09a69b9 100644 (file)
@@ -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;
    }
 }