diff --git a/.pick_status.json b/.pick_status.json index 516ff55b434..68c3d1e1808 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -2380,7 +2380,7 @@ "description": "venus: properly destroy deferred ahb image before real image creation", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "19b7b09885c5975535605465ceb58b06c0170148" }, diff --git a/src/virtio/vulkan/vn_image.c b/src/virtio/vulkan/vn_image.c index 88a3c7bce77..e785138a7a1 100644 --- a/src/virtio/vulkan/vn_image.c +++ b/src/virtio/vulkan/vn_image.c @@ -206,7 +206,9 @@ vn_image_init_deferred(struct vn_device *dev, const VkImageCreateInfo *create_info, struct vn_image *img) { - return vn_image_init(dev, create_info, img); + VkResult result = vn_image_init(dev, create_info, img); + img->deferred_info->initialized = result == VK_SUCCESS; + return result; } VkResult @@ -298,7 +300,9 @@ vn_DestroyImage(VkDevice device, if (img->private_memory != VK_NULL_HANDLE) vn_FreeMemory(device, img->private_memory, pAllocator); - vn_async_vkDestroyImage(dev->instance, device, image, NULL); + /* must not ask renderer to destroy uninitialized deferred image */ + if (!img->deferred_info || img->deferred_info->initialized) + vn_async_vkDestroyImage(dev->instance, device, image, NULL); if (img->deferred_info) vk_free(alloc, img->deferred_info); diff --git a/src/virtio/vulkan/vn_image.h b/src/virtio/vulkan/vn_image.h index a61319912cc..4c512685ba5 100644 --- a/src/virtio/vulkan/vn_image.h +++ b/src/virtio/vulkan/vn_image.h @@ -22,6 +22,9 @@ struct vn_image_create_deferred_info { VkImageCreateInfo create; VkImageFormatListCreateInfo list; VkImageStencilUsageCreateInfo stencil; + + /* track whether vn_image_init_deferred succeeds */ + bool initialized; }; struct vn_image {