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:

committed by
Ian Romanick

parent
5150c567a0
commit
c7da28b4be
24
ir.cpp
24
ir.cpp
@@ -190,6 +190,30 @@ ir_dereference::ir_dereference(ir_instruction *var,
|
|||||||
this->selector.array_index = array_index;
|
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,
|
ir_swizzle::ir_swizzle(ir_rvalue *val, unsigned x, unsigned y, unsigned z,
|
||||||
unsigned w, unsigned count)
|
unsigned w, unsigned count)
|
||||||
|
12
ir.h
12
ir.h
@@ -540,17 +540,7 @@ public:
|
|||||||
v->visit(this);
|
v->visit(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_lvalue()
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
ir_reference_variable,
|
ir_reference_variable,
|
||||||
|
Reference in New Issue
Block a user