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.
This commit is contained in:
Sergey Sharybin 2015-05-21 15:48:50 +05:00
parent e37c4e5819
commit 329f704601
4 changed files with 35 additions and 22 deletions

@ -1028,6 +1028,7 @@ if env['OURPLATFORM']!='darwin':
source.remove('shaders')
source.remove('osl')
source=['intern/cycles/kernel/'+s for s in source]
source.append('intern/cycles/util/util_atomic.h')
source.append('intern/cycles/util/util_color.h')
source.append('intern/cycles/util/util_half.h')
source.append('intern/cycles/util/util_math.h')

@ -154,6 +154,7 @@ set(SRC_GEOM_HEADERS
)
set(SRC_UTIL_HEADERS
../util/util_atomic.h
../util/util_color.h
../util/util_half.h
../util/util_math.h

@ -22,28 +22,7 @@
#include "kernel_types.h"
#include "kernel_globals.h"
/* atomic_add_float function should be defined prior to its usage in kernel_passes.h */
#if defined(__SPLIT_KERNEL__) && defined(__WORK_STEALING__)
/* Utility functions for float atomics */
/* float atomics impl 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 intVal;
float floatVal;
} newVal;
union {
unsigned int intVal;
float floatVal;
} prevVal;
do {
prevVal.floatVal = *source;
newVal.floatVal = prevVal.floatVal + operand;
} while (atomic_cmpxchg((volatile ccl_global unsigned int *)source, prevVal.intVal, newVal.intVal) != prevVal.intVal);
}
#endif // __SPLIT_KERNEL__ && __WORK_STEALING__
#include "util_atomic.h"
#ifdef __OSL__
#include "osl_shader.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__ */