Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/cycles/kernel/geom')
-rw-r--r--intern/cycles/kernel/geom/geom_object.h19
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 */