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. --- SConstruct | 1 + intern/cycles/kernel/CMakeLists.txt | 1 + intern/cycles/kernel/kernel_split.h | 23 +---------------------- intern/cycles/util/util_atomic.h | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 22 deletions(-) diff --git a/SConstruct b/SConstruct index 6cf3874b366..c5e1d660719 100644 --- a/SConstruct +++ b/SConstruct @@ -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') diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt index 13eb5ca1e71..3e16c4b5fd9 100644 --- a/intern/cycles/kernel/CMakeLists.txt +++ b/intern/cycles/kernel/CMakeLists.txt @@ -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 diff --git a/intern/cycles/kernel/kernel_split.h b/intern/cycles/kernel/kernel_split.h index eb386c2e5a7..52baf689305 100644 --- a/intern/cycles/kernel/kernel_split.h +++ b/intern/cycles/kernel/kernel_split.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" 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