diff options
Diffstat (limited to 'intern/cycles/kernel/geom')
-rw-r--r-- | intern/cycles/kernel/geom/geom_object.h | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/intern/cycles/kernel/geom/geom_object.h b/intern/cycles/kernel/geom/geom_object.h index c2ec774362a..0e0932512e9 100644 --- a/intern/cycles/kernel/geom/geom_object.h +++ b/intern/cycles/kernel/geom/geom_object.h @@ -376,15 +376,32 @@ ccl_device float3 particle_angular_velocity(KernelGlobals *kg, int particle) ccl_device_inline float3 bvh_clamp_direction(float3 dir) { /* clamp absolute values by exp2f(-80.0f) to avoid division by zero when calculating inverse direction */ - float ooeps = 8.271806E-25f; +#if defined(__KERNEL_SSE__) && defined(__KERNEL_SSE2__) + const ssef oopes(8.271806E-25f,8.271806E-25f,8.271806E-25f,0.0f); + const ssef mask = _mm_cmpgt_ps(fabs(dir),oopes); + const ssef signdir = signmsk(dir.m128) | oopes; +# ifndef __KERNEL_AVX__ + ssef res = mask & dir; + res = _mm_or_ps(res,_mm_andnot_ps(mask, signdir)); +# else + ssef res = _mm_blendv_ps(signdir,dir,mask); +# endif + return float3(res); +#else /* __KERNEL_SSE__ && __KERNEL_SSE2__ */ + const float ooeps = 8.271806E-25f; return make_float3((fabsf(dir.x) > ooeps)? dir.x: copysignf(ooeps, dir.x), (fabsf(dir.y) > ooeps)? dir.y: copysignf(ooeps, dir.y), (fabsf(dir.z) > ooeps)? dir.z: copysignf(ooeps, dir.z)); +#endif /* __KERNEL_SSE__ && __KERNEL_SSE2__ */ } ccl_device_inline float3 bvh_inverse_direction(float3 dir) { +#ifdef __KERNEL_SSE__ + return rcp(dir); +#else return 1.0f / dir; +#endif } /* Transform ray into object space to enter static object in BVH */ |