From 61e910bde0963c2ef2e464c7d79396ff0a40e5fe Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 30 Jan 2023 20:11:51 -0600 Subject: [PATCH] nvk: Rework OOM handling for descriptor pools We now properly return VK_ERROR_OUT_OF_POOL_MEMORY if we run out instead of silently assigning a NULL bo and map. Part-of: --- src/nouveau/vulkan/nvk_descriptor_set.c | 19 ++++++++++++------- src/nouveau/vulkan/nvk_descriptor_set.h | 3 +++ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/nouveau/vulkan/nvk_descriptor_set.c b/src/nouveau/vulkan/nvk_descriptor_set.c index 07d48e213d0..c20debaf109 100644 --- a/src/nouveau/vulkan/nvk_descriptor_set.c +++ b/src/nouveau/vulkan/nvk_descriptor_set.c @@ -331,21 +331,26 @@ nvk_descriptor_set_create(struct nvk_device *device, struct nvk_descriptor_pool vk_object_base_init(&device->vk, &set->base, VK_OBJECT_TYPE_DESCRIPTOR_SET); set->layout = layout; - if (pool->entry_count == pool->max_entry_count) { + if (pool->entry_count == pool->max_entry_count) return VK_ERROR_OUT_OF_POOL_MEMORY; - } - if (pool->current_offset + layout->descriptor_buffer_size <= pool->size) { + if (layout->descriptor_buffer_size > 0) { + if (pool->current_offset + layout->descriptor_buffer_size > pool->size) + return VK_ERROR_OUT_OF_POOL_MEMORY; + set->bo = pool->bo; set->mapped_ptr = (uint32_t *)(pool->mapped_ptr + pool->current_offset); set->bo_offset = pool->current_offset; - pool->entries[pool->entry_count].offset = pool->current_offset; - pool->entries[pool->entry_count].size = layout->descriptor_buffer_size; - pool->entries[pool->entry_count].set = set; - pool->current_offset += layout->descriptor_buffer_size; } + + pool->entries[pool->entry_count].offset = set->bo_offset; + pool->entries[pool->entry_count].size = layout->descriptor_buffer_size; + pool->entries[pool->entry_count].set = set; + pool->current_offset += layout->descriptor_buffer_size; pool->entry_count++; + *out_set = set; + return VK_SUCCESS; } diff --git a/src/nouveau/vulkan/nvk_descriptor_set.h b/src/nouveau/vulkan/nvk_descriptor_set.h index 34445ecf1b1..ca4a7c8e56a 100644 --- a/src/nouveau/vulkan/nvk_descriptor_set.h +++ b/src/nouveau/vulkan/nvk_descriptor_set.h @@ -69,6 +69,9 @@ nvk_push_descriptor_set_ref(struct nouveau_ws_push *push, static inline uint64_t nvk_descriptor_set_addr(const struct nvk_descriptor_set *set) { + if (set->bo == NULL) + return 0; + return set->bo->offset + set->bo_offset; }