rs_core.c revision b18ab3a86d70dbdc492ab1ba925af1d2dc1c423d
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((volatile int32_t *)ptr, (int32_t)expectedValue, (int32_t)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)) rsAtomicDec(volatile int32_t *ptr) {
29    return __sync_fetch_and_sub(ptr, 1);
30}
31
32extern int32_t __attribute__((overloadable)) rsAtomicAdd(volatile int32_t *ptr, int32_t value) {
33    return __sync_fetch_and_add(ptr, value);
34}
35
36extern int32_t __attribute__((overloadable)) rsAtomicSub(volatile int32_t *ptr, int32_t value) {
37    return __sync_fetch_and_sub(ptr, value);
38}
39
40extern int32_t __attribute__((overloadable)) rsAtomicAnd(volatile int32_t *ptr, int32_t value) {
41    return __sync_fetch_and_and(ptr, value);
42}
43
44extern int32_t __attribute__((overloadable)) rsAtomicOr(volatile int32_t *ptr, int32_t value) {
45    return __sync_fetch_and_or(ptr, value);
46}
47
48extern int32_t __attribute__((overloadable)) rsAtomicXor(volatile int32_t *ptr, int32_t value) {
49    return __sync_fetch_and_xor(ptr, value);
50}
51
52extern uint32_t __attribute__((overloadable)) min(uint32_t, uint32_t);
53extern int32_t __attribute__((overloadable)) min(int32_t, int32_t);
54extern uint32_t __attribute__((overloadable)) max(uint32_t, uint32_t);
55extern int32_t __attribute__((overloadable)) max(int32_t, int32_t);
56
57extern uint32_t __attribute__((overloadable)) rsAtomicMin(volatile uint32_t *ptr, uint32_t value) {
58    uint32_t prev, status;
59    do {
60        prev = *ptr;
61        uint32_t n = min(value, prev);
62        status = rsAtomicCas((volatile int32_t*) ptr, (int32_t) prev, (int32_t)n);
63    } while (status != prev);
64    return prev;
65}
66
67extern int32_t __attribute__((overloadable)) rsAtomicMin(volatile int32_t *ptr, int32_t value) {
68    int32_t prev, status;
69    do {
70        prev = *ptr;
71        int32_t n = min(value, prev);
72        status = rsAtomicCas(ptr, prev, n);
73    } while (status != prev);
74    return prev;
75}
76
77extern uint32_t __attribute__((overloadable)) rsAtomicMax(volatile uint32_t *ptr, uint32_t value) {
78    uint32_t prev, status;
79    do {
80        prev = *ptr;
81        uint32_t n = max(value, prev);
82        status = rsAtomicCas((volatile int32_t*) ptr, (int32_t) prev, (int32_t) n);
83    } while (status != prev);
84    return prev;
85}
86
87extern int32_t __attribute__((overloadable)) rsAtomicMax(volatile int32_t *ptr, int32_t value) {
88    int32_t prev, status;
89    do {
90        prev = *ptr;
91        int32_t n = max(value, prev);
92        status = rsAtomicCas(ptr, prev, n);
93    } while (status != prev);
94    return prev;
95}
96
97
98
99extern int32_t rand();
100#define RAND_MAX 0x7fffffff
101
102
103
104extern float __attribute__((overloadable)) rsRand(float min, float max);/* {
105    float r = (float)rand();
106    r /= RAND_MAX;
107    r = r * (max - min) + min;
108    return r;
109}
110*/
111
112extern float __attribute__((overloadable)) rsRand(float max) {
113    return rsRand(0.f, max);
114    //float r = (float)rand();
115    //r *= max;
116    //r /= RAND_MAX;
117    //return r;
118}
119
120extern int __attribute__((overloadable)) rsRand(int max) {
121    return (int)rsRand((float)max);
122}
123
124extern int __attribute__((overloadable)) rsRand(int min, int max) {
125    return (int)rsRand((float)min, (float)max);
126}
127
128#define PRIM_DEBUG(T)                               \
129extern void __attribute__((overloadable)) rsDebug(const char *, const T *);     \
130void __attribute__((overloadable)) rsDebug(const char *txt, T val) {            \
131    rsDebug(txt, &val);                                                         \
132}
133
134PRIM_DEBUG(char2)
135PRIM_DEBUG(char3)
136PRIM_DEBUG(char4)
137PRIM_DEBUG(uchar2)
138PRIM_DEBUG(uchar3)
139PRIM_DEBUG(uchar4)
140PRIM_DEBUG(short2)
141PRIM_DEBUG(short3)
142PRIM_DEBUG(short4)
143PRIM_DEBUG(ushort2)
144PRIM_DEBUG(ushort3)
145PRIM_DEBUG(ushort4)
146PRIM_DEBUG(int2)
147PRIM_DEBUG(int3)
148PRIM_DEBUG(int4)
149PRIM_DEBUG(uint2)
150PRIM_DEBUG(uint3)
151PRIM_DEBUG(uint4)
152PRIM_DEBUG(long2)
153PRIM_DEBUG(long3)
154PRIM_DEBUG(long4)
155PRIM_DEBUG(ulong2)
156PRIM_DEBUG(ulong3)
157PRIM_DEBUG(ulong4)
158PRIM_DEBUG(float2)
159PRIM_DEBUG(float3)
160PRIM_DEBUG(float4)
161PRIM_DEBUG(double2)
162PRIM_DEBUG(double3)
163PRIM_DEBUG(double4)
164
165#undef PRIM_DEBUG
166
167