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
path: root/intern
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2012-11-23 21:39:41 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2012-11-23 21:39:41 +0400
commit2a9b5e8f816c5c72280aa66c82c3d94b666149c0 (patch)
treeee418dc9969bef7527e81f6f164fce97f0c117e8 /intern
parentbb7fdc7935b8e909dfa10ec1dde654c6ce2f18a1 (diff)
Fix #33267: cycles math node power gave different results for CPU and GPU. The
GPU variants do not support pow(-1, 2), it doesn't check for even exponents, do manually now.
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/blender/blender_camera.cpp2
-rw-r--r--intern/cycles/kernel/svm/svm_hsv.h2
-rw-r--r--intern/cycles/kernel/svm/svm_math.h17
3 files changed, 18 insertions, 3 deletions
diff --git a/intern/cycles/blender/blender_camera.cpp b/intern/cycles/blender/blender_camera.cpp
index 447ca07a6ee..0cbd2a0291f 100644
--- a/intern/cycles/blender/blender_camera.cpp
+++ b/intern/cycles/blender/blender_camera.cpp
@@ -300,7 +300,7 @@ static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int
horizontal_fit = true;
sensor_size = bcam->sensor_width;
}
- else if(bcam->sensor_fit == BlenderCamera::VERTICAL) {
+ else { /* vertical */
horizontal_fit = false;
sensor_size = bcam->sensor_height;
}
diff --git a/intern/cycles/kernel/svm/svm_hsv.h b/intern/cycles/kernel/svm/svm_hsv.h
index bce11d62923..26b6141ee3f 100644
--- a/intern/cycles/kernel/svm/svm_hsv.h
+++ b/intern/cycles/kernel/svm/svm_hsv.h
@@ -110,7 +110,7 @@ __device void svm_node_hsv(KernelGlobals *kg, ShaderData *sd, float *stack, uint
color = rgb_to_hsv(color);
- // remember: fmod doesn't work for negative numbers
+ /* remember: fmod doesn't work for negative numbers here */
color.x += hue + 0.5f;
color.x = fmod(color.x, 1.0f);
color.y *= sat;
diff --git a/intern/cycles/kernel/svm/svm_math.h b/intern/cycles/kernel/svm/svm_math.h
index e39c7a4ba6c..db3b8d3f763 100644
--- a/intern/cycles/kernel/svm/svm_math.h
+++ b/intern/cycles/kernel/svm/svm_math.h
@@ -38,6 +38,21 @@ __device float safe_acosf(float a)
return acosf(a);
}
+__device float compatible_powf(float x, float y)
+{
+ /* GPU pow doesn't accept negative x, do manual checks here */
+ if(x < 0.0f) {
+ if(fmod(-y, 2.0f) == 0.0f)
+ return powf(-x, y);
+ else
+ return -powf(-x, y);
+ }
+ else if(x == 0.0f)
+ return 0.0f;
+
+ return powf(x, y);
+}
+
__device float safe_powf(float a, float b)
{
if(b == 0.0f)
@@ -47,7 +62,7 @@ __device float safe_powf(float a, float b)
if(a < 0.0f && b != (int)b)
return 0.0f;
- return powf(a, b);
+ return compatible_powf(a, b);
}
__device float safe_logf(float a, float b)