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 #define ELEMENT_AT(T)                                                   \
    105     extern void __attribute__((overloadable))                           \
    106     rsSetElementAt_##T(rs_allocation a, T val, uint32_t x) {            \
    107         Allocation_t *alloc = (Allocation_t *)a.p;                      \
    108         uint8_t *p = (uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr; \
    109         const uint32_t eSize = sizeof(T);                               \
    110         *((T*)&p[(eSize * x)]) = val;                                   \
    111     }                                                                   \
    112     extern void __attribute__((overloadable))                           \
    113     rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y) { \
    114         Allocation_t *alloc = (Allocation_t *)a.p;                      \
    115         uint8_t *p = (uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr; \
    116         const uint32_t eSize = sizeof(T);                               \
    117         const uint32_t stride = alloc->mHal.drvState.lod[0].stride;     \
    118         *((T*)&p[(eSize * x) + (y * stride)]) = val;                    \
    119     }                                                                   \
    120     extern void __attribute__((overloadable))                           \
    121     rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y, uint32_t z) { \
    122         Allocation_t *alloc = (Allocation_t *)a.p;                      \
    123         uint8_t *p = (uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr; \
    124         const uint32_t stride = alloc->mHal.drvState.lod[0].stride;     \
    125         const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;         \
    126         uint8_t *dp = &p[(sizeof(T) * x) + (y * stride) + (z * stride * dimY)]; \
    127         ((T*)dp)[0] = val;                                        \
    128     }                                                                   \
    129     extern T __attribute__((overloadable))                              \
    130     rsGetElementAt_##T(rs_allocation a, uint32_t x) {                   \
    131         Allocation_t *alloc = (Allocation_t *)a.p;                      \
    132         const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr; \
    133         return *((T*)&p[(sizeof(T) * x)]);                              \
    134     }                                                                   \
    135     extern T __attribute__((overloadable))                              \
    136     rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y) {       \
    137         Allocation_t *alloc = (Allocation_t *)a.p;                      \
    138         const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr; \
    139         const uint32_t stride = alloc->mHal.drvState.lod[0].stride;     \
    140         return *((T*)&p[(sizeof(T) * x) + (y * stride)]);               \
    141     }                                                                   \
    142     extern T __attribute__((overloadable))                              \
    143     rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) { \
    144         Allocation_t *alloc = (Allocation_t *)a.p;                      \
    145         const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr; \
    146         const uint32_t stride = alloc->mHal.drvState.lod[0].stride;     \
    147         const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;         \
    148         const uint8_t *dp = &p[(sizeof(T) * x) + (y * stride) + (z * stride * dimY)]; \
    149         return ((const T*)dp)[0];                                       \
    150     }
    151 
    152 
    153 
    154 extern const void * __attribute__((overloadable))
    155         rsGetElementAt(rs_allocation a, uint32_t x) {
    156     Allocation_t *alloc = (Allocation_t *)a.p;
    157     const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
    158     const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
    159     return &p[eSize * x];
    160 }
    161 
    162 extern const void * __attribute__((overloadable))
    163         rsGetElementAt(rs_allocation a, uint32_t x, uint32_t y) {
    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     const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
    168     return &p[(eSize * x) + (y * stride)];
    169 }
    170 
    171 extern const void * __attribute__((overloadable))
    172         rsGetElementAt(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {
    173     Allocation_t *alloc = (Allocation_t *)a.p;
    174     const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
    175     const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
    176     const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
    177     const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
    178     return &p[(eSize * x) + (y * stride) + (z * stride * dimY)];
    179 }
    180 extern void __attribute__((overloadable))
    181         rsSetElementAt(rs_allocation a, void* ptr, uint32_t x) {
    182     Allocation_t *alloc = (Allocation_t *)a.p;
    183     const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
    184     const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
    185     memcpy((void*)&p[eSize * x], ptr, eSize);
    186 }
    187 
    188 extern void __attribute__((overloadable))
    189         rsSetElementAt(rs_allocation a, void* ptr, uint32_t x, uint32_t y) {
    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     const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
    194     memcpy((void*)&p[(eSize * x) + (y * stride)], ptr, eSize);
    195 }
    196 
    197 extern void __attribute__((overloadable))
    198         rsSetElementAt(rs_allocation a, void* ptr, uint32_t x, uint32_t y, uint32_t z) {
    199     Allocation_t *alloc = (Allocation_t *)a.p;
    200     const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
    201     const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
    202     const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
    203     const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
    204     memcpy((void*)&p[(eSize * x) + (y * stride) + (z * stride * dimY)], ptr, eSize);
    205 }
    206 #endif
    207 
    208 ELEMENT_AT(char)
    209 ELEMENT_AT(char2)
    210 ELEMENT_AT(char3)
    211 ELEMENT_AT(char4)
    212 ELEMENT_AT(uchar)
    213 ELEMENT_AT(uchar2)
    214 ELEMENT_AT(uchar3)
    215 ELEMENT_AT(uchar4)
    216 ELEMENT_AT(short)
    217 ELEMENT_AT(short2)
    218 ELEMENT_AT(short3)
    219 ELEMENT_AT(short4)
    220 ELEMENT_AT(ushort)
    221 ELEMENT_AT(ushort2)
    222 ELEMENT_AT(ushort3)
    223 ELEMENT_AT(ushort4)
    224 ELEMENT_AT(int)
    225 ELEMENT_AT(int2)
    226 ELEMENT_AT(int3)
    227 ELEMENT_AT(int4)
    228 ELEMENT_AT(uint)
    229 ELEMENT_AT(uint2)
    230 ELEMENT_AT(uint3)
    231 ELEMENT_AT(uint4)
    232 ELEMENT_AT(long)
    233 ELEMENT_AT(long2)
    234 ELEMENT_AT(long3)
    235 ELEMENT_AT(long4)
    236 ELEMENT_AT(ulong)
    237 ELEMENT_AT(ulong2)
    238 ELEMENT_AT(ulong3)
    239 ELEMENT_AT(ulong4)
    240 ELEMENT_AT(float)
    241 ELEMENT_AT(float2)
    242 ELEMENT_AT(float3)
    243 ELEMENT_AT(float4)
    244 ELEMENT_AT(double)
    245 ELEMENT_AT(double2)
    246 ELEMENT_AT(double3)
    247 ELEMENT_AT(double4)
    248 
    249 #undef ELEMENT_AT
    250 
    251 
    252 extern const uchar __attribute__((overloadable))
    253         rsGetElementAtYuv_uchar_Y(rs_allocation a, uint32_t x, uint32_t y) {
    254     return rsGetElementAt_uchar(a, x, y);
    255 }
    256 
    257 extern const uchar __attribute__((overloadable))
    258         rsGetElementAtYuv_uchar_U(rs_allocation a, uint32_t x, uint32_t y) {
    259 
    260     Allocation_t *alloc = (Allocation_t *)a.p;
    261     const uint32_t yuvID = alloc->mHal.state.yuv;
    262     const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[1].mallocPtr;
    263     const uint32_t stride = alloc->mHal.drvState.lod[1].stride;
    264 
    265     switch(yuvID) {
    266     case 0x32315659: //HAL_PIXEL_FORMAT_YV12:
    267         x >>= 1;
    268         y >>= 1;
    269         return p[x + (y * stride)];
    270     case 11: //HAL_PIXEL_FORMAT_YCrCb_420_SP:  // NV21
    271         x >>= 1;
    272         y >>= 1;
    273         return p[(x<<1) + (y * stride)];
    274     default:
    275         break;
    276     }
    277 
    278     return 0;
    279 }
    280 
    281 extern const uchar __attribute__((overloadable))
    282         rsGetElementAtYuv_uchar_V(rs_allocation a, uint32_t x, uint32_t y) {
    283 
    284     Allocation_t *alloc = (Allocation_t *)a.p;
    285     const uint32_t yuvID = alloc->mHal.state.yuv;
    286 
    287     switch(yuvID) {
    288     case 0x32315659: //HAL_PIXEL_FORMAT_YV12:
    289         {
    290         const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[2].mallocPtr;
    291         const uint32_t stride = alloc->mHal.drvState.lod[2].stride;
    292         x >>= 1;
    293         y >>= 1;
    294         return p[x + (y * stride)];
    295         }
    296     case 11: //HAL_PIXEL_FORMAT_YCrCb_420_SP:  // NV21
    297         {
    298         const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[1].mallocPtr;
    299         const uint32_t stride = alloc->mHal.drvState.lod[1].stride;
    300         x >>= 1;
    301         y >>= 1;
    302         return p[(x<<1) + (y * stride) + 1];
    303         }
    304     default:
    305             break;
    306     }
    307 
    308     return 0;
    309 }
    310 
    311