Home | History | Annotate | Download | only in runtime
      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