Home | History | Annotate | Download | only in runtime
      1 #include "rs_core.rsh"
      2 #include "rs_graphics.rsh"
      3 #include "rs_structs.h"
      4 
      5 // Opaque Allocation type operations
      6 extern uint32_t __attribute__((overloadable))
      7     rsAllocationGetDimX(rs_allocation a) {
      8     Allocation_t *alloc = (Allocation_t *)a.p;
      9     return alloc->mHal.drvState.lod[0].dimX;
     10 }
     11 
     12 extern uint32_t __attribute__((overloadable))
     13         rsAllocationGetDimY(rs_allocation a) {
     14     Allocation_t *alloc = (Allocation_t *)a.p;
     15     return alloc->mHal.drvState.lod[0].dimY;
     16 }
     17 
     18 extern uint32_t __attribute__((overloadable))
     19         rsAllocationGetDimZ(rs_allocation a) {
     20     Allocation_t *alloc = (Allocation_t *)a.p;
     21     return alloc->mHal.drvState.lod[0].dimZ;
     22 }
     23 
     24 extern uint32_t __attribute__((overloadable))
     25         rsAllocationGetDimLOD(rs_allocation a) {
     26     Allocation_t *alloc = (Allocation_t *)a.p;
     27     return alloc->mHal.state.hasMipmaps;
     28 }
     29 
     30 extern uint32_t __attribute__((overloadable))
     31         rsAllocationGetDimFaces(rs_allocation a) {
     32     Allocation_t *alloc = (Allocation_t *)a.p;
     33     return alloc->mHal.state.hasFaces;
     34 }
     35 
     36 
     37 extern rs_element __attribute__((overloadable))
     38         rsAllocationGetElement(rs_allocation a) {
     39     Allocation_t *alloc = (Allocation_t *)a.p;
     40     if (alloc == NULL) {
     41         rs_element nullElem = {0};
     42         return nullElem;
     43     }
     44     Type_t *type = (Type_t *)alloc->mHal.state.type;
     45     rs_element returnElem = {type->mHal.state.element};
     46     return returnElem;
     47 }
     48 
     49 // TODO: this needs to be optimized, obviously
     50 static void memcpy(void* dst, void* src, size_t size) {
     51     char* dst_c = (char*) dst, *src_c = (char*) src;
     52     for (; size > 0; size--) {
     53         *dst_c++ = *src_c++;
     54     }
     55 }
     56 
     57 #ifdef RS_DEBUG_RUNTIME
     58 #define ELEMENT_AT(T)                                                   \
     59     extern void __attribute__((overloadable))                           \
     60         rsSetElementAt_##T(rs_allocation a, const T *val, uint32_t x);  \
     61     extern void __attribute__((overloadable))                           \
     62         rsSetElementAt_##T(rs_allocation a, const T *val, uint32_t x, uint32_t y); \
     63     extern void __attribute__((overloadable))                           \
     64         rsSetElementAt_##T(rs_allocation a, const T *val, uint32_t x, uint32_t y, uint32_t z); \
     65     extern void __attribute__((overloadable))                           \
     66         rsGetElementAt_##T(rs_allocation a, T *val, uint32_t x);  \
     67     extern void __attribute__((overloadable))                           \
     68         rsGetElementAt_##T(rs_allocation a, T *val, uint32_t x, uint32_t y); \
     69     extern void __attribute__((overloadable))                           \
     70         rsGetElementAt_##T(rs_allocation a, T *val, uint32_t x, uint32_t y, uint32_t z); \
     71                                                                         \
     72     extern void __attribute__((overloadable))                           \
     73     rsSetElementAt_##T(rs_allocation a, T val, uint32_t x) {            \
     74         rsSetElementAt_##T(a, &val, x);                                 \
     75     }                                                                   \
     76     extern void __attribute__((overloadable))                           \
     77     rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y) { \
     78         rsSetElementAt_##T(a, &val, x, y);                              \
     79     }                                                                   \
     80     extern void __attribute__((overloadable))                           \
     81     rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y, uint32_t z) { \
     82         rsSetElementAt_##T(a, &val, x, y, z);                           \
     83     }                                                                   \
     84     extern T __attribute__((overloadable))                              \
     85     rsGetElementAt_##T(rs_allocation a, uint32_t x) {                   \
     86         T tmp;                                                          \
     87         rsGetElementAt_##T(a, &tmp, x);                                 \
     88         return tmp;                                                     \
     89     }                                                                   \
     90     extern T __attribute__((overloadable))                              \
     91     rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y) {       \
     92         T tmp;                                                          \
     93         rsGetElementAt_##T(a, &tmp, x, y);                              \
     94         return tmp;                                                     \
     95     }                                                                   \
     96     extern T __attribute__((overloadable))                              \
     97     rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) { \
     98         T tmp;                                                          \
     99         rsGetElementAt_##T(a, &tmp, x, y, z);                           \
    100         return tmp;                                                     \
    101     }
    102 
    103 #else
    104 
    105 uint8_t*
    106 rsOffset(rs_allocation a, uint32_t sizeOf, uint32_t x, uint32_t y,
    107          uint32_t z) {
    108     Allocation_t *alloc = (Allocation_t *)a.p;
    109     uint8_t *p = (uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
    110     const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
    111     const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
    112     uint8_t *dp = &p[(sizeOf * x) + (y * stride) +
    113                      (z * stride * dimY)];
    114     return dp;
    115 }
    116 
    117 #define ELEMENT_AT(T)                                                   \
    118                                                                         \
    119     void                                                                \
    120     rsSetElementAtImpl_##T(rs_allocation a, T val, uint32_t x,          \
    121                            uint32_t y, uint32_t z);                     \
    122                                                                         \
    123     extern void __attribute__((overloadable))                           \
    124     rsSetElementAt_##T(rs_allocation a, T val, uint32_t x) {            \
    125         rsSetElementAtImpl_##T(a, val, x, 0, 0);                        \
    126     }                                                                   \
    127                                                                         \
    128     extern void __attribute__((overloadable))                           \
    129     rsSetElementAt_##T(rs_allocation a, T val, uint32_t x,              \
    130                        uint32_t y) {                                    \
    131         rsSetElementAtImpl_##T(a, val, x, y, 0);                        \
    132     }                                                                   \
    133                                                                         \
    134     extern void __attribute__((overloadable))                           \
    135     rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y,  \
    136                        uint32_t z) {                                    \
    137         rsSetElementAtImpl_##T(a, val, x, y, z);                        \
    138     }                                                                   \
    139                                                                         \
    140     T                                                                   \
    141     rsGetElementAtImpl_##T(rs_allocation a, uint32_t x, uint32_t y,     \
    142                        uint32_t z);                                     \
    143                                                                         \
    144     extern T __attribute__((overloadable))                              \
    145     rsGetElementAt_##T(rs_allocation a, uint32_t x) {                   \
    146         return rsGetElementAtImpl_##T(a, x, 0, 0);                      \
    147     }                                                                   \
    148                                                                         \
    149     extern T __attribute__((overloadable))                              \
    150     rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y) {       \
    151         return rsGetElementAtImpl_##T(a, x, y, 0);                      \
    152     }                                                                   \
    153                                                                         \
    154     extern T __attribute__((overloadable))                              \
    155     rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y,         \
    156                        uint32_t z) {                                    \
    157         return rsGetElementAtImpl_##T(a, x, y, z);                      \
    158     }
    159 
    160 
    161 
    162 extern const void * __attribute__((overloadable))
    163         rsGetElementAt(rs_allocation a, uint32_t x) {
    164     Allocation_t *alloc = (Allocation_t *)a.p;
    165     const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
    166     const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
    167     return &p[eSize * x];
    168 }
    169 
    170 extern const void * __attribute__((overloadable))
    171         rsGetElementAt(rs_allocation a, uint32_t x, uint32_t y) {
    172     Allocation_t *alloc = (Allocation_t *)a.p;
    173     const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
    174     const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
    175     const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
    176     return &p[(eSize * x) + (y * stride)];
    177 }
    178 
    179 extern const void * __attribute__((overloadable))
    180         rsGetElementAt(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {
    181     Allocation_t *alloc = (Allocation_t *)a.p;
    182     const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
    183     const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
    184     const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
    185     const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
    186     return &p[(eSize * x) + (y * stride) + (z * stride * dimY)];
    187 }
    188 extern void __attribute__((overloadable))
    189         rsSetElementAt(rs_allocation a, void* ptr, uint32_t x) {
    190     Allocation_t *alloc = (Allocation_t *)a.p;
    191     const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
    192     const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
    193     memcpy((void*)&p[eSize * x], ptr, eSize);
    194 }
    195 
    196 extern void __attribute__((overloadable))
    197         rsSetElementAt(rs_allocation a, void* ptr, uint32_t x, uint32_t y) {
    198     Allocation_t *alloc = (Allocation_t *)a.p;
    199     const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
    200     const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
    201     const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
    202     memcpy((void*)&p[(eSize * x) + (y * stride)], ptr, eSize);
    203 }
    204 
    205 extern void __attribute__((overloadable))
    206         rsSetElementAt(rs_allocation a, void* ptr, uint32_t x, uint32_t y, uint32_t z) {
    207     Allocation_t *alloc = (Allocation_t *)a.p;
    208     const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
    209     const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
    210     const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
    211     const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
    212     memcpy((void*)&p[(eSize * x) + (y * stride) + (z * stride * dimY)], ptr, eSize);
    213 }
    214 #endif
    215 
    216 ELEMENT_AT(char)
    217 ELEMENT_AT(char2)
    218 ELEMENT_AT(char3)
    219 ELEMENT_AT(char4)
    220 ELEMENT_AT(uchar)
    221 ELEMENT_AT(uchar2)
    222 ELEMENT_AT(uchar3)
    223 ELEMENT_AT(uchar4)
    224 ELEMENT_AT(short)
    225 ELEMENT_AT(short2)
    226 ELEMENT_AT(short3)
    227 ELEMENT_AT(short4)
    228 ELEMENT_AT(ushort)
    229 ELEMENT_AT(ushort2)
    230 ELEMENT_AT(ushort3)
    231 ELEMENT_AT(ushort4)
    232 ELEMENT_AT(int)
    233 ELEMENT_AT(int2)
    234 ELEMENT_AT(int3)
    235 ELEMENT_AT(int4)
    236 ELEMENT_AT(uint)
    237 ELEMENT_AT(uint2)
    238 ELEMENT_AT(uint3)
    239 ELEMENT_AT(uint4)
    240 ELEMENT_AT(long)
    241 ELEMENT_AT(long2)
    242 ELEMENT_AT(long3)
    243 ELEMENT_AT(long4)
    244 ELEMENT_AT(ulong)
    245 ELEMENT_AT(ulong2)
    246 ELEMENT_AT(ulong3)
    247 ELEMENT_AT(ulong4)
    248 ELEMENT_AT(float)
    249 ELEMENT_AT(float2)
    250 ELEMENT_AT(float3)
    251 ELEMENT_AT(float4)
    252 ELEMENT_AT(double)
    253 ELEMENT_AT(double2)
    254 ELEMENT_AT(double3)
    255 ELEMENT_AT(double4)
    256 
    257 #undef ELEMENT_AT
    258 
    259 
    260 extern const uchar __attribute__((overloadable))
    261         rsGetElementAtYuv_uchar_Y(rs_allocation a, uint32_t x, uint32_t y) {
    262     return rsGetElementAt_uchar(a, x, y);
    263 }
    264 
    265 extern const uchar __attribute__((overloadable))
    266         rsGetElementAtYuv_uchar_U(rs_allocation a, uint32_t x, uint32_t y) {
    267 
    268     Allocation_t *alloc = (Allocation_t *)a.p;
    269 
    270     const size_t cstep = alloc->mHal.drvState.yuv.step;
    271     const size_t shift = alloc->mHal.drvState.yuv.shift;
    272     const size_t stride = alloc->mHal.drvState.lod[1].stride;
    273 
    274     const uchar *pin = (const uchar *)alloc->mHal.drvState.lod[1].mallocPtr;
    275 
    276     return pin[((x >> shift) * cstep) + ((y >> shift) * stride)];
    277 }
    278 
    279 extern const uchar __attribute__((overloadable))
    280         rsGetElementAtYuv_uchar_V(rs_allocation a, uint32_t x, uint32_t y) {
    281 
    282     Allocation_t *alloc = (Allocation_t *)a.p;
    283 
    284     const size_t cstep = alloc->mHal.drvState.yuv.step;
    285     const size_t shift = alloc->mHal.drvState.yuv.shift;
    286     const size_t stride = alloc->mHal.drvState.lod[2].stride;
    287 
    288     const uchar *pin = (const uchar *)alloc->mHal.drvState.lod[2].mallocPtr;
    289 
    290     return pin[((x >> shift) * cstep) + ((y >> shift) * stride)];
    291 }
    292 
    293