summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIan Romanick <[email protected]>2013-03-22 18:55:49 -0700
committerIan Romanick <[email protected]>2013-03-29 12:01:14 -0700
commite0131196caad52a33e460775fa537fd57a8b29e5 (patch)
tree942a197136491badb2902113a912eebe473bee20 /src
parent65cc68f4305a675e27feb7aae0d8a66b2710f3e4 (diff)
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 <[email protected]> Reviewed-by: Matt Turner <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]> Reviewed-by: Jordan Justen <[email protected]> Cc: Eric Anholt <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/glsl/lower_ubo_reference.cpp10
1 files changed, 3 insertions, 7 deletions
diff --git a/src/glsl/lower_ubo_reference.cpp b/src/glsl/lower_ubo_reference.cpp
index 026197df7a9..aade203e724 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)));
}
}
}