diff options
author | Samuel Iglesias Gonsalvez <[email protected]> | 2015-09-30 15:03:15 +0200 |
---|---|---|
committer | Samuel Iglesias Gonsalvez <[email protected]> | 2015-10-02 08:34:25 +0200 |
commit | f42466322a3c6f9dacf17caaf2b8f411e41ba7aa (patch) | |
tree | 7492ebcdcbb5f219bd21d6b5ea07b4c572e5d3d3 /src/glsl | |
parent | a552b77dccacbbf68af3c527273085224b2b4480 (diff) |
glsl: emit row_major matrix's SSBO stores only for components in writemask
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 <[email protected]>
Reviewed-by: Iago Toral Quiroga <[email protected]>
Diffstat (limited to 'src/glsl')
-rw-r--r-- | src/glsl/lower_ubo_reference.cpp | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/src/glsl/lower_ubo_reference.cpp b/src/glsl/lower_ubo_reference.cpp index e581306019b..247620e6148 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) { |