Fix T48139: Checker texture strange behavior in cycles
authorSergey Sharybin <sergey.vfx@gmail.com>
Fri, 15 Apr 2016 13:29:12 +0000 (15:29 +0200)
committerSergey Sharybin <sergey.vfx@gmail.com>
Fri, 15 Apr 2016 13:30:30 +0000 (15:30 +0200)
Seems particular CUDA implementations has some precision issues,
which made integer coordinate (which was expected to always be
positive) to go negative.

intern/cycles/kernel/svm/svm_checker.h
intern/cycles/util/util_math.h

index 186bf7df55f00e0121d0ced6d028e2722dcf6d60..cea245991de16fbc2dff6f50179d8f934345bdee 100644 (file)
@@ -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;
 
        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;
 }
 
        return ((xi % 2 == yi % 2) == (zi % 2))? 1.0f: 0.0f;
 }
index cdbc37fd32cdb7353b7b1d77ff49c17ad36a1de4..32924f9a8c2682d139993555206c0e20cf240ffa 100644 (file)
@@ -97,6 +97,11 @@ ccl_device_inline float fminf(float a, float b)
 
 #ifndef __KERNEL_GPU__
 
 
 #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;
 ccl_device_inline int max(int a, int b)
 {
        return (a > b)? a: b;