diff --git a/src/intel/vulkan/anv_descriptor_set.c b/src/intel/vulkan/anv_descriptor_set.c index 6644d62b81e..75ab643f475 100644 --- a/src/intel/vulkan/anv_descriptor_set.c +++ b/src/intel/vulkan/anv_descriptor_set.c @@ -584,6 +584,8 @@ VkResult anv_CreateDescriptorPool( &device->surface_state_pool, 4096); pool->surface_state_free_list = NULL; + list_inithead(&pool->desc_sets); + *pDescriptorPool = anv_descriptor_pool_to_handle(pool); return VK_SUCCESS; @@ -606,6 +608,12 @@ void anv_DestroyDescriptorPool( anv_gem_close(device, pool->bo.gem_handle); } anv_state_stream_finish(&pool->surface_state_stream); + + list_for_each_entry_safe(struct anv_descriptor_set, set, + &pool->desc_sets, pool_link) { + anv_descriptor_set_destroy(device, pool, set); + } + vk_free2(&device->alloc, pAllocator, pool); } @@ -682,6 +690,8 @@ anv_descriptor_pool_free_set(struct anv_descriptor_pool *pool, entry->size = set->size; pool->free_list = (char *) entry - pool->data; } + + list_del(&set->pool_link); } struct surface_state_free_list_entry { @@ -852,6 +862,8 @@ VkResult anv_AllocateDescriptorSets( if (result != VK_SUCCESS) break; + list_addtail(&set->pool_link, &pool->desc_sets); + pDescriptorSets[i] = anv_descriptor_set_to_handle(set); } diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index d7934f81d75..eed282ff985 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1629,6 +1629,10 @@ struct anv_descriptor_set { uint32_t buffer_view_count; struct anv_buffer_view *buffer_views; + + /* Link to descriptor pool's desc_sets list . */ + struct list_head pool_link; + struct anv_descriptor descriptors[0]; }; @@ -1671,6 +1675,8 @@ struct anv_descriptor_pool { struct anv_state_stream surface_state_stream; void *surface_state_free_list; + struct list_head desc_sets; + char data[0]; };