summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>2024-04-10 08:43:34 +0200
committerMarge Bot <emma+marge@anholt.net>2024-04-10 11:23:40 +0000
commit8d5072bb7fc61c5e14b6e32894bede660f17a36d (patch)
treeeafba5a9fdf322befebd7fd13c6b66b08495bbb1
parent50060072a7013f48a560599bd0c9f103ab747220 (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.c12
-rw-r--r--src/amd/vulkan/radv_buffer.h2
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)