From 390c4b337aa7b4a4efda259a0eba14d553ee2363 Mon Sep 17 00:00:00 2001 From: Tatsuyuki Ishi Date: Fri, 18 Nov 2022 15:59:50 +0900 Subject: [PATCH] radv: Support accelerationStructureCaptureReplay. The address itself was already stable assuming that the memory itself was allocated with capture/replay. Enable the feature flag and add an equality check to return VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR on mismatch. Tested with: - dEQP-VK.ray_tracing_pipeline.capture_replay.* - q2rtx gfxrecon replays correctly without major errors. * There are debug logs about VkBuffers missing opaque address for unknown reason, however the AS part is confirmed to be correctly captured. Part-of: --- src/amd/vulkan/radv_acceleration_structure.c | 10 ++++++++-- src/amd/vulkan/radv_device.c | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/amd/vulkan/radv_acceleration_structure.c b/src/amd/vulkan/radv_acceleration_structure.c index b6449a1..6ecd5fe 100644 --- a/src/amd/vulkan/radv_acceleration_structure.c +++ b/src/amd/vulkan/radv_acceleration_structure.c @@ -233,6 +233,12 @@ radv_CreateAccelerationStructureKHR(VkDevice _device, RADV_FROM_HANDLE(radv_device, device, _device); RADV_FROM_HANDLE(radv_buffer, buffer, pCreateInfo->buffer); struct radv_acceleration_structure *accel; + uint64_t mem_offset, va; + + mem_offset = buffer->offset + pCreateInfo->offset; + va = radv_buffer_get_va(buffer->bo) + mem_offset; + if (pCreateInfo->deviceAddress && va != pCreateInfo->deviceAddress) + return vk_error(device, VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR); accel = vk_alloc2(&device->vk.alloc, pAllocator, sizeof(*accel), 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); @@ -241,10 +247,10 @@ radv_CreateAccelerationStructureKHR(VkDevice _device, vk_object_base_init(&device->vk, &accel->base, VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR); - accel->mem_offset = buffer->offset + pCreateInfo->offset; + accel->mem_offset = mem_offset; accel->size = pCreateInfo->size; accel->bo = buffer->bo; - accel->va = radv_buffer_get_va(accel->bo) + accel->mem_offset; + accel->va = va; accel->type = pCreateInfo->type; *pAccelerationStructure = radv_acceleration_structure_to_handle(accel); diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index d8c87c3..a909ac5 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -1699,7 +1699,7 @@ radv_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, VkPhysicalDeviceAccelerationStructureFeaturesKHR *features = (VkPhysicalDeviceAccelerationStructureFeaturesKHR *)ext; features->accelerationStructure = true; - features->accelerationStructureCaptureReplay = false; + features->accelerationStructureCaptureReplay = true; features->accelerationStructureIndirectBuild = false; features->accelerationStructureHostCommands = false; features->descriptorBindingAccelerationStructureUpdateAfterBind = true; -- 2.7.4