From 0beb18ef739fbfcc89aa8cf5ba926b45100a6c95 Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Sat, 16 Mar 2024 19:11:11 +0000 Subject: [PATCH] [d3d9] Wait for submission when calling ReturnUnderlyingResource --- src/d3d9/d3d9_device.cpp | 27 +++++++++++++++++++++++---- src/d3d9/d3d9_device.h | 6 ++++++ src/d3d9/d3d9_on_12.cpp | 2 +- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp index 21e81173..e99ad383 100644 --- a/src/d3d9/d3d9_device.cpp +++ b/src/d3d9/d3d9_device.cpp @@ -5672,10 +5672,13 @@ namespace dxvk { } - - void D3D9DeviceEx::Flush() { + template + void D3D9DeviceEx::ExecuteFlush() { D3D9DeviceLock lock = LockDevice(); + if constexpr (Synchronize9On12) + m_submitStatus.result = VK_NOT_READY; + m_initializer->Flush(); m_converter->Flush(); @@ -5687,16 +5690,32 @@ namespace dxvk { EmitCs([ cSubmissionFence = m_submissionFence, - cSubmissionId = submissionId + cSubmissionId = submissionId, + cSubmissionStatus = Synchronize9On12 ? &m_submitStatus : nullptr ] (DxvkContext* ctx) { ctx->signal(cSubmissionFence, cSubmissionId); - ctx->flushCommandList(nullptr); + ctx->flushCommandList(cSubmissionStatus); }); FlushCsChunk(); m_flushSeqNum = m_csSeqNum; m_flushTracker.notifyFlush(m_flushSeqNum, submissionId); + + // If necessary, block calling thread until the + // Vulkan queue submission is performed. + if constexpr (Synchronize9On12) + m_dxvkDevice->waitForSubmission(&m_submitStatus); + } + + + void D3D9DeviceEx::Flush() { + ExecuteFlush(); + } + + + void D3D9DeviceEx::FlushAndSync9On12() { + ExecuteFlush(); } diff --git a/src/d3d9/d3d9_device.h b/src/d3d9/d3d9_device.h index 90beb034..114a0b9b 100644 --- a/src/d3d9/d3d9_device.h +++ b/src/d3d9/d3d9_device.h @@ -793,6 +793,7 @@ namespace dxvk { void SynchronizeCsThread(uint64_t SequenceNumber); void Flush(); + void FlushAndSync9On12(); void EndFrame(); @@ -1059,6 +1060,9 @@ namespace dxvk { return std::exchange(m_deviceHasBeenReset, false); } + template + void ExecuteFlush(); + void DetermineConstantLayouts(bool canSWVP); D3D9BufferSlice AllocUPBuffer(VkDeviceSize size); @@ -1421,6 +1425,8 @@ namespace dxvk { Rc m_submissionFence; uint64_t m_submissionId = 0ull; + DxvkSubmitStatus m_submitStatus; + uint64_t m_flushSeqNum = 0ull; GpuFlushTracker m_flushTracker; diff --git a/src/d3d9/d3d9_on_12.cpp b/src/d3d9/d3d9_on_12.cpp index 2f9c9c44..a0ec4398 100644 --- a/src/d3d9/d3d9_on_12.cpp +++ b/src/d3d9/d3d9_on_12.cpp @@ -33,7 +33,7 @@ namespace dxvk { if (num_sync) Logger::err("D3D9On12::GetD3D12Device: ReturnUnderlyingResource: Stub"); - m_device->Flush(); + m_device->FlushAndSync9On12(); return S_OK; }