glsl: Generated masked write instead of vector array index for UBO lowering
authorIan Romanick <ian.d.romanick@intel.com>
Sat, 23 Mar 2013 01:55:49 +0000 (18:55 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 29 Mar 2013 19:01:14 +0000 (12:01 -0700)
When reading a column from a row-major matrix, we would slot the single
value read into the vector using an ir_dereference_array of the vector
with a constant index.  This will (eventually) get optimized to a
masked-write, so just generate the masked write in the first place.

v2: Remove unused variable 'chan'.  Suggested by Ken.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Cc: Eric Anholt <eric@anholt.net>
src/glsl/lower_ubo_reference.cpp

index 026197df7a9b65a0659805bf4865d82735b153dc..aade203e724a9dd8a797b9823eddc6eb9fa13aa1 100644 (file)
@@ -356,18 +356,14 @@ lower_ubo_reference_visitor::emit_ubo_loads(ir_dereference *deref,
       unsigned matrix_stride = 16;
 
       for (unsigned i = 0; i < deref->type->vector_elements; i++) {
-        ir_rvalue *chan = new(mem_ctx) ir_constant((int)i);
-        ir_dereference *deref_chan =
-           new(mem_ctx) ir_dereference_array(deref->clone(mem_ctx, NULL),
-                                             chan);
-
         ir_rvalue *chan_offset =
            add(base_offset,
                new(mem_ctx) ir_constant(deref_offset + i * matrix_stride));
 
-        base_ir->insert_before(assign(deref_chan,
+        base_ir->insert_before(assign(deref->clone(mem_ctx, NULL),
                                       ubo_load(glsl_type::float_type,
-                                               chan_offset)));
+                                               chan_offset),
+                                      (1U << i)));
       }
    }
 }