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