From ba213c1fa002ba44e6808ad1f82b7b1b0f7315e7 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 14 Mar 2020 11:01:53 +0100 Subject: [PATCH] [dxvk] Factor out waiting for resource to become idle And use the new generic spin function to reduce syscall spam. --- src/d3d11/d3d11_context_imm.cpp | 3 +-- src/d3d9/d3d9_device.cpp | 3 +-- src/dxvk/dxvk_resource.h | 13 +++++++++++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/d3d11/d3d11_context_imm.cpp b/src/d3d11/d3d11_context_imm.cpp index a0a1f9229..a0c5ff099 100644 --- a/src/d3d11/d3d11_context_imm.cpp +++ b/src/d3d11/d3d11_context_imm.cpp @@ -616,8 +616,7 @@ namespace dxvk { Flush(); SynchronizeCsThread(); - while (Resource->isInUse(access)) - dxvk::this_thread::yield(); + Resource->waitIdle(access); } } diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp index 36acae6e2..a90eb7b5d 100644 --- a/src/d3d9/d3d9_device.cpp +++ b/src/d3d9/d3d9_device.cpp @@ -3779,8 +3779,7 @@ namespace dxvk { Flush(); SynchronizeCsThread(); - while (Resource->isInUse(access)) - dxvk::this_thread::yield(); + Resource->waitIdle(access); } } diff --git a/src/dxvk/dxvk_resource.h b/src/dxvk/dxvk_resource.h index 12210c665..9a73ed818 100644 --- a/src/dxvk/dxvk_resource.h +++ b/src/dxvk/dxvk_resource.h @@ -69,6 +69,19 @@ namespace dxvk { : m_useCountW) -= 1; } } + + /** + * \brief Waits for resource to become unused + * + * Blocks calling thread until the GPU finishes + * using the resource with the given access type. + * \param [in] access Access type to check for + */ + void waitIdle(DxvkAccess access = DxvkAccess::Read) const { + sync::spin(50000, [this, access] { + return !isInUse(access); + }); + } private: