1 #include "rs_core.rsh"
2 #include "rs_structs.h"
3 
4 #include "rsCpuCoreRuntime.h"
5 
6 /* Function declarations from libRS */
7 extern float4 __attribute__((overloadable)) convert_float4(uchar4 c);
8 
9 /* Implementation of Core Runtime */
10 
rsUnpackColor8888(uchar4 c)11 extern float4 rsUnpackColor8888(uchar4 c)
12 {
13     return convert_float4(c) * 0.003921569f;
14 }
15 
16 
rsClamp(float v,float l,float h)17 extern float __attribute__((overloadable)) rsClamp(float v, float l, float h) {
18     return clamp(v, l, h);
19 }
rsClamp(char v,char l,char h)20 extern char __attribute__((overloadable)) rsClamp(char v, char l, char h) {
21     return clamp(v, l, h);
22 }
rsClamp(uchar v,uchar l,uchar h)23 extern uchar __attribute__((overloadable)) rsClamp(uchar v, uchar l, uchar h) {
24     return clamp(v, l, h);
25 }
rsClamp(short v,short l,short h)26 extern short __attribute__((overloadable)) rsClamp(short v, short l, short h) {
27     return clamp(v, l, h);
28 }
rsClamp(ushort v,ushort l,ushort h)29 extern ushort __attribute__((overloadable)) rsClamp(ushort v, ushort l, ushort h) {
30     return clamp(v, l, h);
31 }
rsClamp(int v,int l,int h)32 extern int __attribute__((overloadable)) rsClamp(int v, int l, int h) {
33     return clamp(v, l, h);
34 }
rsClamp(uint v,uint l,uint h)35 extern uint __attribute__((overloadable)) rsClamp(uint v, uint l, uint h) {
36     return clamp(v, l, h);
37 }
38 
rsAtomicCas(volatile int32_t * ptr,int32_t expectedValue,int32_t newValue)39 extern 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 
rsAtomicCas(volatile uint32_t * ptr,uint32_t expectedValue,uint32_t newValue)43 extern uint32_t __attribute__((overloadable)) rsAtomicCas(volatile uint32_t *ptr, uint32_t expectedValue, uint32_t newValue) {
44     return __sync_val_compare_and_swap(ptr, expectedValue, newValue);
45 }
46 
rsAtomicInc(volatile int32_t * ptr)47 extern int32_t __attribute__((overloadable)) rsAtomicInc(volatile int32_t *ptr) {
48     return __sync_fetch_and_add(ptr, 1);
49 }
50 
rsAtomicInc(volatile uint32_t * ptr)51 extern int32_t __attribute__((overloadable)) rsAtomicInc(volatile uint32_t *ptr) {
52     return __sync_fetch_and_add(ptr, 1);
53 }
54 
rsAtomicDec(volatile int32_t * ptr)55 extern int32_t __attribute__((overloadable)) rsAtomicDec(volatile int32_t *ptr) {
56     return __sync_fetch_and_sub(ptr, 1);
57 }
58 
rsAtomicDec(volatile uint32_t * ptr)59 extern int32_t __attribute__((overloadable)) rsAtomicDec(volatile uint32_t *ptr) {
60     return __sync_fetch_and_sub(ptr, 1);
61 }
62 
rsAtomicAdd(volatile int32_t * ptr,int32_t value)63 extern int32_t __attribute__((overloadable)) rsAtomicAdd(volatile int32_t *ptr, int32_t value) {
64     return __sync_fetch_and_add(ptr, value);
65 }
66 
rsAtomicAdd(volatile uint32_t * ptr,uint32_t value)67 extern int32_t __attribute__((overloadable)) rsAtomicAdd(volatile uint32_t *ptr, uint32_t value) {
68     return __sync_fetch_and_add(ptr, value);
69 }
70 
rsAtomicSub(volatile int32_t * ptr,int32_t value)71 extern int32_t __attribute__((overloadable)) rsAtomicSub(volatile int32_t *ptr, int32_t value) {
72     return __sync_fetch_and_sub(ptr, value);
73 }
74 
rsAtomicSub(volatile uint32_t * ptr,uint32_t value)75 extern int32_t __attribute__((overloadable)) rsAtomicSub(volatile uint32_t *ptr, uint32_t value) {
76     return __sync_fetch_and_sub(ptr, value);
77 }
78 
rsAtomicAnd(volatile int32_t * ptr,int32_t value)79 extern int32_t __attribute__((overloadable)) rsAtomicAnd(volatile int32_t *ptr, int32_t value) {
80     return __sync_fetch_and_and(ptr, value);
81 }
82 
rsAtomicAnd(volatile uint32_t * ptr,uint32_t value)83 extern int32_t __attribute__((overloadable)) rsAtomicAnd(volatile uint32_t *ptr, uint32_t value) {
84     return __sync_fetch_and_and(ptr, value);
85 }
86 
rsAtomicOr(volatile int32_t * ptr,int32_t value)87 extern int32_t __attribute__((overloadable)) rsAtomicOr(volatile int32_t *ptr, int32_t value) {
88     return __sync_fetch_and_or(ptr, value);
89 }
90 
rsAtomicOr(volatile uint32_t * ptr,uint32_t value)91 extern int32_t __attribute__((overloadable)) rsAtomicOr(volatile uint32_t *ptr, uint32_t value) {
92     return __sync_fetch_and_or(ptr, value);
93 }
94 
rsAtomicXor(volatile int32_t * ptr,int32_t value)95 extern int32_t __attribute__((overloadable)) rsAtomicXor(volatile int32_t *ptr, int32_t value) {
96     return __sync_fetch_and_xor(ptr, value);
97 }
98 
rsAtomicXor(volatile uint32_t * ptr,uint32_t value)99 extern int32_t __attribute__((overloadable)) rsAtomicXor(volatile uint32_t *ptr, uint32_t value) {
100     return __sync_fetch_and_xor(ptr, value);
101 }
102 
103 extern uint32_t __attribute__((overloadable)) min(uint32_t, uint32_t);
104 extern int32_t __attribute__((overloadable)) min(int32_t, int32_t);
105 extern uint32_t __attribute__((overloadable)) max(uint32_t, uint32_t);
106 extern int32_t __attribute__((overloadable)) max(int32_t, int32_t);
107 
rsAtomicMin(volatile uint32_t * ptr,uint32_t value)108 extern 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);
113         status = __sync_val_compare_and_swap(ptr, prev, n);
114     } while (status != prev);
115     return prev;
116 }
117 
rsAtomicMin(volatile int32_t * ptr,int32_t value)118 extern 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);
123         status = __sync_val_compare_and_swap(ptr, prev, n);
124     } while (status != prev);
125     return prev;
126 }
127 
rsAtomicMax(volatile uint32_t * ptr,uint32_t value)128 extern 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);
133         status = __sync_val_compare_and_swap(ptr, prev, n);
134     } while (status != prev);
135     return prev;
136 }
137 
rsAtomicMax(volatile int32_t * ptr,int32_t value)138 extern 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);
143         status = __sync_val_compare_and_swap(ptr, prev, n);
144     } while (status != prev);
145     return prev;
146 }
147 
148 
149 
150 extern int32_t rand();
151 #define RAND_MAX 0x7fffffff
152 
153 
154 
155 extern 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 
rsRand(float max)163 extern 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 
rsRand(int max)171 extern int __attribute__((overloadable)) rsRand(int max) {
172     return (int)rsRand((float)max);
173 }
174 
rsRand(int min,int max)175 extern int __attribute__((overloadable)) rsRand(int min, int max) {
176     return (int)rsRand((float)min, (float)max);
177 }
178 
rsGetArray0(rs_kernel_context ctxt)179 extern uint32_t __attribute__((overloadable)) rsGetArray0(rs_kernel_context ctxt) {
180     return ((struct RsExpandKernelDriverInfo *)ctxt)->current.array[0];
181 }
182 
rsGetArray1(rs_kernel_context ctxt)183 extern uint32_t __attribute__((overloadable)) rsGetArray1(rs_kernel_context ctxt) {
184     return ((struct RsExpandKernelDriverInfo *)ctxt)->current.array[1];
185 }
186 
rsGetArray2(rs_kernel_context ctxt)187 extern uint32_t __attribute__((overloadable)) rsGetArray2(rs_kernel_context ctxt) {
188     return ((struct RsExpandKernelDriverInfo *)ctxt)->current.array[2];
189 }
190 
rsGetArray3(rs_kernel_context ctxt)191 extern uint32_t __attribute__((overloadable)) rsGetArray3(rs_kernel_context ctxt) {
192     return ((struct RsExpandKernelDriverInfo *)ctxt)->current.array[3];
193 }
194 
rsGetFace(rs_kernel_context ctxt)195 extern rs_allocation_cubemap_face __attribute__((overloadable)) rsGetFace(rs_kernel_context ctxt) {
196     return (rs_allocation_cubemap_face)(((struct RsExpandKernelDriverInfo *)ctxt)->current.face);
197 }
198 
rsGetLod(rs_kernel_context ctxt)199 extern uint32_t __attribute__((overloadable)) rsGetLod(rs_kernel_context ctxt) {
200     return ((struct RsExpandKernelDriverInfo *)ctxt)->current.lod;
201 }
202 
rsGetDimX(rs_kernel_context ctxt)203 extern uint32_t __attribute__((overloadable)) rsGetDimX(rs_kernel_context ctxt) {
204     return ((struct RsExpandKernelDriverInfo *)ctxt)->dim.x;
205 }
206 
rsGetDimY(rs_kernel_context ctxt)207 extern uint32_t __attribute__((overloadable)) rsGetDimY(rs_kernel_context ctxt) {
208     return ((struct RsExpandKernelDriverInfo *)ctxt)->dim.y;
209 }
210 
rsGetDimZ(rs_kernel_context ctxt)211 extern uint32_t __attribute__((overloadable)) rsGetDimZ(rs_kernel_context ctxt) {
212     return ((struct RsExpandKernelDriverInfo *)ctxt)->dim.z;
213 }
214 
rsGetDimArray0(rs_kernel_context ctxt)215 extern uint32_t __attribute__((overloadable)) rsGetDimArray0(rs_kernel_context ctxt) {
216     return ((struct RsExpandKernelDriverInfo *)ctxt)->dim.array[0];
217 }
218 
rsGetDimArray1(rs_kernel_context ctxt)219 extern uint32_t __attribute__((overloadable)) rsGetDimArray1(rs_kernel_context ctxt) {
220     return ((struct RsExpandKernelDriverInfo *)ctxt)->dim.array[1];
221 }
222 
rsGetDimArray2(rs_kernel_context ctxt)223 extern uint32_t __attribute__((overloadable)) rsGetDimArray2(rs_kernel_context ctxt) {
224     return ((struct RsExpandKernelDriverInfo *)ctxt)->dim.array[2];
225 }
226 
rsGetDimArray3(rs_kernel_context ctxt)227 extern uint32_t __attribute__((overloadable)) rsGetDimArray3(rs_kernel_context ctxt) {
228     return ((struct RsExpandKernelDriverInfo *)ctxt)->dim.array[3];
229 }
230 
rsGetDimHasFaces(rs_kernel_context ctxt)231 extern bool __attribute__((overloadable)) rsGetDimHasFaces(rs_kernel_context ctxt) {
232     return ((struct RsExpandKernelDriverInfo *)ctxt)->dim.face != 0;
233 }
234 
rsGetDimLod(rs_kernel_context ctxt)235 extern uint32_t __attribute__((overloadable)) rsGetDimLod(rs_kernel_context ctxt) {
236     return ((struct RsExpandKernelDriverInfo *)ctxt)->dim.lod;
237 }
238 
239 #define PRIM_DEBUG(T)                               \
240 extern void __attribute__((overloadable)) rsDebug(const char *, const T *);     \
241 void __attribute__((overloadable)) rsDebug(const char *txt, T val) {            \
242     rsDebug(txt, &val);                                                         \
243 }
244 
245 PRIM_DEBUG(char2)
246 PRIM_DEBUG(char3)
247 PRIM_DEBUG(char4)
248 PRIM_DEBUG(uchar2)
249 PRIM_DEBUG(uchar3)
250 PRIM_DEBUG(uchar4)
251 PRIM_DEBUG(short2)
252 PRIM_DEBUG(short3)
253 PRIM_DEBUG(short4)
254 PRIM_DEBUG(ushort2)
255 PRIM_DEBUG(ushort3)
256 PRIM_DEBUG(ushort4)
257 PRIM_DEBUG(int2)
258 PRIM_DEBUG(int3)
259 PRIM_DEBUG(int4)
260 PRIM_DEBUG(uint2)
261 PRIM_DEBUG(uint3)
262 PRIM_DEBUG(uint4)
263 PRIM_DEBUG(long2)
264 PRIM_DEBUG(long3)
265 PRIM_DEBUG(long4)
266 PRIM_DEBUG(ulong2)
267 PRIM_DEBUG(ulong3)
268 PRIM_DEBUG(ulong4)
269 PRIM_DEBUG(float2)
270 PRIM_DEBUG(float3)
271 PRIM_DEBUG(float4)
272 PRIM_DEBUG(double2)
273 PRIM_DEBUG(double3)
274 PRIM_DEBUG(double4)
275 
276 #undef PRIM_DEBUG
277