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 <lars-ivar.simonsen@arm.com>
Reviewed-by: Christoph Pillmayer <christoph.pillmayer@arm.com>
Reviewed-by: Lorenzo Rossi <lorenzo.rossi@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40576>
This commit is contained in:
Faith Ekstrand 2026-03-23 14:46:06 -04:00 committed by Marge Bot
parent f350a69759
commit e52e7019b9
3 changed files with 11 additions and 8 deletions

View file

@ -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;
}
}

View file

@ -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

View file

@ -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