From f78e4cec3207700628df142b950cc7e20b7357fc Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Tue, 31 Jan 2023 17:48:52 -0600 Subject: [PATCH] vtn: Set alignment on initial UBO/SSBO casts Reviewed-by: Jesse Natalie Reviewed-by: Lionel Landwerlin Part-of: --- src/compiler/spirv/nir_spirv.h | 12 ++++++++++++ src/compiler/spirv/vtn_variables.c | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/src/compiler/spirv/nir_spirv.h b/src/compiler/spirv/nir_spirv.h index 5c28bc2f093..7a2b1763772 100644 --- a/src/compiler/spirv/nir_spirv.h +++ b/src/compiler/spirv/nir_spirv.h @@ -101,6 +101,18 @@ struct spirv_to_nir_options { nir_address_format temp_addr_format; nir_address_format constant_addr_format; + /** Minimum UBO alignment. + * + * This should match VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment + */ + uint32_t min_ubo_alignment; + + /** Minimum SSBO alignment. + * + * This should match VkPhysicalDeviceLimits::minStorageBufferOffsetAlignment + */ + uint32_t min_ssbo_alignment; + const nir_shader *clc_shader; struct { diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c index 9665d44fecd..2cf4da6c0b5 100644 --- a/src/compiler/spirv/vtn_variables.c +++ b/src/compiler/spirv/vtn_variables.c @@ -413,10 +413,15 @@ vtn_pointer_dereference(struct vtn_builder *b, base->mode == vtn_variable_mode_ubo); nir_variable_mode nir_mode = base->mode == vtn_variable_mode_ssbo ? nir_var_mem_ssbo : nir_var_mem_ubo; + const uint32_t align = base->mode == vtn_variable_mode_ssbo ? + b->options->min_ssbo_alignment : b->options->min_ubo_alignment; tail = nir_build_deref_cast(&b->nb, desc, nir_mode, vtn_type_get_nir_type(b, type, base->mode), base->ptr_type->stride); + tail->cast.align_mul = align; + tail->cast.align_offset = 0; + } else if (base->mode == vtn_variable_mode_shader_record) { /* For ShaderRecordBufferKHR variables, we don't have a nir_variable. * It's just a fancy handle around a pointer to the shader record for