diff options
author | Bas Nieuwenhuizen <[email protected]> | 2017-02-16 20:52:24 +0100 |
---|---|---|
committer | Bas Nieuwenhuizen <[email protected]> | 2017-02-17 09:28:14 +0100 |
commit | f4487016226c3337fa5fb2244c75ce298093c3ce (patch) | |
tree | f9d19221d53754a3f3898e06dcc7b6ec6c254be9 | |
parent | fccbad73effc88011b2236e042ad749c8bc15abd (diff) |
radv: Never try to create more than max_sets descriptor sets.
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 <[email protected]>
Reviewed-by: Dave Airlie <[email protected]>
CC: <[email protected]>
Fixes: f4e499ec79147f4172f3669ae9dafd941aaeeb65
-rw-r--r-- | src/amd/vulkan/radv_descriptor_set.c | 7 | ||||
-rw-r--r-- | src/amd/vulkan/radv_private.h | 1 |
2 files changed, 6 insertions, 2 deletions
diff --git a/src/amd/vulkan/radv_descriptor_set.c b/src/amd/vulkan/radv_descriptor_set.c index 6d89d601de0..81291d10037 100644 --- a/src/amd/vulkan/radv_descriptor_set.c +++ b/src/amd/vulkan/radv_descriptor_set.c @@ -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; diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 7b1d8fb1f45..9c326dcef83 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -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[]; }; |