15a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines#include "rs_core.rsh"
25a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines#include "rs_structs.h"
35a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
45a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines// Opaque Allocation type operations
55a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uint32_t __attribute__((overloadable))
65a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    rsAllocationGetDimX(rs_allocation a) {
75a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
85a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return alloc->mHal.drvState.lod[0].dimX;
95a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
105a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
115a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uint32_t __attribute__((overloadable))
125a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsAllocationGetDimY(rs_allocation a) {
135a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
145a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return alloc->mHal.drvState.lod[0].dimY;
155a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
165a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
175a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uint32_t __attribute__((overloadable))
185a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsAllocationGetDimZ(rs_allocation a) {
195a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
205a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return alloc->mHal.drvState.lod[0].dimZ;
215a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
225a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
235a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uint32_t __attribute__((overloadable))
245a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsAllocationGetDimLOD(rs_allocation a) {
255a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
265a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return alloc->mHal.state.hasMipmaps;
275a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
285a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
295a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern uint32_t __attribute__((overloadable))
305a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsAllocationGetDimFaces(rs_allocation a) {
315a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
325a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return alloc->mHal.state.hasFaces;
335a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
345a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
355a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
365a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern rs_element __attribute__((overloadable))
375a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsAllocationGetElement(rs_allocation a) {
385a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
395a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    if (alloc == NULL) {
405a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rs_element nullElem = {0};
415a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        return nullElem;
425a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }
435a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Type_t *type = (Type_t *)alloc->mHal.state.type;
445a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    rs_element returnElem = {type->mHal.state.element};
4595e71d3d05a583a807013de5c81f952e1ba054beYang Ni    rs_element rs_retval = {0};
4695e71d3d05a583a807013de5c81f952e1ba054beYang Ni    rsSetObject(&rs_retval, returnElem);
4795e71d3d05a583a807013de5c81f952e1ba054beYang Ni    return rs_retval;
485a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
495a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
505a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines// TODO: this needs to be optimized, obviously
514c01362afa871fcde6c269bc0ba3defa9e76de49Dean De Leostatic void memcpy(void* dst, const void* src, size_t size) {
524c01362afa871fcde6c269bc0ba3defa9e76de49Dean De Leo    char* dst_c = (char*) dst;
534c01362afa871fcde6c269bc0ba3defa9e76de49Dean De Leo    const char* src_c = (const char*) src;
545a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    for (; size > 0; size--) {
555a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        *dst_c++ = *src_c++;
565a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }
575a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
585a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
595a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines#ifdef RS_DEBUG_RUNTIME
605a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines#define ELEMENT_AT(T)                                                   \
615a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
625a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt_##T(rs_allocation a, const T *val, uint32_t x);  \
635a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
645a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt_##T(rs_allocation a, const T *val, uint32_t x, uint32_t y); \
655a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
665a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt_##T(rs_allocation a, const T *val, uint32_t x, uint32_t y, uint32_t z); \
675a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
685a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt_##T(rs_allocation a, T *val, uint32_t x);  \
695a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
705a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt_##T(rs_allocation a, T *val, uint32_t x, uint32_t y); \
715a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
725a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt_##T(rs_allocation a, T *val, uint32_t x, uint32_t y, uint32_t z); \
735a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines                                                                        \
745a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
755a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    rsSetElementAt_##T(rs_allocation a, T val, uint32_t x) {            \
765a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt_##T(a, &val, x);                                 \
775a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
785a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
795a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y) { \
805a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt_##T(a, &val, x, y);                              \
815a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
825a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
835a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y, uint32_t z) { \
845a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt_##T(a, &val, x, y, z);                           \
855a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
865a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern T __attribute__((overloadable))                              \
875a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    rsGetElementAt_##T(rs_allocation a, uint32_t x) {                   \
885a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        T tmp;                                                          \
895a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt_##T(a, &tmp, x);                                 \
905a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        return tmp;                                                     \
915a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
925a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern T __attribute__((overloadable))                              \
935a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y) {       \
945a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        T tmp;                                                          \
955a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt_##T(a, &tmp, x, y);                              \
965a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        return tmp;                                                     \
975a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
985a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern T __attribute__((overloadable))                              \
995a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) { \
1005a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        T tmp;                                                          \
1015a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt_##T(a, &tmp, x, y, z);                           \
1025a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        return tmp;                                                     \
1035a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }
1045a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines#else
10598f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser
1061ed5ef9b253850a199eecff6b7941e57c408e509Tobias Grosseruint8_t*
10798f1f05105146e1caeb124cae6e286c151f63151Tobias GrosserrsOffset(rs_allocation a, uint32_t sizeOf, uint32_t x, uint32_t y,
10898f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser         uint32_t z) {
10998f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser    Allocation_t *alloc = (Allocation_t *)a.p;
1101aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    //#ifdef __LP64__
1111aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    //    uint8_t *p = (uint8_t *)a.r;
1121aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    //#else
11398f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser    uint8_t *p = (uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
1141aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray    //#endif
115a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    const uint32_t stride = (uint32_t)alloc->mHal.drvState.lod[0].stride;
11698f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser    const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
11798f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser    uint8_t *dp = &p[(sizeOf * x) + (y * stride) +
11898f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser                     (z * stride * dimY)];
11998f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser    return dp;
12098f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser}
12198f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser
12241660c4c73fc425a2e3511e2070b2748cdd1107cJason Samsuint8_t*
12341660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsrsOffsetNs(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {
12441660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    Allocation_t *alloc = (Allocation_t *)a.p;
12501ca8a4f99583e0fcaa980ca70415f21e0621b9bTim Murray    //#ifdef __LP64__
12601ca8a4f99583e0fcaa980ca70415f21e0621b9bTim Murray    //    uint8_t *p = (uint8_t *)a.r;
12701ca8a4f99583e0fcaa980ca70415f21e0621b9bTim Murray    //#else
12841660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    uint8_t *p = (uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
12901ca8a4f99583e0fcaa980ca70415f21e0621b9bTim Murray    //#endif
13041660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
13141660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
13241660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    const uint32_t sizeOf = alloc->mHal.state.elementSizeBytes;;
13341660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    uint8_t *dp = &p[(sizeOf * x) + (y * stride) +
13441660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams                     (z * stride * dimY)];
13541660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    return dp;
13641660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams}
13741660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams
138f7f9316f4cf373733285f947bea876ead7216715Verena Beckham// The functions rsSetElementAtImpl_T and rsGetElementAtImpl_T are implemented in bitcode
139f7f9316f4cf373733285f947bea876ead7216715Verena Beckham// in ll32/allocation.ll and ll64/allocation.ll. To be able to provide debug info for
140f7f9316f4cf373733285f947bea876ead7216715Verena Beckham// these functions define them here instead, if we are linking with the debug library.
141f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#ifdef RS_G_RUNTIME
142f7f9316f4cf373733285f947bea876ead7216715Verena Beckham
143f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#define SET_ELEMENT_AT_IMPL_TYPE_SIZE(typename, size)                               \
144f7f9316f4cf373733285f947bea876ead7216715Verena Beckham     void rsSetElementAtImpl_##typename                                             \
145f7f9316f4cf373733285f947bea876ead7216715Verena Beckham            (rs_allocation a, typename val, uint32_t x, uint32_t y, uint32_t z) {   \
146f7f9316f4cf373733285f947bea876ead7216715Verena Beckham        typename* val_ptr = (typename*)rsOffset(a, size, x, y, z);                  \
147f7f9316f4cf373733285f947bea876ead7216715Verena Beckham        *val_ptr = val;                                                             \
148f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    }
149f7f9316f4cf373733285f947bea876ead7216715Verena Beckham
150f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#define GET_ELEMENT_AT_IMPL_TYPE_SIZE(typename, size)                               \
151f7f9316f4cf373733285f947bea876ead7216715Verena Beckham     typename rsGetElementAtImpl_##typename                                         \
152f7f9316f4cf373733285f947bea876ead7216715Verena Beckham            (rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {                 \
153f7f9316f4cf373733285f947bea876ead7216715Verena Beckham        typename *val_ptr = (typename*)rsOffset(a, size, x, y, z);                  \
154f7f9316f4cf373733285f947bea876ead7216715Verena Beckham        return *val_ptr;                                                            \
155f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    }
156f7f9316f4cf373733285f947bea876ead7216715Verena Beckham
157f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#define SET_ELEMENT_AT_IMPL_TYPE(typename)          \
158f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    SET_ELEMENT_AT_IMPL_TYPE_SIZE(typename, sizeof(typename))        \
159f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    SET_ELEMENT_AT_IMPL_TYPE_SIZE(typename##2, sizeof(typename)*2)   \
160f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    SET_ELEMENT_AT_IMPL_TYPE_SIZE(typename##3, sizeof(typename)*4)   \
161f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    SET_ELEMENT_AT_IMPL_TYPE_SIZE(typename##4, sizeof(typename)*4)
162f7f9316f4cf373733285f947bea876ead7216715Verena Beckham
163f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#define GET_ELEMENT_AT_IMPL_TYPE(typename)          \
164f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    GET_ELEMENT_AT_IMPL_TYPE_SIZE(typename, sizeof(typename))        \
165f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    GET_ELEMENT_AT_IMPL_TYPE_SIZE(typename##2, sizeof(typename)*2)   \
166f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    GET_ELEMENT_AT_IMPL_TYPE_SIZE(typename##3, sizeof(typename)*4)   \
167f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    GET_ELEMENT_AT_IMPL_TYPE_SIZE(typename##4, sizeof(typename)*4)
168f7f9316f4cf373733285f947bea876ead7216715Verena Beckham
169f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#define ELEMENT_AT_IMPL_TYPE(typename)  \
170f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    SET_ELEMENT_AT_IMPL_TYPE(typename)  \
171f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    GET_ELEMENT_AT_IMPL_TYPE(typename)
172f7f9316f4cf373733285f947bea876ead7216715Verena Beckham
173f7f9316f4cf373733285f947bea876ead7216715Verena BeckhamELEMENT_AT_IMPL_TYPE(char)
174f7f9316f4cf373733285f947bea876ead7216715Verena BeckhamELEMENT_AT_IMPL_TYPE(uchar)
175f7f9316f4cf373733285f947bea876ead7216715Verena BeckhamELEMENT_AT_IMPL_TYPE(short)
176f7f9316f4cf373733285f947bea876ead7216715Verena BeckhamELEMENT_AT_IMPL_TYPE(ushort)
177f7f9316f4cf373733285f947bea876ead7216715Verena BeckhamELEMENT_AT_IMPL_TYPE(int)
178f7f9316f4cf373733285f947bea876ead7216715Verena BeckhamELEMENT_AT_IMPL_TYPE(uint)
179f7f9316f4cf373733285f947bea876ead7216715Verena BeckhamELEMENT_AT_IMPL_TYPE(long)
180f7f9316f4cf373733285f947bea876ead7216715Verena BeckhamELEMENT_AT_IMPL_TYPE(ulong)
181f7f9316f4cf373733285f947bea876ead7216715Verena BeckhamELEMENT_AT_IMPL_TYPE(half)
182f7f9316f4cf373733285f947bea876ead7216715Verena BeckhamELEMENT_AT_IMPL_TYPE(float)
183f7f9316f4cf373733285f947bea876ead7216715Verena BeckhamELEMENT_AT_IMPL_TYPE(double)
184f7f9316f4cf373733285f947bea876ead7216715Verena Beckham
185f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#undef ELEMENT_AT_IMPL_TYPE
186f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#undef GET_ELEMENT_AT_IMPL_TYPE
187f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#undef SET_ELEMENT_AT_IMPL_TYPE
188f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#undef GET_ELEMENT_AT_IMPL_TYPE_SIZE
189f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#undef SET_ELEMENT_AT_IMPL_TYPE_SIZE
190f7f9316f4cf373733285f947bea876ead7216715Verena Beckham
191f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#define SET_ELEMENT_AT_TYPE_IMPL(T, typename) /* nothing */
192f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#define GET_ELEMENT_AT_TYPE_IMPL(T, typename) /* nothing */
193f7f9316f4cf373733285f947bea876ead7216715Verena Beckham
194f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#else
195f7f9316f4cf373733285f947bea876ead7216715Verena Beckham
196f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#define SET_ELEMENT_AT_TYPE_IMPL(T, typename)                                    \
1971ed5ef9b253850a199eecff6b7941e57c408e509Tobias Grosser    void                                                                \
198cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    rsSetElementAtImpl_##typename(rs_allocation a, typename val, uint32_t x,   \
199f7f9316f4cf373733285f947bea876ead7216715Verena Beckham                                  uint32_t y, uint32_t z);
200f7f9316f4cf373733285f947bea876ead7216715Verena Beckham
201f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#define GET_ELEMENT_AT_TYPE_IMPL(T, typename)                                \
202f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    typename                                                            \
203f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    rsGetElementAtImpl_##typename(rs_allocation a, uint32_t x, uint32_t y, \
204f7f9316f4cf373733285f947bea876ead7216715Verena Beckham                                  uint32_t z);
205f7f9316f4cf373733285f947bea876ead7216715Verena Beckham
206f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#endif //RS_G_RUNTIME
207f7f9316f4cf373733285f947bea876ead7216715Verena Beckham
208f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#define SET_ELEMENT_AT_TYPE_DEF(T, typename)                                    \
2095a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
210cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    rsSetElementAt_##typename(rs_allocation a, T val, uint32_t x) {     \
211cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray        rsSetElementAtImpl_##typename(a, (typename)val, x, 0, 0);              \
2125a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
21398f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser                                                                        \
2145a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
215cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    rsSetElementAt_##typename(rs_allocation a, T val, uint32_t x,       \
216cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray                              uint32_t y) {                             \
217cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray        rsSetElementAtImpl_##typename(a, (typename)val, x, y, 0);              \
2185a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
21998f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser                                                                        \
2205a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
221cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    rsSetElementAt_##typename(rs_allocation a, T val, uint32_t x, uint32_t y, \
222cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray                              uint32_t z) {                             \
223cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray        rsSetElementAtImpl_##typename(a, (typename)val, x, y, z);              \
224f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    }
225cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray
226f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#define GET_ELEMENT_AT_TYPE_DEF(T, typename)                                \
227cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    extern typename __attribute__((overloadable))                       \
228cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    rsGetElementAt_##typename(rs_allocation a, uint32_t x) {            \
229cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray        return (typename)rsGetElementAtImpl_##typename(a, x, 0, 0);     \
2305a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
23198f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser                                                                        \
232cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    extern typename __attribute__((overloadable))                       \
233cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    rsGetElementAt_##typename(rs_allocation a, uint32_t x, uint32_t y) { \
234cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray        return (typename)rsGetElementAtImpl_##typename(a, x, y, 0);     \
2355a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
23698f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser                                                                        \
237cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    extern typename __attribute__((overloadable))                       \
238cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    rsGetElementAt_##typename(rs_allocation a, uint32_t x, uint32_t y,  \
239cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray                              uint32_t z) {                             \
240cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray        return (typename)rsGetElementAtImpl_##typename(a, x, y, z);     \
2415a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }
2425a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
243f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#define SET_ELEMENT_AT(T) SET_ELEMENT_AT_TYPE_IMPL(T, T) \
244f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    SET_ELEMENT_AT_TYPE_DEF(T, T)
245f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#define GET_ELEMENT_AT(T) GET_ELEMENT_AT_TYPE_IMPL(T, T) \
246f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    GET_ELEMENT_AT_TYPE_DEF(T, T)
247cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray
248cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray#define ELEMENT_AT(T)                           \
249cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    SET_ELEMENT_AT(T)                           \
250cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    GET_ELEMENT_AT(T)
2515a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2525a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2535a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern const void * __attribute__((overloadable))
2545a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt(rs_allocation a, uint32_t x) {
2555a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
2565a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
2575a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
2585a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return &p[eSize * x];
2595a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2605a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2615a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern const void * __attribute__((overloadable))
2625a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt(rs_allocation a, uint32_t x, uint32_t y) {
2635a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
2645a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
2655a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
2665a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
2675a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return &p[(eSize * x) + (y * stride)];
2685a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2695a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2705a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern const void * __attribute__((overloadable))
2715a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {
2725a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
2735a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
2745a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
2755a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
2765a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
2775a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return &p[(eSize * x) + (y * stride) + (z * stride * dimY)];
2785a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2795a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern void __attribute__((overloadable))
2805a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt(rs_allocation a, void* ptr, uint32_t x) {
2815a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
2825a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
2835a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
2845a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    memcpy((void*)&p[eSize * x], ptr, eSize);
2855a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2865a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2875a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern void __attribute__((overloadable))
2885a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt(rs_allocation a, void* ptr, uint32_t x, uint32_t y) {
2895a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
2905a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
2915a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
2925a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
2935a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    memcpy((void*)&p[(eSize * x) + (y * stride)], ptr, eSize);
2945a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2955a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2965a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern void __attribute__((overloadable))
2975a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt(rs_allocation a, void* ptr, uint32_t x, uint32_t y, uint32_t z) {
2985a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
2995a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
3005a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
3015a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
3025a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
3035a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    memcpy((void*)&p[(eSize * x) + (y * stride) + (z * stride * dimY)], ptr, eSize);
3045a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
305cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray#endif // RS_DEBUG_RUNTIME
3065a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3075a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(char)
3085a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(char2)
3095a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(char3)
3105a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(char4)
3115a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uchar)
3125a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uchar2)
3135a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uchar3)
3145a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uchar4)
3155a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(short)
3165a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(short2)
3175a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(short3)
3185a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(short4)
3195a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ushort)
3205a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ushort2)
3215a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ushort3)
3225a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ushort4)
3235a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(int)
3245a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(int2)
3255a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(int3)
3265a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(int4)
3275a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uint)
3285a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uint2)
3295a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uint3)
3305a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uint4)
3315a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(long)
3325a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(long2)
3335a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(long3)
3345a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(long4)
3355a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ulong)
3365a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ulong2)
3375a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ulong3)
3385a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ulong4)
3392dcbc3d33443c1224085cab081b634f99327c159Pirama Arumuga NainarELEMENT_AT(half)
3402dcbc3d33443c1224085cab081b634f99327c159Pirama Arumuga NainarELEMENT_AT(half2)
3412dcbc3d33443c1224085cab081b634f99327c159Pirama Arumuga NainarELEMENT_AT(half3)
3422dcbc3d33443c1224085cab081b634f99327c159Pirama Arumuga NainarELEMENT_AT(half4)
3435a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(float)
3445a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(float2)
3455a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(float3)
3465a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(float4)
3475a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(double)
3485a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(double2)
3495a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(double3)
3505a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(double4)
3515a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
352cbdb6480528fc374144df1ae9c604c9100d33268Tim Murraytypedef unsigned long long ull;
353cbdb6480528fc374144df1ae9c604c9100d33268Tim Murraytypedef unsigned long long ull2 __attribute__((ext_vector_type(2)));
354cbdb6480528fc374144df1ae9c604c9100d33268Tim Murraytypedef unsigned long long ull3 __attribute__((ext_vector_type(3)));
355cbdb6480528fc374144df1ae9c604c9100d33268Tim Murraytypedef unsigned long long ull4 __attribute__((ext_vector_type(4)));
356cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray
357cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray#ifndef RS_DEBUG_RUNTIME
358f7f9316f4cf373733285f947bea876ead7216715Verena BeckhamSET_ELEMENT_AT_TYPE_IMPL(ull, ulong)
359f7f9316f4cf373733285f947bea876ead7216715Verena BeckhamSET_ELEMENT_AT_TYPE_IMPL(ull2, ulong2)
360f7f9316f4cf373733285f947bea876ead7216715Verena BeckhamSET_ELEMENT_AT_TYPE_IMPL(ull3, ulong3)
361f7f9316f4cf373733285f947bea876ead7216715Verena BeckhamSET_ELEMENT_AT_TYPE_IMPL(ull4, ulong4)
362f7f9316f4cf373733285f947bea876ead7216715Verena Beckham
363f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#undef SET_ELEMENT_AT_TYPE_DEF
364f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#undef GET_ELEMENT_AT_TYPE_DEF
365f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#undef SET_ELEMENT_AT_TYPE_IMPL
366f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#undef GET_ELEMENT_AT_TYPE_IMPL
367cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray#undef ELEMENT_AT_TYPE
368cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray#endif
369cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray
3705a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines#undef ELEMENT_AT
3715a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3725a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
373fb2a33d2532d2500bfc4da879f83761f9a01edebJean-Luc Brouilletextern uchar __attribute__((overloadable))
3745a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAtYuv_uchar_Y(rs_allocation a, uint32_t x, uint32_t y) {
3755a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return rsGetElementAt_uchar(a, x, y);
3765a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
3775a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
378fb2a33d2532d2500bfc4da879f83761f9a01edebJean-Luc Brouilletextern uchar __attribute__((overloadable))
3795a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAtYuv_uchar_U(rs_allocation a, uint32_t x, uint32_t y) {
3805a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3815a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
3825a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
38361656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    const size_t cstep = alloc->mHal.drvState.yuv.step;
38461656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    const size_t shift = alloc->mHal.drvState.yuv.shift;
3850052f8dcb5ebb5c9205a1d25445629fb5a772380Jason Sams    const size_t stride = alloc->mHal.drvState.lod[1].stride;
38661656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams
3870052f8dcb5ebb5c9205a1d25445629fb5a772380Jason Sams    const uchar *pin = (const uchar *)alloc->mHal.drvState.lod[1].mallocPtr;
38861656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams
38961656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    return pin[((x >> shift) * cstep) + ((y >> shift) * stride)];
3905a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
3915a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
392fb2a33d2532d2500bfc4da879f83761f9a01edebJean-Luc Brouilletextern uchar __attribute__((overloadable))
3935a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAtYuv_uchar_V(rs_allocation a, uint32_t x, uint32_t y) {
3945a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3955a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
3965a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
39761656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    const size_t cstep = alloc->mHal.drvState.yuv.step;
39861656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    const size_t shift = alloc->mHal.drvState.yuv.shift;
3990052f8dcb5ebb5c9205a1d25445629fb5a772380Jason Sams    const size_t stride = alloc->mHal.drvState.lod[2].stride;
40061656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams
4010052f8dcb5ebb5c9205a1d25445629fb5a772380Jason Sams    const uchar *pin = (const uchar *)alloc->mHal.drvState.lod[2].mallocPtr;
40261656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams
40361656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    return pin[((x >> shift) * cstep) + ((y >> shift) * stride)];
4045a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
4055a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
406f7f9316f4cf373733285f947bea876ead7216715Verena Beckham// The functions rsAllocationVLoadXImpl_T and rsAllocationVStoreXImpl_T are implemented in
407f7f9316f4cf373733285f947bea876ead7216715Verena Beckham// bitcode in ll32/allocation.ll and ll64/allocation.ll. To be able to provide debug info
408f7f9316f4cf373733285f947bea876ead7216715Verena Beckham// for these functions define them here instead, if we are linking with the debug library.
409f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#ifdef RS_G_RUNTIME
410f7f9316f4cf373733285f947bea876ead7216715Verena Beckham
411f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#define VOP_IMPL(T)                                                             \
412f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    void __rsAllocationVStoreXImpl_##T                                          \
413f7f9316f4cf373733285f947bea876ead7216715Verena Beckham            (rs_allocation a, const T val, uint32_t x, uint32_t y, uint32_t z) {\
414f7f9316f4cf373733285f947bea876ead7216715Verena Beckham        T *val_ptr = (T*)rsOffsetNs(a, x, y, z);                                \
415f7f9316f4cf373733285f947bea876ead7216715Verena Beckham        memcpy(val_ptr, &val, sizeof(T));                                       \
416f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    }                                                                           \
417f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    T __rsAllocationVLoadXImpl_##T                                              \
418f7f9316f4cf373733285f947bea876ead7216715Verena Beckham            (rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {             \
419f7f9316f4cf373733285f947bea876ead7216715Verena Beckham        T result = {};                                                          \
420f7f9316f4cf373733285f947bea876ead7216715Verena Beckham        T* val_ptr = (T*)rsOffsetNs(a, x, y, z);                                \
421f7f9316f4cf373733285f947bea876ead7216715Verena Beckham        memcpy(&result, val_ptr, sizeof(T));                                    \
422f7f9316f4cf373733285f947bea876ead7216715Verena Beckham        return result;                                                          \
423f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    }
424f7f9316f4cf373733285f947bea876ead7216715Verena Beckham
425f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#else
42641660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams
427f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#define VOP_IMPL(T)                                                          \
42841660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    extern void __rsAllocationVStoreXImpl_##T(rs_allocation a, const T val, uint32_t x, uint32_t y, uint32_t z); \
429f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    extern T __rsAllocationVLoadXImpl_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z);
430f7f9316f4cf373733285f947bea876ead7216715Verena Beckham
431f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#endif // RS_G_RUNTIME
432f7f9316f4cf373733285f947bea876ead7216715Verena Beckham
433f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#define VOP_DEF(T)                                                      \
43441660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    extern void __attribute__((overloadable))                           \
43541660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    rsAllocationVStoreX_##T(rs_allocation a, T val, uint32_t x) {       \
43641660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams        __rsAllocationVStoreXImpl_##T(a, val, x, 0, 0);                 \
43741660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    }                                                                   \
43841660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    extern void __attribute__((overloadable))                           \
43941660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    rsAllocationVStoreX_##T(rs_allocation a, T val, uint32_t x, uint32_t y) { \
44041660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams        __rsAllocationVStoreXImpl_##T(a, val, x, y, 0);                 \
44141660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    }                                                                   \
44241660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    extern void __attribute__((overloadable))                           \
44341660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    rsAllocationVStoreX_##T(rs_allocation a, T val, uint32_t x, uint32_t y, uint32_t z) { \
44441660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams        __rsAllocationVStoreXImpl_##T(a, val, x, y, z);                 \
44541660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    }                                                                   \
44641660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    extern T __attribute__((overloadable))                              \
44741660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    rsAllocationVLoadX_##T(rs_allocation a, uint32_t x) {               \
44841660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams        return __rsAllocationVLoadXImpl_##T(a, x, 0, 0);                \
44941660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    }                                                                   \
45041660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    extern T __attribute__((overloadable))                              \
45141660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    rsAllocationVLoadX_##T(rs_allocation a, uint32_t x, uint32_t y) {   \
45241660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams        return __rsAllocationVLoadXImpl_##T(a, x, y, 0);                \
45341660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    }                                                                   \
45441660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    extern T __attribute__((overloadable))                              \
45541660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    rsAllocationVLoadX_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) { \
45641660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams        return __rsAllocationVLoadXImpl_##T(a, x, y, z);                \
45741660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    }
45841660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams
459f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#define VOP(T) VOP_IMPL(T) \
460f7f9316f4cf373733285f947bea876ead7216715Verena Beckham    VOP_DEF(T)
461f7f9316f4cf373733285f947bea876ead7216715Verena Beckham
46241660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(char2)
46341660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(char3)
46441660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(char4)
46541660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(uchar2)
46641660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(uchar3)
46741660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(uchar4)
46841660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(short2)
46941660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(short3)
47041660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(short4)
47141660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(ushort2)
47241660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(ushort3)
47341660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(ushort4)
47441660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(int2)
47541660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(int3)
47641660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(int4)
47741660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(uint2)
47841660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(uint3)
47941660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(uint4)
48041660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(long2)
48141660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(long3)
48241660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(long4)
48341660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(ulong2)
48441660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(ulong3)
48541660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(ulong4)
48641660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(float2)
48741660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(float3)
48841660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(float4)
48941660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(double2)
49041660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(double3)
49141660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(double4)
49241660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams
493f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#undef VOP_IMPL
494f7f9316f4cf373733285f947bea876ead7216715Verena Beckham#undef VOP_DEF
49541660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams#undef VOP
4967cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
4977cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarstatic const rs_element kInvalidElement = {0};
4987cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
4997cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarextern rs_element __attribute__((overloadable)) rsCreateElement(
5007cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        int32_t dt, int32_t dk, bool isNormalized, uint32_t vecSize);
5017cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5027cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarextern rs_type __attribute__((overloadable)) rsCreateType(
5037cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    rs_element element, uint32_t dimX, uint32_t dimY, uint32_t dimZ,
5047cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    bool mipmaps, bool faces, rs_yuv_format yuv_format);
5057cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5067cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarextern rs_allocation __attribute__((overloadable)) rsCreateAllocation(
5077cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rs_type type, rs_allocation_mipmap_control mipmaps, uint32_t usages,
5087cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        void *ptr);
5097cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5107cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_element __attribute__((overloadable)) rsCreateElement(
5117cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rs_data_type data_type) {
5127cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5137cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    switch (data_type) {
5147cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_BOOLEAN:
5156f6a6837da3f4461f1796bdb4b694980ff8784dfPirama Arumuga Nainar        case RS_TYPE_FLOAT_16:
5167cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_FLOAT_32:
5177cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_FLOAT_64:
5187cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_8:
5197cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_16:
5207cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_32:
5217cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_64:
5227cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_8:
5237cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_16:
5247cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_32:
5257cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_64:
5267cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_MATRIX_4X4:
5277cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_MATRIX_3X3:
5287cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_MATRIX_2X2:
5297cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_ELEMENT:
5307cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_TYPE:
5317cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_ALLOCATION:
5327cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SCRIPT:
5337cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            return rsCreateElement(data_type, RS_KIND_USER, false, 1);
5347cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        default:
5357cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            rsDebug("Invalid data_type", data_type);
5367cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            return kInvalidElement;
5377cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
5387cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
5397cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5407cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_element __attribute__((overloadable)) rsCreateVectorElement(
5417cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rs_data_type data_type, uint32_t vector_width) {
5427cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    if (vector_width < 2 || vector_width > 4) {
5437cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rsDebug("Invalid vector_width", vector_width);
5447cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        return kInvalidElement;
5457cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
5467cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    switch (data_type) {
5477cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_BOOLEAN:
5486f6a6837da3f4461f1796bdb4b694980ff8784dfPirama Arumuga Nainar        case RS_TYPE_FLOAT_16:
5497cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_FLOAT_32:
5507cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_FLOAT_64:
5517cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_8:
5527cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_16:
5537cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_32:
5547cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_64:
5557cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_8:
5567cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_16:
5577cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_32:
5587cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_64:
5597cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            return rsCreateElement(data_type, RS_KIND_USER, false,
5607cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                                   vector_width);
5617cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        default:
5627cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            rsDebug("Invalid data_type for vector element", data_type);
5637cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            return kInvalidElement;
5647cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
5657cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
5667cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5677cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_element __attribute__((overloadable)) rsCreatePixelElement(
5687cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rs_data_type data_type, rs_data_kind data_kind) {
5697cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    if (data_type != RS_TYPE_UNSIGNED_8 &&
5707cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_type != RS_TYPE_UNSIGNED_16 &&
5717cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_type != RS_TYPE_UNSIGNED_5_6_5 &&
5727cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_type != RS_TYPE_UNSIGNED_4_4_4_4 &&
5737cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_type != RS_TYPE_UNSIGNED_5_5_5_1) {
5747cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5757cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rsDebug("Invalid data_type for pixel element", data_type);
5767cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        return kInvalidElement;
5777cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
5787cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    if (data_kind != RS_KIND_PIXEL_L &&
5797cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_A &&
5807cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_LA &&
5817cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_RGB &&
5827cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_RGBA &&
5837cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_DEPTH &&
5847cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_YUV) {
5857cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5867cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rsDebug("Invalid data_kind for pixel element", data_type);
5877cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        return kInvalidElement;
5887cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
5897cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    if (data_type == RS_TYPE_UNSIGNED_5_6_5 && data_kind != RS_KIND_PIXEL_RGB) {
5907cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rsDebug("Bad data_type and data_kind combo", data_type, data_kind);
5917cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        return kInvalidElement;
5927cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
5937cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    if (data_type == RS_TYPE_UNSIGNED_5_5_5_1 &&
5947cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_RGBA) {
5957cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5967cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rsDebug("Bad data_type and data_kind combo", data_type, data_kind);
5977cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        return kInvalidElement;
5987cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
5997cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    if (data_type == RS_TYPE_UNSIGNED_4_4_4_4 &&
6007cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_RGBA) {
6017cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
6027cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rsDebug("Bad data_type and data_kind combo", data_type, data_kind);
6037cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        return kInvalidElement;
6047cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
6057cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    if (data_type == RS_TYPE_UNSIGNED_16 && data_kind != RS_KIND_PIXEL_DEPTH) {
6067cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rsDebug("Bad data_type and data_kind combo", data_type, data_kind);
6077cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        return kInvalidElement;
6087cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
6097cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
6107cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    int vector_width = 1;
6117cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    switch (data_kind) {
6127cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_KIND_PIXEL_LA:
6137cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            vector_width = 2;
6147cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            break;
6157cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_KIND_PIXEL_RGB:
6167cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            vector_width = 3;
6177cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            break;
6187cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_KIND_PIXEL_RGBA:
6197cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            vector_width = 4;
6207cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            break;
6217cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_KIND_PIXEL_DEPTH:
6227cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            vector_width = 2;
6237cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            break;
624ab70dba4e1c76b6b7b6a1001fae3529b11ca6190Stephen Hines        default:
625ab70dba4e1c76b6b7b6a1001fae3529b11ca6190Stephen Hines            break;
6267cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
6277cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
6287cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    return rsCreateElement(data_type, data_kind, true, vector_width);
6297cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
6307cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
6317cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_type __attribute__((overloadable)) rsCreateType(rs_element element,
6327cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                                                   uint32_t dimX, uint32_t dimY,
6337cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                                                   uint32_t dimZ) {
6347cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    return rsCreateType(element, dimX, dimY, dimZ, false, false, RS_YUV_NONE);
6357cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
6367cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
6377cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_type __attribute__((overloadable)) rsCreateType(rs_element element,
6387cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                                                   uint32_t dimX,
6397cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                                                   uint32_t dimY) {
6407cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    return rsCreateType(element, dimX, dimY, 0, false, false, RS_YUV_NONE);
6417cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
6427cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
6437cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_type __attribute__((overloadable)) rsCreateType(rs_element element,
6447cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                                                   uint32_t dimX) {
6457cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    return rsCreateType(element, dimX, 0, 0, false, false, RS_YUV_NONE);
6467cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
6477cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
6487cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_allocation __attribute__((overloadable)) rsCreateAllocation(rs_type type,
6497cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                                                               uint32_t usage) {
6507cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    return rsCreateAllocation(type, RS_ALLOCATION_MIPMAP_NONE, usage, NULL);
6517cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
6527cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
6537cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_allocation __attribute__((overloadable)) rsCreateAllocation(rs_type type) {
6547cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    return rsCreateAllocation(type, RS_ALLOCATION_MIPMAP_NONE,
6557cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                              RS_ALLOCATION_USAGE_SCRIPT, NULL);
6567cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
657