Allow array dereferences to be considered as lvalues.

Fixes glsl-vs-arrays.vert and glsl-vs-mov-after-deref.vert.
Regresses parser3.frag which was failing for the wrong reason.
This commit is contained in:
Eric Anholt 2010-04-01 20:27:35 -10:00 committed by Ian Romanick
parent 5150c567a0
commit c7da28b4be
2 changed files with 25 additions and 11 deletions

24
ir.cpp
View File

@ -190,6 +190,30 @@ ir_dereference::ir_dereference(ir_instruction *var,
this->selector.array_index = array_index;
}
bool
ir_dereference::is_lvalue()
{
if (var == NULL)
return false;
if (this->type->base_type == GLSL_TYPE_ARRAY ||
this->type->base_type == GLSL_TYPE_STRUCT)
return false;
if (mode == ir_reference_variable) {
ir_variable *const as_var = var->as_variable();
if (as_var == NULL)
return false;
return !as_var->read_only;
} else if (mode == ir_reference_array) {
/* FINISHME: Walk up the dereference chain and figure out if
* FINISHME: the variable is read-only.
*/
}
return true;
}
ir_swizzle::ir_swizzle(ir_rvalue *val, unsigned x, unsigned y, unsigned z,
unsigned w, unsigned count)

12
ir.h
View File

@ -540,17 +540,7 @@ public:
v->visit(this);
}
bool is_lvalue()
{
if (var == NULL)
return false;
ir_variable *const as_var = var->as_variable();
if (as_var == NULL)
return false;
return !as_var->read_only;
}
bool is_lvalue();
enum {
ir_reference_variable,