When writing to a column of a row-major matrix, each component of the vector is stored to non-consecutive memory addresses, so we generate one instruction per component.
This patch skips the disabled components in the writemask, saving some store instructions plus avoid storing wrong data on each disabled component. Signed-off-by: Samuel Iglesias Gonsalvez <sigles...@igalia.com> --- src/glsl/lower_ubo_reference.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/glsl/lower_ubo_reference.cpp b/src/glsl/lower_ubo_reference.cpp index e581306..247620e 100644 --- a/src/glsl/lower_ubo_reference.cpp +++ b/src/glsl/lower_ubo_reference.cpp @@ -754,6 +754,12 @@ lower_ubo_reference_visitor::emit_access(bool is_write, add(base_offset, new(mem_ctx) ir_constant(deref_offset + i * matrix_stride)); if (is_write) { + /* If the component is not in the writemask, then don't + * store any value. + */ + if (!((1 << i) & write_mask)) + continue; + base_ir->insert_after(ssbo_store(swizzle(deref, i, 1), chan_offset, 1)); } else { if (!this->is_shader_storage) { -- 2.1.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev