vkd3d: Unify _mm_pause detection.
Signed-off-by: Georg Lehmann <dadschoorse@gmail.com>
This commit is contained in:
parent
c7eb6fdf61
commit
21dabb315d
|
@ -30,9 +30,7 @@ static inline void rw_spinlock_acquire_read(spinlock_t *spinlock)
|
||||||
uint32_t count = vkd3d_atomic_uint32_add(spinlock, VKD3D_RW_SPINLOCK_READ, vkd3d_memory_order_acquire);
|
uint32_t count = vkd3d_atomic_uint32_add(spinlock, VKD3D_RW_SPINLOCK_READ, vkd3d_memory_order_acquire);
|
||||||
while (count & VKD3D_RW_SPINLOCK_WRITE)
|
while (count & VKD3D_RW_SPINLOCK_WRITE)
|
||||||
{
|
{
|
||||||
#ifdef __SSE2__
|
vkd3d_pause();
|
||||||
_mm_pause();
|
|
||||||
#endif
|
|
||||||
count = vkd3d_atomic_uint32_load_explicit(spinlock, vkd3d_memory_order_acquire);
|
count = vkd3d_atomic_uint32_load_explicit(spinlock, vkd3d_memory_order_acquire);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,9 +47,7 @@ static inline void rw_spinlock_acquire_write(spinlock_t *spinlock)
|
||||||
VKD3D_RW_SPINLOCK_IDLE, VKD3D_RW_SPINLOCK_WRITE,
|
VKD3D_RW_SPINLOCK_IDLE, VKD3D_RW_SPINLOCK_WRITE,
|
||||||
vkd3d_memory_order_acquire, vkd3d_memory_order_relaxed) != VKD3D_RW_SPINLOCK_IDLE)
|
vkd3d_memory_order_acquire, vkd3d_memory_order_relaxed) != VKD3D_RW_SPINLOCK_IDLE)
|
||||||
{
|
{
|
||||||
#ifdef __SSE2__
|
vkd3d_pause();
|
||||||
_mm_pause();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,13 @@
|
||||||
#include <emmintrin.h>
|
#include <emmintrin.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static inline void vkd3d_pause(void)
|
||||||
|
{
|
||||||
|
#ifdef __SSE2__
|
||||||
|
_mm_pause();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#define vkd3d_spinlock_try_lock(lock) \
|
#define vkd3d_spinlock_try_lock(lock) \
|
||||||
(!vkd3d_atomic_uint32_load_explicit(lock, vkd3d_memory_order_relaxed) && \
|
(!vkd3d_atomic_uint32_load_explicit(lock, vkd3d_memory_order_relaxed) && \
|
||||||
!vkd3d_atomic_uint32_exchange_explicit(lock, 1u, vkd3d_memory_order_acquire))
|
!vkd3d_atomic_uint32_exchange_explicit(lock, 1u, vkd3d_memory_order_acquire))
|
||||||
|
@ -49,11 +56,7 @@ static inline bool spinlock_try_acquire(spinlock_t *lock)
|
||||||
static inline void spinlock_acquire(spinlock_t *lock)
|
static inline void spinlock_acquire(spinlock_t *lock)
|
||||||
{
|
{
|
||||||
while (!spinlock_try_acquire(lock))
|
while (!spinlock_try_acquire(lock))
|
||||||
#ifdef __SSE2__
|
vkd3d_pause();
|
||||||
_mm_pause();
|
|
||||||
#else
|
|
||||||
continue;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void spinlock_release(spinlock_t *lock)
|
static inline void spinlock_release(spinlock_t *lock)
|
||||||
|
|
Loading…
Reference in New Issue