1 #include "rs_core.rsh"
2 #include "rs_structs.h"
3
4 /* Function declarations from libRS */
5 extern float4 __attribute__((overloadable)) convert_float4(uchar4 c);
6
7 /* Implementation of Core Runtime */
8
rsUnpackColor8888(uchar4 c)9 extern float4 rsUnpackColor8888(uchar4 c)
10 {
11 return convert_float4(c) * 0.003921569f;
12 }
13
14
rsClamp(float v,float l,float h)15 extern float __attribute__((overloadable)) rsClamp(float v, float l, float h) {
16 return clamp(v, l, h);
17 }
rsClamp(char v,char l,char h)18 extern char __attribute__((overloadable)) rsClamp(char v, char l, char h) {
19 return clamp(v, l, h);
20 }
rsClamp(uchar v,uchar l,uchar h)21 extern uchar __attribute__((overloadable)) rsClamp(uchar v, uchar l, uchar h) {
22 return clamp(v, l, h);
23 }
rsClamp(short v,short l,short h)24 extern short __attribute__((overloadable)) rsClamp(short v, short l, short h) {
25 return clamp(v, l, h);
26 }
rsClamp(ushort v,ushort l,ushort h)27 extern ushort __attribute__((overloadable)) rsClamp(ushort v, ushort l, ushort h) {
28 return clamp(v, l, h);
29 }
rsClamp(int v,int l,int h)30 extern int __attribute__((overloadable)) rsClamp(int v, int l, int h) {
31 return clamp(v, l, h);
32 }
rsClamp(uint v,uint l,uint h)33 extern uint __attribute__((overloadable)) rsClamp(uint v, uint l, uint h) {
34 return clamp(v, l, h);
35 }
36
rsAtomicCas(volatile int32_t * ptr,int32_t expectedValue,int32_t newValue)37 extern int32_t __attribute__((overloadable)) rsAtomicCas(volatile int32_t *ptr, int32_t expectedValue, int32_t newValue) {
38 return __sync_val_compare_and_swap(ptr, expectedValue, newValue);
39 }
40
rsAtomicCas(volatile uint32_t * ptr,uint32_t expectedValue,uint32_t newValue)41 extern uint32_t __attribute__((overloadable)) rsAtomicCas(volatile uint32_t *ptr, uint32_t expectedValue, uint32_t newValue) {
42 return __sync_val_compare_and_swap(ptr, expectedValue, newValue);
43 }
44
rsAtomicInc(volatile int32_t * ptr)45 extern int32_t __attribute__((overloadable)) rsAtomicInc(volatile int32_t *ptr) {
46 return __sync_fetch_and_add(ptr, 1);
47 }
48
rsAtomicInc(volatile uint32_t * ptr)49 extern int32_t __attribute__((overloadable)) rsAtomicInc(volatile uint32_t *ptr) {
50 return __sync_fetch_and_add(ptr, 1);
51 }
52
rsAtomicDec(volatile int32_t * ptr)53 extern int32_t __attribute__((overloadable)) rsAtomicDec(volatile int32_t *ptr) {
54 return __sync_fetch_and_sub(ptr, 1);
55 }
56
rsAtomicDec(volatile uint32_t * ptr)57 extern int32_t __attribute__((overloadable)) rsAtomicDec(volatile uint32_t *ptr) {
58 return __sync_fetch_and_sub(ptr, 1);
59 }
60
rsAtomicAdd(volatile int32_t * ptr,int32_t value)61 extern int32_t __attribute__((overloadable)) rsAtomicAdd(volatile int32_t *ptr, int32_t value) {
62 return __sync_fetch_and_add(ptr, value);
63 }
64
rsAtomicAdd(volatile uint32_t * ptr,uint32_t value)65 extern int32_t __attribute__((overloadable)) rsAtomicAdd(volatile uint32_t *ptr, uint32_t value) {
66 return __sync_fetch_and_add(ptr, value);
67 }
68
rsAtomicSub(volatile int32_t * ptr,int32_t value)69 extern int32_t __attribute__((overloadable)) rsAtomicSub(volatile int32_t *ptr, int32_t value) {
70 return __sync_fetch_and_sub(ptr, value);
71 }
72
rsAtomicSub(volatile uint32_t * ptr,uint32_t value)73 extern int32_t __attribute__((overloadable)) rsAtomicSub(volatile uint32_t *ptr, uint32_t value) {
74 return __sync_fetch_and_sub(ptr, value);
75 }
76
rsAtomicAnd(volatile int32_t * ptr,int32_t value)77 extern int32_t __attribute__((overloadable)) rsAtomicAnd(volatile int32_t *ptr, int32_t value) {
78 return __sync_fetch_and_and(ptr, value);
79 }
80
rsAtomicAnd(volatile uint32_t * ptr,uint32_t value)81 extern int32_t __attribute__((overloadable)) rsAtomicAnd(volatile uint32_t *ptr, uint32_t value) {
82 return __sync_fetch_and_and(ptr, value);
83 }
84
rsAtomicOr(volatile int32_t * ptr,int32_t value)85 extern int32_t __attribute__((overloadable)) rsAtomicOr(volatile int32_t *ptr, int32_t value) {
86 return __sync_fetch_and_or(ptr, value);
87 }
88
rsAtomicOr(volatile uint32_t * ptr,uint32_t value)89 extern int32_t __attribute__((overloadable)) rsAtomicOr(volatile uint32_t *ptr, uint32_t value) {
90 return __sync_fetch_and_or(ptr, value);
91 }
92
rsAtomicXor(volatile int32_t * ptr,int32_t value)93 extern int32_t __attribute__((overloadable)) rsAtomicXor(volatile int32_t *ptr, int32_t value) {
94 return __sync_fetch_and_xor(ptr, value);
95 }
96
rsAtomicXor(volatile uint32_t * ptr,uint32_t value)97 extern int32_t __attribute__((overloadable)) rsAtomicXor(volatile uint32_t *ptr, uint32_t value) {
98 return __sync_fetch_and_xor(ptr, value);
99 }
100
101 extern uint32_t __attribute__((overloadable)) min(uint32_t, uint32_t);
102 extern int32_t __attribute__((overloadable)) min(int32_t, int32_t);
103 extern uint32_t __attribute__((overloadable)) max(uint32_t, uint32_t);
104 extern int32_t __attribute__((overloadable)) max(int32_t, int32_t);
105
rsAtomicMin(volatile uint32_t * ptr,uint32_t value)106 extern uint32_t __attribute__((overloadable)) rsAtomicMin(volatile uint32_t *ptr, uint32_t value) {
107 uint32_t prev, status;
108 do {
109 prev = *ptr;
110 uint32_t n = min(value, prev);
111 status = __sync_val_compare_and_swap(ptr, prev, n);
112 } while (status != prev);
113 return prev;
114 }
115
rsAtomicMin(volatile int32_t * ptr,int32_t value)116 extern int32_t __attribute__((overloadable)) rsAtomicMin(volatile int32_t *ptr, int32_t value) {
117 int32_t prev, status;
118 do {
119 prev = *ptr;
120 int32_t n = min(value, prev);
121 status = __sync_val_compare_and_swap(ptr, prev, n);
122 } while (status != prev);
123 return prev;
124 }
125
rsAtomicMax(volatile uint32_t * ptr,uint32_t value)126 extern uint32_t __attribute__((overloadable)) rsAtomicMax(volatile uint32_t *ptr, uint32_t value) {
127 uint32_t prev, status;
128 do {
129 prev = *ptr;
130 uint32_t n = max(value, prev);
131 status = __sync_val_compare_and_swap(ptr, prev, n);
132 } while (status != prev);
133 return prev;
134 }
135
rsAtomicMax(volatile int32_t * ptr,int32_t value)136 extern int32_t __attribute__((overloadable)) rsAtomicMax(volatile int32_t *ptr, int32_t value) {
137 int32_t prev, status;
138 do {
139 prev = *ptr;
140 int32_t n = max(value, prev);
141 status = __sync_val_compare_and_swap(ptr, prev, n);
142 } while (status != prev);
143 return prev;
144 }
145
146
147
148 extern int32_t rand();
149 #define RAND_MAX 0x7fffffff
150
151
152
153 extern float __attribute__((overloadable)) rsRand(float min, float max);/* {
154 float r = (float)rand();
155 r /= RAND_MAX;
156 r = r * (max - min) + min;
157 return r;
158 }
159 */
160
rsRand(float max)161 extern float __attribute__((overloadable)) rsRand(float max) {
162 return rsRand(0.f, max);
163 //float r = (float)rand();
164 //r *= max;
165 //r /= RAND_MAX;
166 //return r;
167 }
168
rsRand(int max)169 extern int __attribute__((overloadable)) rsRand(int max) {
170 return (int)rsRand((float)max);
171 }
172
rsRand(int min,int max)173 extern int __attribute__((overloadable)) rsRand(int min, int max) {
174 return (int)rsRand((float)min, (float)max);
175 }
176
177 #define PRIM_DEBUG(T) \
178 extern void __attribute__((overloadable)) rsDebug(const char *, const T *); \
179 void __attribute__((overloadable)) rsDebug(const char *txt, T val) { \
180 rsDebug(txt, &val); \
181 }
182
183 PRIM_DEBUG(char2)
184 PRIM_DEBUG(char3)
185 PRIM_DEBUG(char4)
186 PRIM_DEBUG(uchar2)
187 PRIM_DEBUG(uchar3)
188 PRIM_DEBUG(uchar4)
189 PRIM_DEBUG(short2)
190 PRIM_DEBUG(short3)
191 PRIM_DEBUG(short4)
192 PRIM_DEBUG(ushort2)
193 PRIM_DEBUG(ushort3)
194 PRIM_DEBUG(ushort4)
195 PRIM_DEBUG(int2)
196 PRIM_DEBUG(int3)
197 PRIM_DEBUG(int4)
198 PRIM_DEBUG(uint2)
199 PRIM_DEBUG(uint3)
200 PRIM_DEBUG(uint4)
201 PRIM_DEBUG(long2)
202 PRIM_DEBUG(long3)
203 PRIM_DEBUG(long4)
204 PRIM_DEBUG(ulong2)
205 PRIM_DEBUG(ulong3)
206 PRIM_DEBUG(ulong4)
207 PRIM_DEBUG(float2)
208 PRIM_DEBUG(float3)
209 PRIM_DEBUG(float4)
210 PRIM_DEBUG(double2)
211 PRIM_DEBUG(double3)
212 PRIM_DEBUG(double4)
213
214 #undef PRIM_DEBUG
215
216