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/kernel_jitter.h')
-rw-r--r--intern/cycles/kernel/kernel_jitter.h21
1 files changed, 16 insertions, 5 deletions
diff --git a/intern/cycles/kernel/kernel_jitter.h b/intern/cycles/kernel/kernel_jitter.h
index 67546131746..f5855757d3f 100644
--- a/intern/cycles/kernel/kernel_jitter.h
+++ b/intern/cycles/kernel/kernel_jitter.h
@@ -175,15 +175,26 @@ ccl_device float cmj_sample_1D(int s, int N, int p)
return (x + jx)*invN;
}
-ccl_device void cmj_sample_2D(int s, int N, int p, float *fx, float *fy)
+/* TODO(sergey): Do some extra tests and consider moving to util_math.h. */
+ccl_device_inline int cmj_isqrt(int value)
{
- kernel_assert(s < N);
-
#if defined(__KERNEL_CUDA__)
- int m = float_to_int(__fsqrt_ru(N));
+ return float_to_int(__fsqrt_ru(value));
+#elif defined(__KERNEL_GPU__)
+ return float_to_int(sqrtf(value));
#else
- int m = float_to_int(sqrtf(N));
+ /* This is a work around for fast-math on CPU which might replace sqrtf()
+ * with am approximated version.
+ */
+ return float_to_int(sqrtf(value) + 1e-6f);
#endif
+}
+
+ccl_device void cmj_sample_2D(int s, int N, int p, float *fx, float *fy)
+{
+ kernel_assert(s < N);
+
+ int m = cmj_isqrt(N);
int n = (N - 1)/m + 1;
float invN = 1.0f/N;
float invm = 1.0f/m;