radv: Never try to create more than max_sets descriptor sets.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Thu, 16 Feb 2017 19:52:24 +0000 (20:52 +0100)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Fri, 17 Feb 2017 08:28:14 +0000 (09:28 +0100)
We only use the freed ones after all free space has been used. If
the app only allocates small descriptor sets, we might go over
max_sets before the memory is full.

Signed-off-by: Bas Nieuwenhuizen <basni@google.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
CC: <mesa-stable@lists.freedesktop.org>
Fixes: f4e499ec79147f4172f3669ae9dafd941aaeeb65
src/amd/vulkan/radv_descriptor_set.c
src/amd/vulkan/radv_private.h

index 6d89d601de0dd98515c65b8290948db969adc9d4..81291d10037480dbbfbc335d5adb2254cd2d8c27 100644 (file)
@@ -275,12 +275,13 @@ radv_descriptor_set_create(struct radv_device *device,
                uint32_t layout_size = align_u32(layout->size, 32);
                set->size = layout->size;
                if (!cmd_buffer) {
-                       if (pool->current_offset + layout_size <= pool->size) {
+                       if (pool->current_offset + layout_size <= pool->size &&
+                           pool->allocated_sets < pool->max_sets) {
                                set->bo = pool->bo;
                                set->mapped_ptr = (uint32_t*)(pool->mapped_ptr + pool->current_offset);
                                set->va = device->ws->buffer_get_va(set->bo) + pool->current_offset;
                                pool->current_offset += layout_size;
-
+                               ++pool->allocated_sets;
                        } else {
                                int entry = pool->free_list, prev_entry = -1;
                                uint32_t offset;
@@ -417,6 +418,7 @@ VkResult radv_CreateDescriptorPool(
        pool->full_list = 0;
        pool->free_nodes[max_sets - 1].next = -1;
        pool->max_sets = max_sets;
+       pool->allocated_sets = 0;
 
        for (int i = 0; i  + 1 < max_sets; ++i)
                pool->free_nodes[i].next = i + 1;
@@ -494,6 +496,7 @@ VkResult radv_ResetDescriptorPool(
                radv_descriptor_set_destroy(device, pool, set, false);
        }
 
+       pool->allocated_sets = 0;
        pool->current_offset = 0;
        pool->free_list = -1;
        pool->full_list = 0;
index 7b1d8fb1f450a0ff202161d704372a96d2b9812c..9c326dcef8391baa99633a1f9815ded0928bc5e8 100644 (file)
@@ -564,6 +564,7 @@ struct radv_descriptor_pool {
        int free_list;
        int full_list;
        uint32_t max_sets;
+       uint32_t allocated_sets;
        struct radv_descriptor_pool_free_node free_nodes[];
 };