vkd3d: Add vkd3d_atomic_uint32_{dec, inc}rement helper

Signed-off-by: Joshua Ashton <joshua@froggi.es>
This commit is contained in:
Joshua Ashton 2020-06-24 10:56:30 +01:00
parent 102c2df4a4
commit d2a35008d8
1 changed files with 18 additions and 4 deletions

View File

@ -93,6 +93,20 @@ FORCEINLINE uint32_t vkd3d_atomic_uint32_exchange_explicit(uint32_t *target, uin
return result;
}
FORCEINLINE uint32_t vkd3d_atomic_uint32_increment(uint32_t *target, vkd3d_memory_order order)
{
uint32_t result;
vkd3d_atomic_choose_intrinsic(order, result, InterlockedIncrement, (LONG*)target);
return result;
}
FORCEINLINE uint32_t vkd3d_atomic_uint32_decrement(uint32_t *target, vkd3d_memory_order order)
{
uint32_t result;
vkd3d_atomic_choose_intrinsic(order, result, InterlockedDecrement, (LONG*)target);
return result;
}
#elif defined(__GNUC__) || defined(__clang__)
#define vkd3d_memory_order_relaxed __ATOMIC_RELAXED
@ -105,12 +119,12 @@ FORCEINLINE uint32_t vkd3d_atomic_uint32_exchange_explicit(uint32_t *target, uin
# define vkd3d_atomic_uint32_load_explicit(target, order) __atomic_load_n(target, order)
# define vkd3d_atomic_uint32_store_explicit(target, value, order) __atomic_store_n(target, value, order)
# define vkd3d_atomic_uint32_exchange_explicit(target, value, order) __atomic_exchange_n(target, value, order)
# define vkd3d_atomic_uint32_increment(target, order) __atomic_add_fetch(target, 1, order)
# define vkd3d_atomic_uint32_decrement(target, order) __atomic_sub_fetch(target, 1, order)
# ifndef __MINGW32__
/* Unfortunately only fetch_add is in stdatomic
* so use the common GCC extensions for these. */
# define InterlockedIncrement(target) __atomic_add_fetch(target, 1, vkd3d_memory_order_seq_cst)
# define InterlockedDecrement(target) __atomic_sub_fetch(target, 1, vkd3d_memory_order_seq_cst)
# define InterlockedIncrement(target) vkd3d_atomic_uint32_increment(target, vkd3d_memory_order_seq_cst)
# define InterlockedDecrement(target) vkd3d_atomic_uint32_decrement(target, vkd3d_memory_order_seq_cst)
# endif
#else