diff --git a/src/virtio/vulkan/vn_image.c b/src/virtio/vulkan/vn_image.c index 99cb5e317a5..233667d847d 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 @@ -313,7 +315,9 @@ vn_DestroyImage(VkDevice device, vn_FreeMemory(device, mem_handle, 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 c68114996bd..935272dc53a 100644 --- a/src/virtio/vulkan/vn_image.h +++ b/src/virtio/vulkan/vn_image.h @@ -27,6 +27,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 {