| From d4878636fe77f3866ee7ca1f2364f83c91c9cd1c Mon Sep 17 00:00:00 2001 |
| From: Yiwei Zhang <zzyiwei@chromium.org> |
| Date: Fri, 20 Aug 2021 21:06:25 +0000 |
| Subject: [PATCH 1/8] venus: refactor failure path for sets allocation |
| |
| Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org> |
| Reviewed-by: Chia-I Wu <olvaffe@gmail.com> |
| Reviewed-by: Ryan Neph <ryanneph@google.com> |
| Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12501> |
| --- |
| src/virtio/vulkan/vn_descriptor_set.c | 48 ++++++++++++++------------- |
| 1 file changed, 25 insertions(+), 23 deletions(-) |
| |
| diff --git a/src/virtio/vulkan/vn_descriptor_set.c b/src/virtio/vulkan/vn_descriptor_set.c |
| index d5d0f484c4d..93ac44fc01f 100644 |
| --- a/src/virtio/vulkan/vn_descriptor_set.c |
| +++ b/src/virtio/vulkan/vn_descriptor_set.c |
| @@ -243,21 +243,16 @@ vn_AllocateDescriptorSets(VkDevice device, |
| struct vn_descriptor_pool *pool = |
| vn_descriptor_pool_from_handle(pAllocateInfo->descriptorPool); |
| const VkAllocationCallbacks *alloc = &pool->allocator; |
| + VkResult result; |
| |
| for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) { |
| struct vn_descriptor_set *set = |
| vk_zalloc(alloc, sizeof(*set), VN_DEFAULT_ALIGN, |
| VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); |
| if (!set) { |
| - for (uint32_t j = 0; j < i; j++) { |
| - set = vn_descriptor_set_from_handle(pDescriptorSets[j]); |
| - list_del(&set->head); |
| - vn_object_base_fini(&set->base); |
| - vk_free(alloc, set); |
| - } |
| - memset(pDescriptorSets, 0, |
| - sizeof(*pDescriptorSets) * pAllocateInfo->descriptorSetCount); |
| - return vn_error(dev->instance, VK_ERROR_OUT_OF_HOST_MEMORY); |
| + pDescriptorSets[i] = VK_NULL_HANDLE; |
| + result = VK_ERROR_OUT_OF_HOST_MEMORY; |
| + goto fail; |
| } |
| |
| vn_object_base_init(&set->base, VK_OBJECT_TYPE_DESCRIPTOR_SET, |
| @@ -270,22 +265,29 @@ vn_AllocateDescriptorSets(VkDevice device, |
| pDescriptorSets[i] = set_handle; |
| } |
| |
| - VkResult result = vn_call_vkAllocateDescriptorSets( |
| - dev->instance, device, pAllocateInfo, pDescriptorSets); |
| - if (result != VK_SUCCESS) { |
| - for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) { |
| - struct vn_descriptor_set *set = |
| - vn_descriptor_set_from_handle(pDescriptorSets[i]); |
| - list_del(&set->head); |
| - vn_object_base_fini(&set->base); |
| - vk_free(alloc, set); |
| - } |
| - memset(pDescriptorSets, 0, |
| - sizeof(*pDescriptorSets) * pAllocateInfo->descriptorSetCount); |
| - return vn_error(dev->instance, result); |
| - } |
| + result = vn_call_vkAllocateDescriptorSets(dev->instance, device, |
| + pAllocateInfo, pDescriptorSets); |
| + if (result != VK_SUCCESS) |
| + goto fail; |
| |
| return VK_SUCCESS; |
| + |
| +fail: |
| + for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) { |
| + struct vn_descriptor_set *set = |
| + vn_descriptor_set_from_handle(pDescriptorSets[i]); |
| + if (!set) |
| + break; |
| + |
| + list_del(&set->head); |
| + vn_object_base_fini(&set->base); |
| + vk_free(alloc, set); |
| + } |
| + |
| + memset(pDescriptorSets, 0, |
| + sizeof(*pDescriptorSets) * pAllocateInfo->descriptorSetCount); |
| + |
| + return vn_error(dev->instance, result); |
| } |
| |
| VkResult |
| -- |
| 2.33.0.259.gc128427fd7-goog |
| |