Track whether whole-arrays are assignable

In GLSL 1.10 this was not allowed, but in GLSL 1.20 and later it is.

This causes the following tests to pass:

    glslparsertest/glsl2/array-09.vert
    glslparsertest/glsl2/array-13.vert
This commit is contained in:
Ian Romanick 2010-04-02 17:17:47 -07:00
parent 2d946634eb
commit 9d975377ca
3 changed files with 15 additions and 7 deletions

View File

@ -1283,6 +1283,10 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual,
var->interpolation = ir_var_noperspective;
else
var->interpolation = ir_var_smooth;
if (var->type->is_array() && (state->language_version >= 120)) {
var->array_lvalue = true;
}
}

10
ir.cpp
View File

@ -200,18 +200,14 @@ ir_dereference::is_lvalue()
if (var == NULL)
return false;
/* Arrays are not assignable in GLSL 1.10, but in GLSL 1.20 and later they
* are.
*/
/* FINISHME: Handle GLSL 1.10 vs 1.20 differences. */
if (this->type->base_type == GLSL_TYPE_ARRAY)
return false;
if (mode == ir_reference_variable) {
ir_variable *const as_var = var->as_variable();
if (as_var == NULL)
return false;
if (as_var->type->is_array() && !as_var->array_lvalue)
return false;
return !as_var->read_only;
} else if (mode == ir_reference_array) {
/* FINISHME: Walk up the dereference chain and figure out if

8
ir.h
View File

@ -146,6 +146,14 @@ public:
unsigned mode:3;
unsigned interpolation:2;
/**
* Flag that the whole array is assignable
*
* In GLSL 1.20 and later whole arrays are assignable (and comparable for
* equality). This flag enables this behavior.
*/
unsigned array_lvalue:1;
};