summaryrefslogtreecommitdiff
path: root/src/mesa
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2010-07-07 17:59:50 -0700
committerEric Anholt <eric@anholt.net>2010-07-07 17:59:50 -0700
commitea2a03f0a5b8b58ea88ecb607664ea50c9d6e96e (patch)
treee2bda8b832fc2b5ee34df8ea6d8090881c627cff /src/mesa
parentffd24b0a6844871eed0c78608431e2f82d5615e1 (diff)
ir_to_mesa: Fix the assertion on LHS array derefs to DWIM.
This allows array derefs of matrices now, which makes idr's GLSL demo happy.
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/shader/ir_to_mesa.cpp17
1 files changed, 10 insertions, 7 deletions
diff --git a/src/mesa/shader/ir_to_mesa.cpp b/src/mesa/shader/ir_to_mesa.cpp
index 727a815753..4496daf2a5 100644
--- a/src/mesa/shader/ir_to_mesa.cpp
+++ b/src/mesa/shader/ir_to_mesa.cpp
@@ -1247,21 +1247,24 @@ static struct ir_to_mesa_dst_reg
get_assignment_lhs(ir_instruction *ir, ir_to_mesa_visitor *v)
{
struct ir_to_mesa_dst_reg dst_reg;
- ir_dereference *deref;
ir_swizzle *swiz;
+ ir_dereference_array *deref_array = ir->as_dereference_array();
+ /* This should have been handled by ir_vec_index_to_cond_assign */
+ if (deref_array) {
+ assert(!deref_array->array->type->is_vector());
+
+ /* We don't handle relative addressing on the LHS yet. */
+ assert(deref_array->array_index->constant_expression_value() != NULL);
+ }
+
/* Use the rvalue deref handler for the most part. We'll ignore
* swizzles in it and write swizzles using writemask, though.
*/
ir->accept(v);
dst_reg = ir_to_mesa_dst_reg_from_src(v->result);
- if ((deref = ir->as_dereference())) {
- ir_dereference_array *deref_array = ir->as_dereference_array();
- assert(!deref_array || deref_array->array->type->is_array());
-
- ir->accept(v);
- } else if ((swiz = ir->as_swizzle())) {
+ if ((swiz = ir->as_swizzle())) {
dst_reg.writemask = 0;
if (swiz->mask.num_components >= 1)
dst_reg.writemask |= (1 << swiz->mask.x);