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