anv/descriptor_set: Don't fully destroy sets in pool destroy/reset
authorJason Ekstrand <jason@jlekstrand.net>
Thu, 25 Apr 2019 19:15:26 +0000 (14:15 -0500)
committerJason Ekstrand <jason@jlekstrand.net>
Fri, 26 Apr 2019 05:40:28 +0000 (05:40 +0000)
In 105002bd2d617, we fixed a memory leak bug where we weren't properly
destroying descriptor when destroying/resetting a descriptor pool.
However, the only real leak that happened was that we we take a
reference to the descriptor set layout in the descriptor set and we
weren't dropping our reference.  Everything else in the descriptor set
is tied to the pool itself and doesn't need to be freed on a per-set
basis.  This commit changes the destroy/reset functions to only bother
walking the list of sets to unref the layouts and otherwise we just
assume that the whole-pool destroy/reset takes care of the rest.

Now that we're doing more non-trivial things with descriptor sets such
as allocating things with util_vma_heap, per-set destruction is starting
to show up on perf traces.  This takes reset back to where it's supposed
to be as a cheap whole-pool operation.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
src/intel/vulkan/anv_descriptor_set.c

index 7ffdb1cceff4a8c79f3850117e904d1cea7ef814..dc33cc6d9a88e62bd091cb87e4ada51fe094e863 100644 (file)
@@ -747,7 +747,7 @@ void anv_DestroyDescriptorPool(
 
    list_for_each_entry_safe(struct anv_descriptor_set, set,
                             &pool->desc_sets, pool_link) {
-      anv_descriptor_set_destroy(device, pool, set);
+      anv_descriptor_set_layout_unref(device, set->layout);
    }
 
    if (pool->bo.size) {
@@ -771,8 +771,9 @@ VkResult anv_ResetDescriptorPool(
 
    list_for_each_entry_safe(struct anv_descriptor_set, set,
                             &pool->desc_sets, pool_link) {
-      anv_descriptor_set_destroy(device, pool, set);
+      anv_descriptor_set_layout_unref(device, set->layout);
    }
+   list_inithead(&pool->desc_sets);
 
    pool->next = 0;
    pool->free_list = EMPTY;