Mesa (master): glsl: Generated masked write instead of vector array index for UBO lowering

Ian Romanick idr at kemper.freedesktop.org
Fri Mar 29 19:02:52 UTC 2013


Module: Mesa
Branch: master
Commit: e0131196caad52a33e460775fa537fd57a8b29e5
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=e0131196caad52a33e460775fa537fd57a8b29e5

Author: Ian Romanick <ian.d.romanick at intel.com>
Date:   Fri Mar 22 18:55:49 2013 -0700

glsl: Generated masked write instead of vector array index for UBO lowering

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 at intel.com>
Reviewed-by: Matt Turner <mattst88 at gmail.com>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
Reviewed-by: Jordan Justen <jordan.l.justen at intel.com>
Cc: Eric Anholt <eric at anholt.net>

---

 src/glsl/lower_ubo_reference.cpp |   10 +++-------
 1 files changed, 3 insertions(+), 7 deletions(-)

diff --git a/src/glsl/lower_ubo_reference.cpp b/src/glsl/lower_ubo_reference.cpp
index 026197d..aade203 100644
--- a/src/glsl/lower_ubo_reference.cpp
+++ b/src/glsl/lower_ubo_reference.cpp
@@ -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)));
       }
    }
 }




More information about the mesa-commit mailing list