mirror of
https://github.com/doitsujin/dxvk.git
synced 2024-12-14 09:23:53 +01:00
41 lines
769 B
C++
41 lines
769 B
C++
|
#include "d3d9_device.h"
|
||
|
|
||
|
namespace dxvk {
|
||
|
|
||
|
void D3D9DeviceMutex::lock() {
|
||
|
while (!try_lock())
|
||
|
dxvk::this_thread::yield();
|
||
|
}
|
||
|
|
||
|
|
||
|
void D3D9DeviceMutex::unlock() {
|
||
|
if (likely(m_counter == 0))
|
||
|
m_owner.store(0, std::memory_order_release);
|
||
|
else
|
||
|
m_counter -= 1;
|
||
|
}
|
||
|
|
||
|
|
||
|
bool D3D9DeviceMutex::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;
|
||
|
}
|
||
|
|
||
|
|
||
|
D3D9Multithread::D3D9Multithread(
|
||
|
BOOL Protected)
|
||
|
: m_protected( Protected ) { }
|
||
|
|
||
|
}
|