From 94ec359ae55d7edebb41ba031ab189ea2e0207b8 Mon Sep 17 00:00:00 2001 From: Konstantin Seurer Date: Mon, 28 Nov 2022 22:22:10 +0100 Subject: [PATCH] radv/rra: Defer destroying accel struct data This allows us to dump acceleration structures that were destroyed before present. Part-of: --- src/amd/vulkan/layers/radv_rra_layer.c | 18 ++++++++++++++---- src/amd/vulkan/radv_private.h | 1 + src/amd/vulkan/radv_rra.c | 4 ++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/amd/vulkan/layers/radv_rra_layer.c b/src/amd/vulkan/layers/radv_rra_layer.c index 387841053d1..b06de415a26 100644 --- a/src/amd/vulkan/layers/radv_rra_layer.c +++ b/src/amd/vulkan/layers/radv_rra_layer.c @@ -97,6 +97,18 @@ rra_QueuePresentKHR(VkQueue _queue, const VkPresentInfoKHR *pPresentInfo) radv_rra_handle_trace(_queue); + RADV_FROM_HANDLE(radv_queue, queue, _queue); + struct hash_table *accel_structs = queue->device->rra_trace.accel_structs; + + hash_table_foreach (accel_structs, entry) { + struct radv_rra_accel_struct_data *data = entry->data; + if (!data->is_dead) + continue; + + radv_destroy_rra_accel_struct_data(radv_device_to_handle(queue->device), data); + _mesa_hash_table_remove(accel_structs, entry); + } + return VK_SUCCESS; } @@ -186,6 +198,7 @@ rra_CreateAccelerationStructureKHR(VkDevice _device, data->va = structure->va; data->size = structure->size; data->type = pCreateInfo->type; + data->is_dead = false; VkEventCreateInfo eventCreateInfo = { .sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO, @@ -345,11 +358,8 @@ rra_DestroyAccelerationStructureKHR(VkDevice _device, VkAccelerationStructureKHR assert(entry); struct radv_rra_accel_struct_data *data = entry->data; + data->is_dead = true; - radv_destroy_rra_accel_struct_data(_device, data); - - _mesa_hash_table_remove(device->rra_trace.accel_structs, entry); - _mesa_hash_table_u64_remove(device->rra_trace.accel_struct_vas, structure->va); simple_mtx_unlock(&device->rra_trace.data_mtx); radv_DestroyAccelerationStructureKHR(_device, _structure, pAllocator); diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 045855997cf..3f83a480cbc 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -806,6 +806,7 @@ struct radv_rra_accel_struct_data { VkBuffer buffer; VkDeviceMemory memory; VkAccelerationStructureTypeKHR type; + bool is_dead; }; void radv_destroy_rra_accel_struct_data(VkDevice device, struct radv_rra_accel_struct_data *data); diff --git a/src/amd/vulkan/radv_rra.c b/src/amd/vulkan/radv_rra.c index 9fba6803248..eea035a2cfb 100644 --- a/src/amd/vulkan/radv_rra.c +++ b/src/amd/vulkan/radv_rra.c @@ -900,8 +900,8 @@ accel_struct_entry_cmp(const void *a, const void *b) { struct hash_entry *entry_a = *(struct hash_entry *const *)a; struct hash_entry *entry_b = *(struct hash_entry *const *)b; - const struct radv_acceleration_structure *s_a = entry_a->key; - const struct radv_acceleration_structure *s_b = entry_b->key; + const struct radv_rra_accel_struct_data *s_a = entry_a->data; + const struct radv_rra_accel_struct_data *s_b = entry_b->data; return s_a->va > s_b->va ? 1 : s_a->va < s_b->va ? -1 : 0; }