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