From e549c9303b72794bd75fb01b4d4d9cb0d33e53e1 Mon Sep 17 00:00:00 2001
From: Philip Rebohle <philip.rebohle@tu-dortmund.de>
Date: Fri, 12 Oct 2018 18:36:02 +0200
Subject: [PATCH] [d3d10] Respect D3D10_CREATE_DEVICE_SINGLETHREADED flag

May improve performance in games which do not need the locking behaviour.
---
 src/d3d10/d3d10_device.cpp | 4 +++-
 src/d3d10/d3d10_device.h   | 6 +++++-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/d3d10/d3d10_device.cpp b/src/d3d10/d3d10_device.cpp
index 3b0eda31..dfd0bdd0 100644
--- a/src/d3d10/d3d10_device.cpp
+++ b/src/d3d10/d3d10_device.cpp
@@ -9,7 +9,9 @@ namespace dxvk {
           D3D11Device*                      pDevice,
           D3D11ImmediateContext*            pContext)
   : m_device(pDevice), m_context(pContext) {
-
+    // Respecting the single-threaded flag may improve performance
+    UINT flags = pDevice->GetCreationFlags();
+    m_threadSafe = !(flags & D3D10_CREATE_DEVICE_SINGLETHREADED);
   }
 
   
diff --git a/src/d3d10/d3d10_device.h b/src/d3d10/d3d10_device.h
index 5f49ca19..df9d50fd 100644
--- a/src/d3d10/d3d10_device.h
+++ b/src/d3d10/d3d10_device.h
@@ -474,7 +474,9 @@ namespace dxvk {
             UINT*                             pHeight);
     
     D3D10DeviceLock LockDevice() {
-      return D3D10DeviceLock(m_mutex);
+      return m_threadSafe
+        ? D3D10DeviceLock(m_mutex)
+        : D3D10DeviceLock();
     }
     
   private:
@@ -483,6 +485,8 @@ namespace dxvk {
     D3D11Device*            m_device;
     D3D11ImmediateContext*  m_context;
 
+    bool m_threadSafe = true;
+
   };
 
 }
\ No newline at end of file