forked from bartvdbraak/blender
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:
parent
e37c4e5819
commit
329f704601
@ -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__ */
|
||||
|
Loading…
Reference in New Issue
Block a user