From: Eric Anholt Date: Fri, 2 Apr 2010 06:27:35 +0000 (-1000) Subject: Allow array dereferences to be considered as lvalues. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c7da28b4beb3a593f49a6c01a90b123584b421e8;p=mesa.git 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. --- diff --git a/ir.cpp b/ir.cpp index 35fecf75608..d9faac03d46 100644 --- a/ir.cpp +++ b/ir.cpp @@ -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) diff --git a/ir.h b/ir.h index 381af357b81..64ed8818431 100644 --- a/ir.h +++ b/ir.h @@ -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,