Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/doitsujin/dxvk.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Kertels <robin.kertels@gmail.com>2023-11-15 18:51:30 +0300
committerPhilip Rebohle <25567304+doitsujin@users.noreply.github.com>2023-11-16 17:43:07 +0300
commitd998dee46e5848da23e7d2eb078845ffb5b73d65 (patch)
tree18dd13b5e9e3de1046d3899282b623b6f09ef444
parentea3149801f94e219163d91b0ab233340b0acec12 (diff)
[d3d11] Lock context in KeyedMutex::ReleaseSync
Co-authored-by: Yuxuan Shui <yshuiv7@gmail.com>
-rw-r--r--src/d3d11/d3d11_context_imm.h4
-rw-r--r--src/d3d11/d3d11_resource.cpp12
2 files changed, 15 insertions, 1 deletions
diff --git a/src/d3d11/d3d11_context_imm.h b/src/d3d11/d3d11_context_imm.h
index eb3ed88f..3e683250 100644
--- a/src/d3d11/d3d11_context_imm.h
+++ b/src/d3d11/d3d11_context_imm.h
@@ -89,6 +89,10 @@ namespace dxvk {
void SynchronizeCsThread(
uint64_t SequenceNumber);
+ D3D10Multithread& GetMultithread() {
+ return m_multithread;
+ }
+
D3D10DeviceLock LockContext() {
return m_multithread.AcquireLock();
}
diff --git a/src/d3d11/d3d11_resource.cpp b/src/d3d11/d3d11_resource.cpp
index db3c0f10..adc5b444 100644
--- a/src/d3d11/d3d11_resource.cpp
+++ b/src/d3d11/d3d11_resource.cpp
@@ -111,7 +111,17 @@ namespace dxvk {
D3D11CommonTexture* texture = GetCommonTexture(m_resource);
Rc<DxvkDevice> dxvkDevice = m_device->GetDXVKDevice();
- m_device->GetContext()->WaitForResource(texture->GetImage(), DxvkCsThread::SynchronizeAll, D3D11_MAP_READ_WRITE, 0);
+ {
+ D3D11ImmediateContext* context = m_device->GetContext();
+ D3D10Multithread& multithread = context->GetMultithread();
+ static bool s_errorShown = false;
+
+ if (!multithread.GetMultithreadProtected() && !std::exchange(s_errorShown, true))
+ Logger::warn("D3D11DXGIKeyedMutex::ReleaseSync: Called without context locking enabled.");
+
+ D3D10DeviceLock lock = context->LockContext();
+ context->WaitForResource(texture->GetImage(), DxvkCsThread::SynchronizeAll, D3D11_MAP_READ_WRITE, 0);
+ }
return dxvkDevice->vkd()->wine_vkReleaseKeyedMutex(dxvkDevice->handle(), texture->GetImage()->memory().memory(), Key) == VK_SUCCESS
? S_OK