glsl: emit row_major matrix's SSBO stores only for components in writemask
authorSamuel Iglesias Gonsalvez <siglesias@igalia.com>
Wed, 30 Sep 2015 13:03:15 +0000 (15:03 +0200)
committerSamuel Iglesias Gonsalvez <siglesias@igalia.com>
Fri, 2 Oct 2015 06:34:25 +0000 (08:34 +0200)
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 <siglesias@igalia.com>
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
src/glsl/lower_ubo_reference.cpp

index e581306019b5619488da64101786dc8ff53b01cb..247620e6148737951770174eac5b1775bb499704 100644 (file)
@@ -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) {