summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBas Nieuwenhuizen <[email protected]>2018-04-10 01:06:47 +0200
committerBas Nieuwenhuizen <[email protected]>2018-04-18 22:56:54 +0200
commitb5e04e9217bad938970c41fd56edea9c9876825a (patch)
treef9c3424a693e20e1919fb0ffe2cc4edd3c53f369
parent78c54acbe8434aeb53487b913d633dc2e395ddd6 (diff)
radv: Support allocating variable size descriptor sets.
Reviewed-by: Samuel Pitoiset <[email protected]>
-rw-r--r--src/amd/vulkan/radv_descriptor_set.c21
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;