From 329f7046011fa23387649d68d5d2b26629f1d32d Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 21 May 2015 15:48:50 +0500 Subject: Cycles: Move utility atomics function to util_atomic.h No functional changes, just better to keep all atomic function in a single place, they might become handy later. --- intern/cycles/util/util_atomic.h | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'intern/cycles/util') diff --git a/intern/cycles/util/util_atomic.h b/intern/cycles/util/util_atomic.h index fa0d35e1034..85a82d38275 100644 --- a/intern/cycles/util/util_atomic.h +++ b/intern/cycles/util/util_atomic.h @@ -17,6 +17,8 @@ #ifndef __UTIL_ATOMIC_H__ #define __UTIL_ATOMIC_H__ +#ifndef __KERNEL_GPU__ + /* Using atomic ops header from Blender. */ #include "atomic_ops.h" @@ -30,4 +32,34 @@ ATOMIC_INLINE void atomic_update_max_z(size_t *maximum_value, size_t value) } } +#else /* __KERNEL_GPU__ */ + +#ifdef __KERNEL_OPENCL__ + +/* Float atomics implementation credits: + * http://suhorukov.blogspot.in/2011/12/opencl-11-atomic-operations-on-floating.html + */ +ccl_device_inline void atomic_add_float(volatile ccl_global float *source, + const float operand) +{ + union { + unsigned int int_value; + float float_value; + } new_value; + union { + unsigned int int_value; + float float_value; + } prev_value; + do { + prev_value.float_value = *source; + new_value.float_value = prev_value.float_value + operand; + } while (atomic_cmpxchg((volatile ccl_global unsigned int *)source, + prev_value.int_value, + new_value.int_value) != prev_value.int_value); +} + +#endif /* __KERNEL_OPENCL__ */ + +#endif /* __KERNEL_GPU__ */ + #endif /* __UTIL_ATOMIC_H__ */ -- cgit v1.2.3