diff options
author | Samuel Pitoiset <samuel.pitoiset@gmail.com> | 2024-04-10 08:43:34 +0200 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2024-04-10 11:23:40 +0000 |
commit | 8d5072bb7fc61c5e14b6e32894bede660f17a36d (patch) | |
tree | eafba5a9fdf322befebd7fd13c6b66b08495bbb1 | |
parent | 50060072a7013f48a560599bd0c9f103ab747220 (diff) |
radv: fix missing unbind report when a buffer is destroyed
There should be a matching unbound operation with
VK_EXT_device_address_binding_report.
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28659>
-rw-r--r-- | src/amd/vulkan/radv_buffer.c | 12 | ||||
-rw-r--r-- | src/amd/vulkan/radv_buffer.h | 2 |
2 files changed, 14 insertions, 0 deletions
diff --git a/src/amd/vulkan/radv_buffer.c b/src/amd/vulkan/radv_buffer.c index 3c0ac8708d2..00003769aed 100644 --- a/src/amd/vulkan/radv_buffer.c +++ b/src/amd/vulkan/radv_buffer.c @@ -44,9 +44,16 @@ radv_buffer_finish(struct radv_buffer *buffer) static void radv_destroy_buffer(struct radv_device *device, const VkAllocationCallbacks *pAllocator, struct radv_buffer *buffer) { + struct radv_physical_device *pdev = radv_device_physical(device); + struct radv_instance *instance = radv_physical_device_instance(pdev); + if ((buffer->vk.create_flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) && buffer->bo) radv_bo_destroy(device, &buffer->vk.base, buffer->bo); + if (buffer->bo_va) + vk_address_binding_report(&instance->vk, &buffer->vk.base, buffer->bo_va + buffer->offset, buffer->bo_size, + VK_DEVICE_ADDRESS_BINDING_TYPE_UNBIND_EXT); + radv_rmv_log_resource_destroy(device, (uint64_t)radv_buffer_to_handle(buffer)); radv_buffer_finish(buffer); vk_free2(&device->vk.alloc, pAllocator, buffer); @@ -75,6 +82,8 @@ radv_create_buffer(struct radv_device *device, const VkBufferCreateInfo *pCreate vk_buffer_init(&device->vk, &buffer->vk, pCreateInfo); buffer->bo = NULL; buffer->offset = 0; + buffer->bo_va = 0; + buffer->bo_size = 0; if (pCreateInfo->flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) { enum radeon_bo_flag flags = RADEON_FLAG_VIRTUAL; @@ -159,6 +168,9 @@ radv_BindBufferMemory2(VkDevice _device, uint32_t bindInfoCount, const VkBindBuf buffer->bo = mem->bo; buffer->offset = pBindInfos[i].memoryOffset; + buffer->bo_va = radv_buffer_get_va(mem->bo); + buffer->bo_size = mem->bo->size; + radv_rmv_log_buffer_bind(device, pBindInfos[i].buffer); vk_address_binding_report(&instance->vk, &buffer->vk.base, radv_buffer_get_va(buffer->bo) + buffer->offset, diff --git a/src/amd/vulkan/radv_buffer.h b/src/amd/vulkan/radv_buffer.h index d341d62df83..83bbce528b7 100644 --- a/src/amd/vulkan/radv_buffer.h +++ b/src/amd/vulkan/radv_buffer.h @@ -23,6 +23,8 @@ struct radv_buffer { /* Set when bound */ struct radeon_winsys_bo *bo; VkDeviceSize offset; + uint64_t bo_va; + uint64_t bo_size; }; VK_DEFINE_NONDISP_HANDLE_CASTS(radv_buffer, vk.base, VkBuffer, VK_OBJECT_TYPE_BUFFER) |