diff options
author | Bas Nieuwenhuizen <[email protected]> | 2018-04-10 01:06:47 +0200 |
---|---|---|
committer | Bas Nieuwenhuizen <[email protected]> | 2018-04-18 22:56:54 +0200 |
commit | b5e04e9217bad938970c41fd56edea9c9876825a (patch) | |
tree | f9c3424a693e20e1919fb0ffe2cc4edd3c53f369 | |
parent | 78c54acbe8434aeb53487b913d633dc2e395ddd6 (diff) |
radv: Support allocating variable size descriptor sets.
Reviewed-by: Samuel Pitoiset <[email protected]>
-rw-r--r-- | src/amd/vulkan/radv_descriptor_set.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/amd/vulkan/radv_descriptor_set.c b/src/amd/vulkan/radv_descriptor_set.c index 9b35451c497..55b4aaa388c 100644 --- a/src/amd/vulkan/radv_descriptor_set.c +++ b/src/amd/vulkan/radv_descriptor_set.c @@ -392,6 +392,7 @@ static VkResult radv_descriptor_set_create(struct radv_device *device, struct radv_descriptor_pool *pool, const struct radv_descriptor_set_layout *layout, + const uint32_t *variable_count, struct radv_descriptor_set **out_set) { struct radv_descriptor_set *set; @@ -420,9 +421,9 @@ radv_descriptor_set_create(struct radv_device *device, } set->layout = layout; - if (layout->size) { - uint32_t layout_size = align_u32(layout->size, 32); - set->size = layout->size; + uint32_t layout_size = align_u32(layout->size, 32); + if (layout_size) { + set->size = layout_size; if (!pool->host_memory_base && pool->entry_count == pool->max_entry_count) { vk_free2(&device->alloc, NULL, set); @@ -648,14 +649,26 @@ VkResult radv_AllocateDescriptorSets( uint32_t i; struct radv_descriptor_set *set = NULL; + const VkDescriptorSetVariableDescriptorCountAllocateInfoEXT *variable_counts = + vk_find_struct_const(pAllocateInfo->pNext, DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT); + const uint32_t zero = 0; + /* allocate a set of buffers for each shader to contain descriptors */ for (i = 0; i < pAllocateInfo->descriptorSetCount; i++) { RADV_FROM_HANDLE(radv_descriptor_set_layout, layout, pAllocateInfo->pSetLayouts[i]); + const uint32_t *variable_count = NULL; + if (variable_counts) { + if (i < variable_counts->descriptorSetCount) + variable_count = variable_counts->pDescriptorCounts + i; + else + variable_count = &zero; + } + assert(!(layout->flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR)); - result = radv_descriptor_set_create(device, pool, layout, &set); + result = radv_descriptor_set_create(device, pool, layout, variable_count, &set); if (result != VK_SUCCESS) break; |