mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 05:08:08 +02:00
hasvk: avoid leaking private binding for aliased wsi image
This time for hasvk and is the same with
https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/35893
Aliased wsi image has to share the same private binding with the
original wsi image for memory consistency. If the private binding
exists, it needs to be released before being overridden.
Cc: mesa-stable
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36095>
(cherry picked from commit c647c422db)
This commit is contained in:
parent
03a57620a9
commit
1c3798ed86
2 changed files with 16 additions and 12 deletions
|
|
@ -2234,7 +2234,7 @@
|
|||
"description": "hasvk: avoid leaking private binding for aliased wsi image",
|
||||
"nominated": true,
|
||||
"nomination_type": 1,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"main_sha": null,
|
||||
"because_sha": null,
|
||||
"notes": null
|
||||
|
|
|
|||
|
|
@ -1162,14 +1162,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;
|
||||
}
|
||||
|
||||
return anv_device_alloc_bo(device, "image-binding-private",
|
||||
binding->memory_range.size, 0, 0,
|
||||
&binding->address.bo);
|
||||
|
|
@ -1670,6 +1662,19 @@ VkResult anv_BindImageMemory2(
|
|||
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);
|
||||
|
||||
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));
|
||||
|
|
@ -1679,8 +1684,7 @@ VkResult anv_BindImageMemory2(
|
|||
/* 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);
|
||||
|
||||
|
|
@ -2675,4 +2679,4 @@ void anv_GetRenderingAreaGranularityKHR(
|
|||
.width = 1,
|
||||
.height = 1,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue