From 5a9f200f9450dff91085527f5fae48b105e4ff04 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 15 Nov 2024 14:59:20 +0000 Subject: [PATCH] Track when GPU work for build inputs has completed --- .../driver/d3d12/d3d12_command_list4_wrap.cpp | 15 ++++++++++++--- renderdoc/driver/d3d12/d3d12_manager.h | 6 ++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_command_list4_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_list4_wrap.cpp index 35fcc47ef..27ca01225 100644 --- a/renderdoc/driver/d3d12/d3d12_command_list4_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_list4_wrap.cpp @@ -1211,10 +1211,19 @@ void WrappedID3D12GraphicsCommandList::BuildRaytracingAccelerationStructure( return ProcessASBuildAfterSubmission(asbWrappedResourceId, asbWrappedResourceBufferOffset, dstASId, type, byteSize, buildData); }, + [buildData]() { buildData->Release(); }); + + // add a ref for the lambda below which tracks when it's ready for readback + buildData->AddRef(); + + AddSubmissionASBuildCallback( + true, [buildData]() { - if(buildData) - buildData->Release(); - }); + buildData->MarkWorkComplete(); + buildData->Release(); + return true; + }, + [buildData]() { buildData->Release(); }); // an indirect AS build will pull in buffers we can't know about if(pDesc->Inputs.Type == D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL) diff --git a/renderdoc/driver/d3d12/d3d12_manager.h b/renderdoc/driver/d3d12/d3d12_manager.h index 2dfad6878..306049b9d 100644 --- a/renderdoc/driver/d3d12/d3d12_manager.h +++ b/renderdoc/driver/d3d12/d3d12_manager.h @@ -1125,6 +1125,9 @@ struct ASBuildData // geometry GPU addresses have been de-based to contain only offsets rdcarray geoms; + void MarkWorkComplete() { complete = true; } + bool IsWorkComplete() const { return complete; } + void AddRef(); void Release(); @@ -1147,6 +1150,9 @@ private: // timestamp this build data was recorded on double timestamp = 0; + // has the GPU work for this build data finished and synchronised? + bool complete = false; + // how many bytes of overhead are currently present, due to copying with strided vertex/AABB data uint64_t bytesOverhead = 0;