diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-12-02 18:26:28 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-12-02 18:26:28 +0400 |
commit | efe4ea284abb33bbc0ab99e636decd3195c0e333 (patch) | |
tree | 7bf6b3fa602b7fdf5b911ef3e650d1779be0684d /intern/cycles/kernel/kernel_bvh.h | |
parent | 1f96a120f6c7bb34a20e524cdd51b151f61c4b75 (diff) |
Cycles:
* Fix broken compile of test app.
* Fix some warnings compiling with gcc for 32 bit.
* More tweaks to avoid extended precision issue from #29301.
Diffstat (limited to 'intern/cycles/kernel/kernel_bvh.h')
-rw-r--r-- | intern/cycles/kernel/kernel_bvh.h | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/intern/cycles/kernel/kernel_bvh.h b/intern/cycles/kernel/kernel_bvh.h index 04150b7ea90..35215fd0f9f 100644 --- a/intern/cycles/kernel/kernel_bvh.h +++ b/intern/cycles/kernel/kernel_bvh.h @@ -33,6 +33,15 @@ CCL_NAMESPACE_BEGIN #define BVH_NODE_SIZE 4 #define TRI_NODE_SIZE 3 +/* silly workaround for float extended precision that happens when compiling + without sse support on x86, it results in different results for float ops + that you would otherwise expect to compare correctly */ +#if !defined(__i386__) || defined(__SSE__) +#define NO_EXTENDED_PRECISION +#else +#define NO_EXTENDED_PRECISION volatile +#endif + __device_inline float3 bvh_inverse_direction(float3 dir) { /* avoid divide by zero (ooeps = exp2f(-80.0f)) */ @@ -94,8 +103,8 @@ __device_inline void bvh_node_intersect(KernelGlobals *kg, float c0hiy = n0xy.w * idir.y - ood.y; float c0loz = nz.x * idir.z - ood.z; float c0hiz = nz.y * idir.z - ood.z; - float c0min = max4(min(c0lox, c0hix), min(c0loy, c0hiy), min(c0loz, c0hiz), 0.0f); - float c0max = min4(max(c0lox, c0hix), max(c0loy, c0hiy), max(c0loz, c0hiz), t); + NO_EXTENDED_PRECISION float c0min = max4(min(c0lox, c0hix), min(c0loy, c0hiy), min(c0loz, c0hiz), 0.0f); + NO_EXTENDED_PRECISION float c0max = min4(max(c0lox, c0hix), max(c0loy, c0hiy), max(c0loz, c0hiz), t); float c1loz = nz.z * idir.z - ood.z; float c1hiz = nz.w * idir.z - ood.z; @@ -103,8 +112,8 @@ __device_inline void bvh_node_intersect(KernelGlobals *kg, float c1hix = n1xy.y * idir.x - ood.x; float c1loy = n1xy.z * idir.y - ood.y; float c1hiy = n1xy.w * idir.y - ood.y; - float c1min = max4(min(c1lox, c1hix), min(c1loy, c1hiy), min(c1loz, c1hiz), 0.0f); - float c1max = min4(max(c1lox, c1hix), max(c1loy, c1hiy), max(c1loz, c1hiz), t); + NO_EXTENDED_PRECISION float c1min = max4(min(c1lox, c1hix), min(c1loy, c1hiy), min(c1loz, c1hiz), 0.0f); + NO_EXTENDED_PRECISION float c1max = min4(max(c1lox, c1hix), max(c1loy, c1hiy), max(c1loz, c1hiz), t); /* decide which nodes to traverse next */ #ifdef __VISIBILITY_FLAG__ |