diff --git a/src/panfrost/vulkan/panvk_cmd_desc_state.h b/src/panfrost/vulkan/panvk_cmd_desc_state.h index f53a008b98c..7a9102b80fc 100644 --- a/src/panfrost/vulkan/panvk_cmd_desc_state.h +++ b/src/panfrost/vulkan/panvk_cmd_desc_state.h @@ -63,6 +63,7 @@ struct panvk_descriptor_state { BITSET_DECLARE(dirty_push_sets, MAX_SETS); uint32_t dyn_buf_offsets[MAX_SETS][MAX_DYNAMIC_BUFFERS]; + uint32_t dyn_ssbos[MAX_SETS]; }; #if PAN_ARCH < 9 diff --git a/src/panfrost/vulkan/panvk_descriptor_set_layout.h b/src/panfrost/vulkan/panvk_descriptor_set_layout.h index cf1687c0cbe..0c39f5ad046 100644 --- a/src/panfrost/vulkan/panvk_descriptor_set_layout.h +++ b/src/panfrost/vulkan/panvk_descriptor_set_layout.h @@ -101,6 +101,9 @@ struct panvk_descriptor_set_layout { unsigned desc_count; unsigned dyn_buf_count; + /* Bitmask of which dynamic buffers are SSBOs */ + uint32_t dyn_ssbos; + /* Number of bindings in this descriptor set */ uint32_t binding_count; diff --git a/src/panfrost/vulkan/panvk_vX_cmd_desc_state.c b/src/panfrost/vulkan/panvk_vX_cmd_desc_state.c index 1f89cd2a33e..34320ce03b2 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_desc_state.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_desc_state.c @@ -46,6 +46,7 @@ cmd_desc_state_bind_sets(struct panvk_descriptor_state *desc_state, desc_state->dyn_buf_offsets[set_idx][b] = info->pDynamicOffsets[dynoffset_idx++]; } + desc_state->dyn_ssbos[set_idx] = set->layout->dyn_ssbos; } } diff --git a/src/panfrost/vulkan/panvk_vX_descriptor_set_layout.c b/src/panfrost/vulkan/panvk_vX_descriptor_set_layout.c index 89da54275b1..3a6bbe9b1db 100644 --- a/src/panfrost/vulkan/panvk_vX_descriptor_set_layout.c +++ b/src/panfrost/vulkan/panvk_vX_descriptor_set_layout.c @@ -145,6 +145,7 @@ panvk_per_arch(CreateDescriptorSetLayout)( unsigned desc_idx = 0; unsigned dyn_buf_idx = 0; + uint32_t dyn_ssbos = 0; for (unsigned i = 0; i < pCreateInfo->bindingCount; i++) { const VkDescriptorSetLayoutBinding *binding = &bindings[i]; struct panvk_descriptor_set_binding_layout *binding_layout = @@ -184,6 +185,8 @@ panvk_per_arch(CreateDescriptorSetLayout)( if (vk_descriptor_type_is_dynamic(binding_layout->type)) { binding_layout->desc_idx = dyn_buf_idx; + if (binding_layout->type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC) + dyn_ssbos |= BITFIELD_RANGE(dyn_buf_idx, binding->descriptorCount); dyn_buf_idx += binding_layout->desc_count; } else { binding_layout->desc_idx = desc_idx; @@ -194,6 +197,7 @@ panvk_per_arch(CreateDescriptorSetLayout)( layout->desc_count = desc_idx; layout->dyn_buf_count = dyn_buf_idx; + layout->dyn_ssbos = dyn_ssbos; struct mesa_blake3 hash_ctx; _mesa_blake3_init(&hash_ctx);