From e52e7019b9002ba890ec5f39b8c2718e9065f69e Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 23 Mar 2026 14:46:06 -0400 Subject: [PATCH] panvk: Increase robust buffer access alignments We can't go any higher than 4B for SSBOs but we can go up to 16B for UBOs. This will let us start vectorizing UBO access, even when robust because max-size loads (LD_PKA.i128) will never overrun a binding unless they're entirely outside the binding. Reviewed-by: Lars-Ivar Hesselberg Simonsen Reviewed-by: Christoph Pillmayer Reviewed-by: Lorenzo Rossi Part-of: --- src/panfrost/vulkan/panvk_vX_cmd_desc_state.c | 4 +++- src/panfrost/vulkan/panvk_vX_descriptor_set.c | 7 ++++--- src/panfrost/vulkan/panvk_vX_physical_device.c | 8 ++++---- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/panfrost/vulkan/panvk_vX_cmd_desc_state.c b/src/panfrost/vulkan/panvk_vX_cmd_desc_state.c index 34320ce03b2..705b89534dc 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_desc_state.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_desc_state.c @@ -250,12 +250,14 @@ panvk_per_arch(cmd_fill_dyn_bufs)( const struct panvk_descriptor_set *set = desc_state->sets[set_idx]; const uint32_t dyn_buf_offset = desc_state->dyn_buf_offsets[set_idx][dyn_buf_idx]; + const bool is_ssbo = + desc_state->dyn_ssbos[set_idx] & BITFIELD_BIT(dyn_buf_idx); assert(set_idx < MAX_SETS); assert(set); pan_pack(&buffers[i], BUFFER, cfg) { - cfg.size = set->dyn_bufs[dyn_buf_idx].size; + cfg.size = align(set->dyn_bufs[dyn_buf_idx].size, is_ssbo ? 4 : 16); cfg.address = set->dyn_bufs[dyn_buf_idx].dev_addr + dyn_buf_offset; } } diff --git a/src/panfrost/vulkan/panvk_vX_descriptor_set.c b/src/panfrost/vulkan/panvk_vX_descriptor_set.c index 7d087307d66..897ab12a097 100644 --- a/src/panfrost/vulkan/panvk_vX_descriptor_set.c +++ b/src/panfrost/vulkan/panvk_vX_descriptor_set.c @@ -184,7 +184,7 @@ write_buffer_desc(struct panvk_descriptor_set *set, if (type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) { struct panvk_ssbo_addr desc = { .base_addr = panvk_buffer_gpu_ptr(buffer, info->offset), - .size = range, + .size = align(range, 4), }; write_desc(set, binding, elem, &desc, NO_SUBDESC); @@ -202,11 +202,12 @@ write_buffer_desc(struct panvk_descriptor_set *set, write_desc(set, binding, elem, &padded_desc, NO_SUBDESC); } #else + const bool is_ssbo = type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; struct mali_buffer_packed desc; pan_pack(&desc, BUFFER, cfg) { cfg.address = panvk_buffer_gpu_ptr(buffer, info->offset); - cfg.size = range; + cfg.size = align(range, is_ssbo ? 4 : 16); } write_desc(set, binding, elem, &desc, NO_SUBDESC); #endif @@ -498,7 +499,7 @@ panvk_init_iub(struct panvk_descriptor_set *set, uint32_t binding, pan_pack(&desc, BUFFER, cfg) { cfg.address = iub_data_dev; - cfg.size = iub_size_dev; + cfg.size = align(iub_size_dev, 16); } write_desc(set, binding, 0, &desc, NO_SUBDESC); #endif diff --git a/src/panfrost/vulkan/panvk_vX_physical_device.c b/src/panfrost/vulkan/panvk_vX_physical_device.c index 4dfabc54bfc..f2f0a5818b7 100644 --- a/src/panfrost/vulkan/panvk_vX_physical_device.c +++ b/src/panfrost/vulkan/panvk_vX_physical_device.c @@ -845,8 +845,8 @@ panvk_per_arch(get_physical_device_properties)( .minTexelBufferOffsetAlignment = 16, /* Always aligned on a uniform slot (vec4). */ .minUniformBufferOffsetAlignment = 16, - /* Lowered to global accesses, which happen at the 32-bit granularity. */ - .minStorageBufferOffsetAlignment = 4, + /* LOAD.i128 and LD_PKA.i128 which require 16B alignment */ + .minStorageBufferOffsetAlignment = 16, /* Signed 4-bit value. */ .minTexelOffset = -8, .maxTexelOffset = 7, @@ -1099,8 +1099,8 @@ panvk_per_arch(get_physical_device_properties)( .pipelineBinaryCompressedData = false, /* VK_KHR_robustness2 */ - .robustStorageBufferAccessSizeAlignment = 1, - .robustUniformBufferAccessSizeAlignment = 1, + .robustStorageBufferAccessSizeAlignment = 4, + .robustUniformBufferAccessSizeAlignment = 16, /* VK_EXT_shader_object */ /* We do not currently support VK_EXT_shader_object but this is used