diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-04-15 16:29:12 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-04-15 16:30:30 +0300 |
commit | 3165e8740b83f28569a9e405757f4c34c378df3b (patch) | |
tree | 35cf95b439c7b7f1b63380659b9971ea4868a017 | |
parent | 177d051126b3ea4a1dec6a016ae67d7f51f233d0 (diff) |
Fix T48139: Checker texture strange behavior in cycles
Seems particular CUDA implementations has some precision issues,
which made integer coordinate (which was expected to always be
positive) to go negative.
-rw-r--r-- | intern/cycles/kernel/svm/svm_checker.h | 6 | ||||
-rw-r--r-- | intern/cycles/util/util_math.h | 5 |
2 files changed, 8 insertions, 3 deletions
diff --git a/intern/cycles/kernel/svm/svm_checker.h b/intern/cycles/kernel/svm/svm_checker.h index 186bf7df55f..cea245991de 100644 --- a/intern/cycles/kernel/svm/svm_checker.h +++ b/intern/cycles/kernel/svm/svm_checker.h @@ -25,9 +25,9 @@ ccl_device_noinline float svm_checker(float3 p) p.y = (p.y + 0.000001f)*0.999999f; p.z = (p.z + 0.000001f)*0.999999f; - int xi = float_to_int(fabsf(floorf(p.x))); - int yi = float_to_int(fabsf(floorf(p.y))); - int zi = float_to_int(fabsf(floorf(p.z))); + int xi = abs(float_to_int(floorf(p.x))); + int yi = abs(float_to_int(floorf(p.y))); + int zi = abs(float_to_int(floorf(p.z))); return ((xi % 2 == yi % 2) == (zi % 2))? 1.0f: 0.0f; } diff --git a/intern/cycles/util/util_math.h b/intern/cycles/util/util_math.h index cdbc37fd32c..32924f9a8c2 100644 --- a/intern/cycles/util/util_math.h +++ b/intern/cycles/util/util_math.h @@ -97,6 +97,11 @@ ccl_device_inline float fminf(float a, float b) #ifndef __KERNEL_GPU__ +ccl_device_inline int abs(int x) +{ + return (x > 0)? x: -x; +} + ccl_device_inline int max(int a, int b) { return (a > b)? a: b; |