1 #include "rs_core.rsh" 2 #include "rs_graphics.rsh" 3 #include "rs_structs.h" 4 5 /* Function declarations from libRS */ 6 extern float4 __attribute__((overloadable)) convert_float4(uchar4 c); 7 8 /* Implementation of Core Runtime */ 9 10 extern float4 rsUnpackColor8888(uchar4 c) 11 { 12 return convert_float4(c) * 0.003921569f; 13 } 14 15 16 extern 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 20 extern 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 24 extern int32_t __attribute__((overloadable)) rsAtomicInc(volatile int32_t *ptr) { 25 return __sync_fetch_and_add(ptr, 1); 26 } 27 28 extern int32_t __attribute__((overloadable)) rsAtomicDec(volatile int32_t *ptr) { 29 return __sync_fetch_and_sub(ptr, 1); 30 } 31 32 extern int32_t __attribute__((overloadable)) rsAtomicAdd(volatile int32_t *ptr, int32_t value) { 33 return __sync_fetch_and_add(ptr, value); 34 } 35 36 extern int32_t __attribute__((overloadable)) rsAtomicSub(volatile int32_t *ptr, int32_t value) { 37 return __sync_fetch_and_sub(ptr, value); 38 } 39 40 extern int32_t __attribute__((overloadable)) rsAtomicAnd(volatile int32_t *ptr, int32_t value) { 41 return __sync_fetch_and_and(ptr, value); 42 } 43 44 extern int32_t __attribute__((overloadable)) rsAtomicOr(volatile int32_t *ptr, int32_t value) { 45 return __sync_fetch_and_or(ptr, value); 46 } 47 48 extern int32_t __attribute__((overloadable)) rsAtomicXor(volatile int32_t *ptr, int32_t value) { 49 return __sync_fetch_and_xor(ptr, value); 50 } 51 52 extern uint32_t __attribute__((overloadable)) min(uint32_t, uint32_t); 53 extern int32_t __attribute__((overloadable)) min(int32_t, int32_t); 54 extern uint32_t __attribute__((overloadable)) max(uint32_t, uint32_t); 55 extern int32_t __attribute__((overloadable)) max(int32_t, int32_t); 56 57 extern 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 67 extern 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 77 extern 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 87 extern 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 99 extern int32_t rand(); 100 #define RAND_MAX 0x7fffffff 101 102 103 104 extern 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 112 extern 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 120 extern int __attribute__((overloadable)) rsRand(int max) { 121 return (int)rsRand((float)max); 122 } 123 124 extern int __attribute__((overloadable)) rsRand(int min, int max) { 125 return (int)rsRand((float)min, (float)max); 126 } 127 128 #define PRIM_DEBUG(T) \ 129 extern void __attribute__((overloadable)) rsDebug(const char *, const T *); \ 130 void __attribute__((overloadable)) rsDebug(const char *txt, T val) { \ 131 rsDebug(txt, &val); \ 132 } 133 134 PRIM_DEBUG(char2) 135 PRIM_DEBUG(char3) 136 PRIM_DEBUG(char4) 137 PRIM_DEBUG(uchar2) 138 PRIM_DEBUG(uchar3) 139 PRIM_DEBUG(uchar4) 140 PRIM_DEBUG(short2) 141 PRIM_DEBUG(short3) 142 PRIM_DEBUG(short4) 143 PRIM_DEBUG(ushort2) 144 PRIM_DEBUG(ushort3) 145 PRIM_DEBUG(ushort4) 146 PRIM_DEBUG(int2) 147 PRIM_DEBUG(int3) 148 PRIM_DEBUG(int4) 149 PRIM_DEBUG(uint2) 150 PRIM_DEBUG(uint3) 151 PRIM_DEBUG(uint4) 152 PRIM_DEBUG(long2) 153 PRIM_DEBUG(long3) 154 PRIM_DEBUG(long4) 155 PRIM_DEBUG(ulong2) 156 PRIM_DEBUG(ulong3) 157 PRIM_DEBUG(ulong4) 158 PRIM_DEBUG(float2) 159 PRIM_DEBUG(float3) 160 PRIM_DEBUG(float4) 161 PRIM_DEBUG(double2) 162 PRIM_DEBUG(double3) 163 PRIM_DEBUG(double4) 164 165 #undef PRIM_DEBUG 166 167