Home | History | Annotate | Download | only in runtime
      1 #include "rs_core.rsh"
      2 #include "rs_graphics.rsh"
      3 #include "rs_structs.h"
      4 
      5 /* Function declarations from libRS */
      6 extern float4 __attribute__((overloadable)) convert_float4(uchar4 c);
      7 
      8 /* Implementation of Core Runtime */
      9 
     10 extern float4 rsUnpackColor8888(uchar4 c)
     11 {
     12     return convert_float4(c) * 0.003921569f;
     13 }
     14 
     15 
     16 extern 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 
     20 extern 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 
     24 extern int32_t __attribute__((overloadable)) rsAtomicInc(volatile int32_t *ptr) {
     25     return __sync_fetch_and_add(ptr, 1);
     26 }
     27 
     28 extern int32_t __attribute__((overloadable)) rsAtomicDec(volatile int32_t *ptr) {
     29     return __sync_fetch_and_sub(ptr, 1);
     30 }
     31 
     32 extern int32_t __attribute__((overloadable)) rsAtomicAdd(volatile int32_t *ptr, int32_t value) {
     33     return __sync_fetch_and_add(ptr, value);
     34 }
     35 
     36 extern int32_t __attribute__((overloadable)) rsAtomicSub(volatile int32_t *ptr, int32_t value) {
     37     return __sync_fetch_and_sub(ptr, value);
     38 }
     39 
     40 extern int32_t __attribute__((overloadable)) rsAtomicAnd(volatile int32_t *ptr, int32_t value) {
     41     return __sync_fetch_and_and(ptr, value);
     42 }
     43 
     44 extern int32_t __attribute__((overloadable)) rsAtomicOr(volatile int32_t *ptr, int32_t value) {
     45     return __sync_fetch_and_or(ptr, value);
     46 }
     47 
     48 extern int32_t __attribute__((overloadable)) rsAtomicXor(volatile int32_t *ptr, int32_t value) {
     49     return __sync_fetch_and_xor(ptr, value);
     50 }
     51 
     52 extern uint32_t __attribute__((overloadable)) min(uint32_t, uint32_t);
     53 extern int32_t __attribute__((overloadable)) min(int32_t, int32_t);
     54 extern uint32_t __attribute__((overloadable)) max(uint32_t, uint32_t);
     55 extern int32_t __attribute__((overloadable)) max(int32_t, int32_t);
     56 
     57 extern 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 
     67 extern 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 
     77 extern 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 
     87 extern 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 
     99 extern int32_t rand();
    100 #define RAND_MAX 0x7fffffff
    101 
    102 
    103 
    104 extern 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 
    112 extern 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 
    120 extern int __attribute__((overloadable)) rsRand(int max) {
    121     return (int)rsRand((float)max);
    122 }
    123 
    124 extern int __attribute__((overloadable)) rsRand(int min, int max) {
    125     return (int)rsRand((float)min, (float)max);
    126 }
    127 
    128 #define PRIM_DEBUG(T)                               \
    129 extern void __attribute__((overloadable)) rsDebug(const char *, const T *);     \
    130 void __attribute__((overloadable)) rsDebug(const char *txt, T val) {            \
    131     rsDebug(txt, &val);                                                         \
    132 }
    133 
    134 PRIM_DEBUG(char2)
    135 PRIM_DEBUG(char3)
    136 PRIM_DEBUG(char4)
    137 PRIM_DEBUG(uchar2)
    138 PRIM_DEBUG(uchar3)
    139 PRIM_DEBUG(uchar4)
    140 PRIM_DEBUG(short2)
    141 PRIM_DEBUG(short3)
    142 PRIM_DEBUG(short4)
    143 PRIM_DEBUG(ushort2)
    144 PRIM_DEBUG(ushort3)
    145 PRIM_DEBUG(ushort4)
    146 PRIM_DEBUG(int2)
    147 PRIM_DEBUG(int3)
    148 PRIM_DEBUG(int4)
    149 PRIM_DEBUG(uint2)
    150 PRIM_DEBUG(uint3)
    151 PRIM_DEBUG(uint4)
    152 PRIM_DEBUG(long2)
    153 PRIM_DEBUG(long3)
    154 PRIM_DEBUG(long4)
    155 PRIM_DEBUG(ulong2)
    156 PRIM_DEBUG(ulong3)
    157 PRIM_DEBUG(ulong4)
    158 PRIM_DEBUG(float2)
    159 PRIM_DEBUG(float3)
    160 PRIM_DEBUG(float4)
    161 PRIM_DEBUG(double2)
    162 PRIM_DEBUG(double3)
    163 PRIM_DEBUG(double4)
    164 
    165 #undef PRIM_DEBUG
    166 
    167