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