summaryrefslogtreecommitdiff
path: root/opencl/random.cl
diff options
context:
space:
mode:
Diffstat (limited to 'opencl/random.cl')
-rw-r--r--opencl/random.cl184
1 files changed, 184 insertions, 0 deletions
diff --git a/opencl/random.cl b/opencl/random.cl
new file mode 100644
index 00000000..86b4b3b6
--- /dev/null
+++ b/opencl/random.cl
@@ -0,0 +1,184 @@
+/* This file is part of GEGL
+ *
+ * GEGL is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * GEGL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GEGL; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Copyright 2013 Carlos Zubieta (czubieta.dev@gmail.com)
+ */
+
+/* XXX: this file should be kept in sync with gegl-random. */
+#define XPRIME 103423
+#define YPRIME 101359
+#define NPRIME 101111
+
+#define RANDOM_DATA_SIZE (15083+15091+15101)
+#define PRIME_SIZE 533
+
+static inline int
+_gegl_cl_random_int (__global const int *cl_random_data,
+ __global const long *cl_random_primes,
+ int seed,
+ int x,
+ int y,
+ int z,
+ int n)
+{
+ unsigned long idx = x * XPRIME +
+ y * YPRIME * XPRIME +
+ n * NPRIME * YPRIME * XPRIME;
+#define ROUNDS 3
+ /* 3 rounds gives a reasonably high cycle for */
+ /* our synthesized larger random set. */
+ unsigned long seed_idx = seed % (PRIME_SIZE - 1 - ROUNDS);
+ int prime0 = convert_int(cl_random_primes[seed_idx]),
+ prime1 = convert_int(cl_random_primes[seed_idx+1]),
+ prime2 = convert_int(cl_random_primes[seed_idx+2]);
+ int r0 = cl_random_data[idx % prime0],
+ r1 = cl_random_data[prime0 + (idx % (prime1))],
+ r2 = cl_random_data[prime0 + prime1 + (idx % (prime2))];
+ return r0 ^ r1 ^ r2;
+}
+
+int
+gegl_cl_random_int (__global const int *cl_random_data,
+ __global const long *cl_random_primes,
+ int seed,
+ int x,
+ int y,
+ int z,
+ int n)
+{
+ return _gegl_cl_random_int (cl_random_data, cl_random_primes,
+ seed, x, y, z, n);
+}
+
+int
+gegl_cl_random_int_range (__global const int *cl_random_data,
+ __global const long *cl_random_primes,
+ int seed,
+ int x,
+ int y,
+ int z,
+ int n,
+ int min,
+ int max)
+{
+ int ret = _gegl_cl_random_int (cl_random_data, cl_random_primes,
+ seed, x, y, z, n);
+ return (ret % (max-min)) + min;
+}
+
+int4
+gegl_cl_random_int4 (__global const int *cl_random_data,
+ __global const long *cl_random_primes,
+ int seed,
+ int x,
+ int y,
+ int z,
+ int n)
+{
+ int r0 = _gegl_cl_random_int(cl_random_data, cl_random_primes,
+ seed, x, y, z, n);
+ int r1 = _gegl_cl_random_int(cl_random_data, cl_random_primes,
+ seed, x, y, z, n+1);
+ int r2 = _gegl_cl_random_int(cl_random_data, cl_random_primes,
+ seed, x, y, z, n+2);
+ int r3 = _gegl_cl_random_int(cl_random_data, cl_random_primes,
+ seed, x, y, z, n+3);
+ return (int4)(r0, r1, r2, r3);
+}
+
+int4
+gegl_cl_random_int4_range (__global const int *cl_random_data,
+ __global const long *cl_random_primes,
+ int seed,
+ int x,
+ int y,
+ int z,
+ int n,
+ int min,
+ int max)
+{
+ int4 ret = gegl_cl_random_int4 (cl_random_data, cl_random_primes,
+ seed, x, y, z, n);
+ return (ret % (max-min)) + min;
+}
+
+#define G_RAND_FLOAT_TRANSFORM 0.00001525902189669642175f
+
+float
+gegl_cl_random_float (__global const int *cl_random_data,
+ __global const long *cl_random_primes,
+ int seed,
+ int x,
+ int y,
+ int z,
+ int n)
+{
+ int u = _gegl_cl_random_int (cl_random_data, cl_random_primes,
+ seed, x, y, z, n);
+ return convert_float(u & 0xffff) * G_RAND_FLOAT_TRANSFORM;
+}
+
+float
+gegl_cl_random_float_range (__global const int *cl_random_data,
+ __global const long *cl_random_primes,
+ int seed,
+ int x,
+ int y,
+ int z,
+ int n,
+ float min,
+ float max)
+{
+ float f = gegl_cl_random_float (cl_random_data, cl_random_primes,
+ seed, x, y, z, n);
+ return f * (max - min) + min;
+}
+/*
+float4
+gegl_cl_random_float4 (__global const int *cl_random_data,
+ __global const long *cl_random_primes,
+ int seed,
+ int x,
+ int y,
+ int z,
+ int n)
+{
+ float r0 = gegl_cl_random_float(cl_random_data, cl_random_primes,
+ seed x, y, z, n);
+ float r1 = gegl_cl_random_float(cl_random_data, cl_random_primes,
+ seed x, y, z, n+1);
+ float r2 = gegl_cl_random_float(cl_random_data, cl_random_primes,
+ seed x, y, z, n+2);
+ float r3 = gegl_cl_random_float(cl_random_data, cl_random_primes,
+ seed x, y, z, n+3);
+ return (float4)(r0, r1, r2, r3);
+}
+
+float4
+gegl_cl_random_float4_range (__global const int *cl_random_data,
+ __global const long *cl_random_primes,
+ int seed,
+ int x,
+ int y,
+ int z,
+ int n,
+ float min,
+ float max)
+{
+ float4 f = gegl_cl_random_float4 (cl_random_data, cl_random_primes,
+ seed, x, y, z, n);
+ return f4 * (float4)((max - min) + min);
+}
+*/