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