blob: bd0b2a1e306c38df7c51e87d306c6c1fc0f4b4af [file] [log] [blame]
Stephen Hines5a470202013-05-29 15:36:18 -07001#include "rs_core.rsh"
Stephen Hines5a470202013-05-29 15:36:18 -07002#include "rs_structs.h"
3
David Grossdced5c92015-03-11 16:12:42 -07004#include "rsCpuCoreRuntime.h"
5
Stephen Hines5a470202013-05-29 15:36:18 -07006/* Function declarations from libRS */
7extern float4 __attribute__((overloadable)) convert_float4(uchar4 c);
8
9/* Implementation of Core Runtime */
10
Stephen Hines5a470202013-05-29 15:36:18 -070011extern float4 rsUnpackColor8888(uchar4 c)
12{
13 return convert_float4(c) * 0.003921569f;
14}
15
16
Jason Sams3ff0fe72014-05-19 15:06:59 -070017extern float __attribute__((overloadable)) rsClamp(float v, float l, float h) {
18 return clamp(v, l, h);
19}
20extern char __attribute__((overloadable)) rsClamp(char v, char l, char h) {
21 return clamp(v, l, h);
22}
23extern uchar __attribute__((overloadable)) rsClamp(uchar v, uchar l, uchar h) {
24 return clamp(v, l, h);
25}
26extern short __attribute__((overloadable)) rsClamp(short v, short l, short h) {
27 return clamp(v, l, h);
28}
29extern ushort __attribute__((overloadable)) rsClamp(ushort v, ushort l, ushort h) {
30 return clamp(v, l, h);
31}
32extern int __attribute__((overloadable)) rsClamp(int v, int l, int h) {
33 return clamp(v, l, h);
34}
35extern uint __attribute__((overloadable)) rsClamp(uint v, uint l, uint h) {
36 return clamp(v, l, h);
37}
38
Stephen Hines5a470202013-05-29 15:36:18 -070039extern int32_t __attribute__((overloadable)) rsAtomicCas(volatile int32_t *ptr, int32_t expectedValue, int32_t newValue) {
40 return __sync_val_compare_and_swap(ptr, expectedValue, newValue);
41}
42
43extern uint32_t __attribute__((overloadable)) rsAtomicCas(volatile uint32_t *ptr, uint32_t expectedValue, uint32_t newValue) {
Jason Sams8e1f8dc2014-03-03 18:15:47 -080044 return __sync_val_compare_and_swap(ptr, expectedValue, newValue);
Stephen Hines5a470202013-05-29 15:36:18 -070045}
46
47extern int32_t __attribute__((overloadable)) rsAtomicInc(volatile int32_t *ptr) {
48 return __sync_fetch_and_add(ptr, 1);
49}
50
Jason Sams8e1f8dc2014-03-03 18:15:47 -080051extern int32_t __attribute__((overloadable)) rsAtomicInc(volatile uint32_t *ptr) {
52 return __sync_fetch_and_add(ptr, 1);
53}
54
Stephen Hines5a470202013-05-29 15:36:18 -070055extern int32_t __attribute__((overloadable)) rsAtomicDec(volatile int32_t *ptr) {
56 return __sync_fetch_and_sub(ptr, 1);
57}
58
Jason Sams8e1f8dc2014-03-03 18:15:47 -080059extern int32_t __attribute__((overloadable)) rsAtomicDec(volatile uint32_t *ptr) {
60 return __sync_fetch_and_sub(ptr, 1);
61}
62
Stephen Hines5a470202013-05-29 15:36:18 -070063extern int32_t __attribute__((overloadable)) rsAtomicAdd(volatile int32_t *ptr, int32_t value) {
64 return __sync_fetch_and_add(ptr, value);
65}
66
Jason Sams8e1f8dc2014-03-03 18:15:47 -080067extern int32_t __attribute__((overloadable)) rsAtomicAdd(volatile uint32_t *ptr, uint32_t value) {
68 return __sync_fetch_and_add(ptr, value);
69}
70
Stephen Hines5a470202013-05-29 15:36:18 -070071extern int32_t __attribute__((overloadable)) rsAtomicSub(volatile int32_t *ptr, int32_t value) {
72 return __sync_fetch_and_sub(ptr, value);
73}
74
Jason Sams8e1f8dc2014-03-03 18:15:47 -080075extern int32_t __attribute__((overloadable)) rsAtomicSub(volatile uint32_t *ptr, uint32_t value) {
76 return __sync_fetch_and_sub(ptr, value);
77}
78
Stephen Hines5a470202013-05-29 15:36:18 -070079extern int32_t __attribute__((overloadable)) rsAtomicAnd(volatile int32_t *ptr, int32_t value) {
80 return __sync_fetch_and_and(ptr, value);
81}
82
Jason Sams8e1f8dc2014-03-03 18:15:47 -080083extern int32_t __attribute__((overloadable)) rsAtomicAnd(volatile uint32_t *ptr, uint32_t value) {
84 return __sync_fetch_and_and(ptr, value);
85}
86
Stephen Hines5a470202013-05-29 15:36:18 -070087extern int32_t __attribute__((overloadable)) rsAtomicOr(volatile int32_t *ptr, int32_t value) {
88 return __sync_fetch_and_or(ptr, value);
89}
90
Jason Sams8e1f8dc2014-03-03 18:15:47 -080091extern int32_t __attribute__((overloadable)) rsAtomicOr(volatile uint32_t *ptr, uint32_t value) {
92 return __sync_fetch_and_or(ptr, value);
93}
94
Stephen Hines5a470202013-05-29 15:36:18 -070095extern int32_t __attribute__((overloadable)) rsAtomicXor(volatile int32_t *ptr, int32_t value) {
96 return __sync_fetch_and_xor(ptr, value);
97}
98
Jason Sams8e1f8dc2014-03-03 18:15:47 -080099extern int32_t __attribute__((overloadable)) rsAtomicXor(volatile uint32_t *ptr, uint32_t value) {
100 return __sync_fetch_and_xor(ptr, value);
101}
102
Stephen Hines5a470202013-05-29 15:36:18 -0700103extern uint32_t __attribute__((overloadable)) min(uint32_t, uint32_t);
104extern int32_t __attribute__((overloadable)) min(int32_t, int32_t);
105extern uint32_t __attribute__((overloadable)) max(uint32_t, uint32_t);
106extern int32_t __attribute__((overloadable)) max(int32_t, int32_t);
107
108extern uint32_t __attribute__((overloadable)) rsAtomicMin(volatile uint32_t *ptr, uint32_t value) {
109 uint32_t prev, status;
110 do {
111 prev = *ptr;
112 uint32_t n = min(value, prev);
Jason Sams8e1f8dc2014-03-03 18:15:47 -0800113 status = __sync_val_compare_and_swap(ptr, prev, n);
Stephen Hines5a470202013-05-29 15:36:18 -0700114 } while (status != prev);
115 return prev;
116}
117
118extern int32_t __attribute__((overloadable)) rsAtomicMin(volatile int32_t *ptr, int32_t value) {
119 int32_t prev, status;
120 do {
121 prev = *ptr;
122 int32_t n = min(value, prev);
Jason Sams8e1f8dc2014-03-03 18:15:47 -0800123 status = __sync_val_compare_and_swap(ptr, prev, n);
Stephen Hines5a470202013-05-29 15:36:18 -0700124 } while (status != prev);
125 return prev;
126}
127
128extern uint32_t __attribute__((overloadable)) rsAtomicMax(volatile uint32_t *ptr, uint32_t value) {
129 uint32_t prev, status;
130 do {
131 prev = *ptr;
132 uint32_t n = max(value, prev);
Jason Sams8e1f8dc2014-03-03 18:15:47 -0800133 status = __sync_val_compare_and_swap(ptr, prev, n);
Stephen Hines5a470202013-05-29 15:36:18 -0700134 } while (status != prev);
135 return prev;
136}
137
138extern int32_t __attribute__((overloadable)) rsAtomicMax(volatile int32_t *ptr, int32_t value) {
139 int32_t prev, status;
140 do {
141 prev = *ptr;
142 int32_t n = max(value, prev);
Jason Sams8e1f8dc2014-03-03 18:15:47 -0800143 status = __sync_val_compare_and_swap(ptr, prev, n);
Stephen Hines5a470202013-05-29 15:36:18 -0700144 } while (status != prev);
145 return prev;
146}
147
148
149
150extern int32_t rand();
151#define RAND_MAX 0x7fffffff
152
153
154
155extern float __attribute__((overloadable)) rsRand(float min, float max);/* {
156 float r = (float)rand();
157 r /= RAND_MAX;
158 r = r * (max - min) + min;
159 return r;
160}
161*/
162
163extern float __attribute__((overloadable)) rsRand(float max) {
164 return rsRand(0.f, max);
165 //float r = (float)rand();
166 //r *= max;
167 //r /= RAND_MAX;
168 //return r;
169}
170
171extern int __attribute__((overloadable)) rsRand(int max) {
172 return (int)rsRand((float)max);
173}
174
175extern int __attribute__((overloadable)) rsRand(int min, int max) {
176 return (int)rsRand((float)min, (float)max);
177}
178
David Gross6a3c8f32015-03-17 11:09:20 -0700179extern uint32_t __attribute__((overloadable)) rsGetArray0(rs_kernel_context ctxt) {
180 return ((struct RsExpandKernelDriverInfo *)ctxt)->current.array[0];
181}
182
183extern uint32_t __attribute__((overloadable)) rsGetArray1(rs_kernel_context ctxt) {
184 return ((struct RsExpandKernelDriverInfo *)ctxt)->current.array[1];
185}
186
187extern uint32_t __attribute__((overloadable)) rsGetArray2(rs_kernel_context ctxt) {
188 return ((struct RsExpandKernelDriverInfo *)ctxt)->current.array[2];
189}
190
191extern uint32_t __attribute__((overloadable)) rsGetArray3(rs_kernel_context ctxt) {
192 return ((struct RsExpandKernelDriverInfo *)ctxt)->current.array[3];
193}
194
195extern rs_allocation_cubemap_face __attribute__((overloadable)) rsGetFace(rs_kernel_context ctxt) {
196 return (rs_allocation_cubemap_face)(((struct RsExpandKernelDriverInfo *)ctxt)->current.face);
197}
198
199extern uint32_t __attribute__((overloadable)) rsGetLod(rs_kernel_context ctxt) {
200 return ((struct RsExpandKernelDriverInfo *)ctxt)->current.lod;
201}
202
David Grossdced5c92015-03-11 16:12:42 -0700203extern uint32_t __attribute__((overloadable)) rsGetDimX(rs_kernel_context ctxt) {
David Grossb0abb142015-03-12 15:23:03 -0700204 return ((struct RsExpandKernelDriverInfo *)ctxt)->dim.x;
David Grossdced5c92015-03-11 16:12:42 -0700205}
206
207extern uint32_t __attribute__((overloadable)) rsGetDimY(rs_kernel_context ctxt) {
David Grossb0abb142015-03-12 15:23:03 -0700208 return ((struct RsExpandKernelDriverInfo *)ctxt)->dim.y;
David Grossdced5c92015-03-11 16:12:42 -0700209}
210
211extern uint32_t __attribute__((overloadable)) rsGetDimZ(rs_kernel_context ctxt) {
David Grossb0abb142015-03-12 15:23:03 -0700212 return ((struct RsExpandKernelDriverInfo *)ctxt)->dim.z;
David Grossdced5c92015-03-11 16:12:42 -0700213}
214
David Gross6a3c8f32015-03-17 11:09:20 -0700215extern uint32_t __attribute__((overloadable)) rsGetDimArray0(rs_kernel_context ctxt) {
216 return ((struct RsExpandKernelDriverInfo *)ctxt)->dim.array[0];
217}
218
219extern uint32_t __attribute__((overloadable)) rsGetDimArray1(rs_kernel_context ctxt) {
220 return ((struct RsExpandKernelDriverInfo *)ctxt)->dim.array[1];
221}
222
223extern uint32_t __attribute__((overloadable)) rsGetDimArray2(rs_kernel_context ctxt) {
224 return ((struct RsExpandKernelDriverInfo *)ctxt)->dim.array[2];
225}
226
227extern uint32_t __attribute__((overloadable)) rsGetDimArray3(rs_kernel_context ctxt) {
228 return ((struct RsExpandKernelDriverInfo *)ctxt)->dim.array[3];
229}
230
231extern bool __attribute__((overloadable)) rsGetDimHasFaces(rs_kernel_context ctxt) {
232 return ((struct RsExpandKernelDriverInfo *)ctxt)->dim.face != 0;
233}
234
235extern uint32_t __attribute__((overloadable)) rsGetDimLod(rs_kernel_context ctxt) {
236 return ((struct RsExpandKernelDriverInfo *)ctxt)->dim.lod;
237}
238
Stephen Hines5a470202013-05-29 15:36:18 -0700239#define PRIM_DEBUG(T) \
240extern void __attribute__((overloadable)) rsDebug(const char *, const T *); \
241void __attribute__((overloadable)) rsDebug(const char *txt, T val) { \
242 rsDebug(txt, &val); \
243}
244
245PRIM_DEBUG(char2)
246PRIM_DEBUG(char3)
247PRIM_DEBUG(char4)
248PRIM_DEBUG(uchar2)
249PRIM_DEBUG(uchar3)
250PRIM_DEBUG(uchar4)
251PRIM_DEBUG(short2)
252PRIM_DEBUG(short3)
253PRIM_DEBUG(short4)
254PRIM_DEBUG(ushort2)
255PRIM_DEBUG(ushort3)
256PRIM_DEBUG(ushort4)
257PRIM_DEBUG(int2)
258PRIM_DEBUG(int3)
259PRIM_DEBUG(int4)
260PRIM_DEBUG(uint2)
261PRIM_DEBUG(uint3)
262PRIM_DEBUG(uint4)
263PRIM_DEBUG(long2)
264PRIM_DEBUG(long3)
265PRIM_DEBUG(long4)
266PRIM_DEBUG(ulong2)
267PRIM_DEBUG(ulong3)
268PRIM_DEBUG(ulong4)
269PRIM_DEBUG(float2)
270PRIM_DEBUG(float3)
271PRIM_DEBUG(float4)
272PRIM_DEBUG(double2)
273PRIM_DEBUG(double3)
274PRIM_DEBUG(double4)
275
276#undef PRIM_DEBUG