From adfcedff81d6a6b0e5918d02c5a58423ab79cbdd Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 27 Sep 2023 14:47:54 +0100 Subject: [PATCH] Sync any pending data uploads before any queue executes on D3D12 --- renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp | 2 ++ renderdoc/driver/d3d12/d3d12_device.cpp | 9 +++++++++ renderdoc/driver/d3d12/d3d12_device.h | 2 ++ 3 files changed, 13 insertions(+) diff --git a/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp index 16eba0ec3..03bae9a1d 100644 --- a/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp @@ -465,6 +465,8 @@ bool WrappedID3D12CommandQueue::Serialise_ExecuteCommandLists(SerialiserType &se { ID3D12CommandQueue *real = Unwrap(pQueue); + m_pDevice->DataUploadSync(); + if(m_PrevQueueId != GetResID(pQueue)) { RDCDEBUG("Previous queue execution was on queue %s, now executing %s, syncing GPU", diff --git a/renderdoc/driver/d3d12/d3d12_device.cpp b/renderdoc/driver/d3d12/d3d12_device.cpp index 7326007b6..9a998347a 100644 --- a/renderdoc/driver/d3d12/d3d12_device.cpp +++ b/renderdoc/driver/d3d12/d3d12_device.cpp @@ -3926,6 +3926,15 @@ void WrappedID3D12Device::DestroyInternalResources() CloseHandle(m_GPUSyncHandle); } +void WrappedID3D12Device::DataUploadSync() +{ + if(m_CurDataUpload >= 0) + { + GPUSync(); + m_CurDataUpload = 0; + } +} + void WrappedID3D12Device::GPUSync(ID3D12CommandQueue *queue, ID3D12Fence *fence) { m_GPUSyncCounter++; diff --git a/renderdoc/driver/d3d12/d3d12_device.h b/renderdoc/driver/d3d12/d3d12_device.h index c8d8739b1..285531b18 100644 --- a/renderdoc/driver/d3d12/d3d12_device.h +++ b/renderdoc/driver/d3d12/d3d12_device.h @@ -972,6 +972,8 @@ public: void ExecuteLists(WrappedID3D12CommandQueue *queue = NULL, bool InFrameCaptureBoundary = false); void FlushLists(bool forceSync = false, ID3D12CommandQueue *queue = NULL); + void DataUploadSync(); + void GPUSync(ID3D12CommandQueue *queue = NULL, ID3D12Fence *fence = NULL); void GPUSyncAllQueues();