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