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