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: