diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index 60daa7a7621..a0a6af130c7 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -1482,14 +1482,6 @@ alloc_private_binding(struct anv_device *device, if (binding->memory_range.size == 0) return VK_SUCCESS; - const VkImageSwapchainCreateInfoKHR *swapchain_info = - vk_find_struct_const(create_info->pNext, IMAGE_SWAPCHAIN_CREATE_INFO_KHR); - - if (swapchain_info && swapchain_info->swapchain != VK_NULL_HANDLE) { - /* The image will be bound to swapchain memory. */ - return VK_SUCCESS; - } - VkResult result = anv_device_alloc_bo(device, "image-binding-private", binding->memory_range.size, 0, 0, &binding->address.bo); @@ -2721,6 +2713,21 @@ anv_bind_image_memory(struct anv_device *device, assert(image->vk.aspects == swapchain_image->vk.aspects); assert(mem == NULL); + /* Remove the internally allocated private binding since we're going + * to replace everything with BOs from the WSI image, we don't want + * to leak the current BO. + */ + struct anv_bo *private_bo = + image->bindings[ANV_IMAGE_MEMORY_BINDING_PRIVATE].address.bo; + if (private_bo) { + assert(image->bindings[ANV_IMAGE_MEMORY_BINDING_PRIVATE].memory_range.size); + assert(!image->bindings[ANV_IMAGE_MEMORY_BINDING_PRIVATE].host_map); + + ANV_DMR_BO_FREE(&image->vk.base, private_bo); + anv_device_release_bo(device, private_bo); + image->bindings[ANV_IMAGE_MEMORY_BINDING_PRIVATE].address.bo = NULL; + } + for (int j = 0; j < ARRAY_SIZE(image->bindings); ++j) { assert(memory_ranges_equal(image->bindings[j].memory_range, swapchain_image->bindings[j].memory_range)); @@ -2733,8 +2740,7 @@ anv_bind_image_memory(struct anv_device *device, /* We must bump the private binding's bo's refcount because, unlike the other * bindings, its lifetime is not application-managed. */ - struct anv_bo *private_bo = - image->bindings[ANV_IMAGE_MEMORY_BINDING_PRIVATE].address.bo; + private_bo = image->bindings[ANV_IMAGE_MEMORY_BINDING_PRIVATE].address.bo; if (private_bo) anv_bo_ref(private_bo);