@@ -3797,6 +3797,13 @@ For global atomics, only atomic swap is available for these types:
|
||||
float atomic_swap_global(uniform float * uniform ptr, float value)
|
||||
double atomic_swap_global(uniform double * uniform ptr, double value)
|
||||
|
||||
Finally, "swap" (but none of these other atomics) is available for pointer
|
||||
types:
|
||||
|
||||
::
|
||||
|
||||
void *atomic_swap_{local,global}(void * * uniform ptr, void * value)
|
||||
|
||||
There are also variants of the atomic that take ``uniform`` values for the
|
||||
operand and return a ``uniform`` result. These correspond to a single
|
||||
atomic operation being performed for the entire gang of program instances,
|
||||
@@ -3821,6 +3828,13 @@ rather than one per program instance.
|
||||
uniform int32 atomic_swap_{local,global}(uniform int32 * uniform ptr,
|
||||
uniform int32 newval)
|
||||
|
||||
And similarly for pointers:
|
||||
|
||||
::
|
||||
|
||||
uniform void *atomic_swap_{local,global}(void * * uniform ptr,
|
||||
void *newval)
|
||||
|
||||
Be careful that you use the atomic function that you mean to; consider the
|
||||
following code:
|
||||
|
||||
@@ -3862,12 +3876,18 @@ the same location in memory!)
|
||||
int32 atomic_xor_{local,global}(uniform int32 * varying ptr, int32 value)
|
||||
int32 atomic_swap_{local,global}(uniform int32 * varying ptr, int32 value)
|
||||
|
||||
And:
|
||||
|
||||
::
|
||||
|
||||
void *atomic_swap_{local,global}(void * * ptr, void *value)
|
||||
|
||||
There are also atomic "compare and exchange" functions. Compare and
|
||||
exchange atomically compares the value in "val" to "compare"--if they
|
||||
match, it assigns "newval" to "val". In either case, the old value of
|
||||
"val" is returned. (As with the other atomic operations, there are also
|
||||
``unsigned`` and 64-bit variants of this function. Furthermore, there are
|
||||
``float`` and ``double`` variants as well.)
|
||||
``float``, ``double``, and ``void *`` variants as well.)
|
||||
|
||||
::
|
||||
|
||||
|
||||
Reference in New Issue
Block a user