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