1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2024-12-13 16:08:50 +01:00
dxvk/src/d3d10/d3d10_multithread.cpp
2018-11-30 11:37:57 +01:00

90 lines
1.7 KiB
C++

#include "d3d10_device.h"
namespace dxvk {
void D3D10DeviceMutex::lock() {
while (!try_lock())
dxvk::this_thread::yield();
}
void D3D10DeviceMutex::unlock() {
if (likely(m_counter == 0))
m_owner.store(0, std::memory_order_release);
else
m_counter -= 1;
}
bool D3D10DeviceMutex::try_lock() {
uint32_t threadId = GetCurrentThreadId();
uint32_t expected = 0;
bool status = m_owner.compare_exchange_weak(
expected, threadId, std::memory_order_acquire);
if (status)
return true;
if (expected != threadId)
return false;
m_counter += 1;
return true;
}
D3D10Multithread::D3D10Multithread(
IUnknown* pParent,
BOOL Protected)
: m_parent (pParent),
m_protected (Protected) {
}
D3D10Multithread::~D3D10Multithread() {
}
ULONG STDMETHODCALLTYPE D3D10Multithread::AddRef() {
return m_parent->AddRef();
}
ULONG STDMETHODCALLTYPE D3D10Multithread::Release() {
return m_parent->Release();
}
HRESULT STDMETHODCALLTYPE D3D10Multithread::QueryInterface(
REFIID riid,
void** ppvObject) {
return m_parent->QueryInterface(riid, ppvObject);
}
void STDMETHODCALLTYPE D3D10Multithread::Enter() {
if (m_protected)
m_mutex.lock();
}
void STDMETHODCALLTYPE D3D10Multithread::Leave() {
if (m_protected)
m_mutex.unlock();
}
BOOL STDMETHODCALLTYPE D3D10Multithread::SetMultithreadProtected(
BOOL bMTProtect) {
return std::exchange(m_protected, bMTProtect);
}
BOOL STDMETHODCALLTYPE D3D10Multithread::GetMultithreadProtected() {
return m_protected;
}
}