[Mesa-dev] [PATCH 1/2] radv: Never try to create more than max_sets descriptor sets.
Nicolai Hähnle
nhaehnle at gmail.com
Fri Feb 17 09:32:22 UTC 2017
On 16.02.2017 21:26, Bas Nieuwenhuizen wrote:
> 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 at google.com>
> CC: <mesa-stable at lists.freedesktop.org>
> Fixes: f4e499ec79147f4172f3669ae9dafd941aaeeb65
I think it would be good to follow the kernel style of quoting the title
of the fixed commit, in this case:
Fixes: f4e499ec7914 ("radv: add initial non-conformant radv vulkan driver")
> ---
> src/amd/vulkan/radv_descriptor_set.c | 7 +++++--
> 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[];
> };
>
>
More information about the mesa-dev
mailing list