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