diff options
author | Eric Anholt <eric@anholt.net> | 2010-04-01 20:27:35 -1000 |
---|---|---|
committer | Ian Romanick <ian.d.romanick@intel.com> | 2010-04-02 11:22:41 -0700 |
commit | c7da28b4beb3a593f49a6c01a90b123584b421e8 (patch) | |
tree | c689e2fb6916ac0c5ab4114ae4c40180a29d10a9 /ir.cpp | |
parent | 5150c567a0bf082d93f25ba7e29d5573c9dffb8b (diff) |
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.
Diffstat (limited to 'ir.cpp')
-rw-r--r-- | ir.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
@@ -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) |