Commit 105002bd authored by Tapani Pälli's avatar Tapani Pälli
Browse files

anv: destroy descriptor sets when pool gets destroyed

Patch maintains a list of sets in the pool and destroys possible
remaining sets when pool is destroyed.

As stated in Vulkan spec:
   "When a pool is destroyed, all descriptor sets allocated from
    the pool are implicitly freed and become invalid."

This fixes memory leaks spotted with valgrind:

   ==19622== 96 bytes in 1 blocks are definitely lost in loss record 2 of 3
   ==19622==    at 0x483880B: malloc (vg_replace_malloc.c:309)
   ==19622==    by 0x495B67E: default_alloc_func (anv_device.c:547)
   ==19622==    by 0x4955E05: vk_alloc (vk_alloc.h:36)
   ==19622==    by 0x4956A8F: anv_multialloc_alloc (anv_private.h:538)
   ==19622==    by 0x4956A8F: anv_CreateDescriptorSetLayout (anv_descriptor_set.c:217)

Fixes: 14f6275c

 ("anv/descriptor_set: add reference counting for descriptor set layouts")
Signed-off-by: Tapani Pälli's avatarTapani Pälli <tapani.palli@intel.com>
Reviewed-by: Lionel Landwerlin's avatarLionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Jason Ekstrand's avatarJason Ekstrand <jason@jlekstrand.net>
parent 051b4064
...@@ -584,6 +584,8 @@ VkResult anv_CreateDescriptorPool( ...@@ -584,6 +584,8 @@ VkResult anv_CreateDescriptorPool(
&device->surface_state_pool, 4096); &device->surface_state_pool, 4096);
pool->surface_state_free_list = NULL; pool->surface_state_free_list = NULL;
list_inithead(&pool->desc_sets);
*pDescriptorPool = anv_descriptor_pool_to_handle(pool); *pDescriptorPool = anv_descriptor_pool_to_handle(pool);
return VK_SUCCESS; return VK_SUCCESS;
...@@ -606,6 +608,12 @@ void anv_DestroyDescriptorPool( ...@@ -606,6 +608,12 @@ void anv_DestroyDescriptorPool(
anv_gem_close(device, pool->bo.gem_handle); anv_gem_close(device, pool->bo.gem_handle);
} }
anv_state_stream_finish(&pool->surface_state_stream); 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); vk_free2(&device->alloc, pAllocator, pool);
} }
...@@ -682,6 +690,8 @@ anv_descriptor_pool_free_set(struct anv_descriptor_pool *pool, ...@@ -682,6 +690,8 @@ anv_descriptor_pool_free_set(struct anv_descriptor_pool *pool,
entry->size = set->size; entry->size = set->size;
pool->free_list = (char *) entry - pool->data; pool->free_list = (char *) entry - pool->data;
} }
list_del(&set->pool_link);
} }
struct surface_state_free_list_entry { struct surface_state_free_list_entry {
...@@ -852,6 +862,8 @@ VkResult anv_AllocateDescriptorSets( ...@@ -852,6 +862,8 @@ VkResult anv_AllocateDescriptorSets(
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
break; break;
list_addtail(&set->pool_link, &pool->desc_sets);
pDescriptorSets[i] = anv_descriptor_set_to_handle(set); pDescriptorSets[i] = anv_descriptor_set_to_handle(set);
} }
......
...@@ -1629,6 +1629,10 @@ struct anv_descriptor_set { ...@@ -1629,6 +1629,10 @@ struct anv_descriptor_set {
uint32_t buffer_view_count; uint32_t buffer_view_count;
struct anv_buffer_view *buffer_views; struct anv_buffer_view *buffer_views;
/* Link to descriptor pool's desc_sets list . */
struct list_head pool_link;
struct anv_descriptor descriptors[0]; struct anv_descriptor descriptors[0];
}; };
...@@ -1671,6 +1675,8 @@ struct anv_descriptor_pool { ...@@ -1671,6 +1675,8 @@ struct anv_descriptor_pool {
struct anv_state_stream surface_state_stream; struct anv_state_stream surface_state_stream;
void *surface_state_free_list; void *surface_state_free_list;
struct list_head desc_sets;
char data[0]; char data[0];
}; };
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment