Mesa (master): nir/gl_nir_lower_buffers: Set up align_mul/offset on UBOs.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Sep 30 20:10:27 UTC 2020
Module: Mesa
Branch: master
Commit: 9c5a793dc72bf6977643b0fc8bf8b1579639d7d7
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9c5a793dc72bf6977643b0fc8bf8b1579639d7d7
Author: Eric Anholt <eric at anholt.net>
Date: Tue Sep 8 12:44:30 2020 -0700
nir/gl_nir_lower_buffers: Set up align_mul/offset on UBOs.
nir_lower_to_explicit_io will give us good alignments if we have the
cast's alignment information known, and it's trivial: Just the offset of
the UBO variable that is at the base of the deref. Otherwise, explicit io
assumes the load is aligned just to the size of a scalar value in it.
The change in freedreno is in the noise.
Reviewed-by: Rob Clark <robdclark at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6612>
---
src/compiler/glsl/gl_nir_lower_buffers.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/src/compiler/glsl/gl_nir_lower_buffers.c b/src/compiler/glsl/gl_nir_lower_buffers.c
index b83df08a867..d78473ddbf9 100644
--- a/src/compiler/glsl/gl_nir_lower_buffers.c
+++ b/src/compiler/glsl/gl_nir_lower_buffers.c
@@ -182,6 +182,7 @@ lower_buffer_interface_derefs_impl(nir_function_impl *impl,
b.cursor = nir_before_instr(&deref->instr);
+ unsigned offset = 0;
nir_ssa_def *ptr;
if (deref->deref_type == nir_deref_type_var &&
!glsl_type_is_interface(glsl_without_array(deref->var->type))) {
@@ -189,7 +190,7 @@ lower_buffer_interface_derefs_impl(nir_function_impl *impl,
* containing one. We need the block index and its offset
* inside that block
*/
- unsigned index, offset;
+ unsigned index;
get_block_index_offset(deref->var, shader_program,
b.shader->info.stage,
&index, &offset);
@@ -201,7 +202,7 @@ lower_buffer_interface_derefs_impl(nir_function_impl *impl,
*/
nir_ssa_def *index = get_block_array_index(&b, deref,
shader_program);
- ptr = nir_vec2(&b, index, nir_imm_int(&b, 0));
+ ptr = nir_vec2(&b, index, nir_imm_int(&b, offset));
} else {
/* This will get handled by nir_lower_explicit_io(). */
break;
@@ -209,6 +210,14 @@ lower_buffer_interface_derefs_impl(nir_function_impl *impl,
nir_deref_instr *cast = nir_build_deref_cast(&b, ptr, deref->mode,
deref->type, 0);
+ /* Set the alignment on the cast so that we get good alignment out
+ * of nir_lower_explicit_io. Our offset to the start of the UBO
+ * variable is always a constant, so we can use the maximum
+ * align_mul.
+ */
+ cast->cast.align_mul = NIR_ALIGN_MUL_MAX;
+ cast->cast.align_offset = offset % NIR_ALIGN_MUL_MAX;
+
nir_ssa_def_rewrite_uses(&deref->dest.ssa,
nir_src_for_ssa(&cast->dest.ssa));
nir_deref_instr_remove_if_unused(deref);
More information about the mesa-commit
mailing list