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) {
40863237215cab4812df373b63ba3bbf2bc1d8647dJean-Luc Brouillet        rs_element nullElem = RS_NULL_OBJ;
415a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        return nullElem;
425a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }
435a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Type_t *type = (Type_t *)alloc->mHal.state.type;
44863237215cab4812df373b63ba3bbf2bc1d8647dJean-Luc Brouillet    rs_element returnElem = {
45863237215cab4812df373b63ba3bbf2bc1d8647dJean-Luc Brouillet        type->mHal.state.element
46863237215cab4812df373b63ba3bbf2bc1d8647dJean-Luc Brouillet#ifdef __LP64__
47863237215cab4812df373b63ba3bbf2bc1d8647dJean-Luc Brouillet        , 0, 0, 0
48863237215cab4812df373b63ba3bbf2bc1d8647dJean-Luc Brouillet#endif
49863237215cab4812df373b63ba3bbf2bc1d8647dJean-Luc Brouillet    };
50863237215cab4812df373b63ba3bbf2bc1d8647dJean-Luc Brouillet    rs_element rs_retval = RS_NULL_OBJ;
510b8411471e7d2d332610ec16f555ab8cc434d167Yang Ni    rsSetObject(&rs_retval, returnElem);
520b8411471e7d2d332610ec16f555ab8cc434d167Yang Ni    return rs_retval;
535a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
545a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
555a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines// TODO: this needs to be optimized, obviously
566fb5a4f5411c16d36f123c7c2c9add4d937479efVerena Beckhamstatic void local_memcpy(void* dst, const void* src, size_t size) {
574c01362afa871fcde6c269bc0ba3defa9e76de49Dean De Leo    char* dst_c = (char*) dst;
584c01362afa871fcde6c269bc0ba3defa9e76de49Dean De Leo    const char* src_c = (const char*) src;
595a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    for (; size > 0; size--) {
605a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        *dst_c++ = *src_c++;
615a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }
625a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
635a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
642eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Gross#ifndef RS_DEBUG_RUNTIME
652eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Grossuint8_t*
662eb797d9c2baa32597f973c026bfffc96cc8cfefDavid GrossrsOffset(rs_allocation a, uint32_t sizeOf, uint32_t x, uint32_t y,
672eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Gross         uint32_t z) {
682eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Gross    Allocation_t *alloc = (Allocation_t *)a.p;
692eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Gross    uint8_t *p = (uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
702eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Gross    const uint32_t stride = (uint32_t)alloc->mHal.drvState.lod[0].stride;
712eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Gross    const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
722eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Gross    uint8_t *dp = &p[(sizeOf * x) + (y * stride) +
732eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Gross                     (z * stride * dimY)];
742eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Gross    return dp;
752eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Gross}
762eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Gross#endif
772eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Gross
782eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Grossuint8_t*
792eb797d9c2baa32597f973c026bfffc96cc8cfefDavid GrossrsOffsetNs(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {
802eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Gross    Allocation_t *alloc = (Allocation_t *)a.p;
812eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Gross    uint8_t *p = (uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
822eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Gross    const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
832eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Gross    const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
842eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Gross    const uint32_t sizeOf = alloc->mHal.state.elementSizeBytes;;
852eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Gross    uint8_t *dp = &p[(sizeOf * x) + (y * stride) +
862eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Gross                     (z * stride * dimY)];
872eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Gross    return dp;
882eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Gross}
892eb797d9c2baa32597f973c026bfffc96cc8cfefDavid Gross
905a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines#ifdef RS_DEBUG_RUNTIME
915a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines#define ELEMENT_AT(T)                                                   \
925a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
935a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt_##T(rs_allocation a, const T *val, uint32_t x);  \
945a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
955a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt_##T(rs_allocation a, const T *val, uint32_t x, uint32_t y); \
965a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
975a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt_##T(rs_allocation a, const T *val, uint32_t x, uint32_t y, uint32_t z); \
985a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
995a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt_##T(rs_allocation a, T *val, uint32_t x);  \
1005a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
1015a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt_##T(rs_allocation a, T *val, uint32_t x, uint32_t y); \
1025a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
1035a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt_##T(rs_allocation a, T *val, uint32_t x, uint32_t y, uint32_t z); \
1045a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines                                                                        \
1055a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
1065a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    rsSetElementAt_##T(rs_allocation a, T val, uint32_t x) {            \
1075a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt_##T(a, &val, x);                                 \
1085a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
1095a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
1105a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y) { \
1115a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt_##T(a, &val, x, y);                              \
1125a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
1135a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
1145a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y, uint32_t z) { \
1155a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt_##T(a, &val, x, y, z);                           \
1165a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
1175a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern T __attribute__((overloadable))                              \
1185a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    rsGetElementAt_##T(rs_allocation a, uint32_t x) {                   \
1195a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        T tmp;                                                          \
1205a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt_##T(a, &tmp, x);                                 \
1215a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        return tmp;                                                     \
1225a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
1235a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern T __attribute__((overloadable))                              \
1245a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y) {       \
1255a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        T tmp;                                                          \
1265a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt_##T(a, &tmp, x, y);                              \
1275a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        return tmp;                                                     \
1285a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
1295a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern T __attribute__((overloadable))                              \
1305a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) { \
1315a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        T tmp;                                                          \
1325a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt_##T(a, &tmp, x, y, z);                           \
1335a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        return tmp;                                                     \
1345a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }
135863237215cab4812df373b63ba3bbf2bc1d8647dJean-Luc Brouillet#else  // NOT RS_DEBUG_RUNTIME
13698f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser
137fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham// The functions rsSetElementAtImpl_T and rsGetElementAtImpl_T are implemented in bitcode
138fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham// in ll32/allocation.ll and ll64/allocation.ll. To be able to provide debug info for
139fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham// these functions define them here instead, if we are linking with the debug library.
140fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#ifdef RS_G_RUNTIME
141fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
142fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define SET_ELEMENT_AT_IMPL_TYPE_SIZE(typename, size)                               \
143fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham     void rsSetElementAtImpl_##typename                                             \
144fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham            (rs_allocation a, typename val, uint32_t x, uint32_t y, uint32_t z) {   \
145fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham        typename* val_ptr = (typename*)rsOffset(a, size, x, y, z);                  \
146fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham        *val_ptr = val;                                                             \
147fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    }
148fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
149fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define GET_ELEMENT_AT_IMPL_TYPE_SIZE(typename, size)                               \
150fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham     typename rsGetElementAtImpl_##typename                                         \
151fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham            (rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {                 \
152fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham        typename *val_ptr = (typename*)rsOffset(a, size, x, y, z);                  \
153fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham        return *val_ptr;                                                            \
154fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    }
155fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
156fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define SET_ELEMENT_AT_IMPL_TYPE(typename)          \
157fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    SET_ELEMENT_AT_IMPL_TYPE_SIZE(typename, sizeof(typename))        \
158fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    SET_ELEMENT_AT_IMPL_TYPE_SIZE(typename##2, sizeof(typename)*2)   \
159fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    SET_ELEMENT_AT_IMPL_TYPE_SIZE(typename##3, sizeof(typename)*4)   \
160fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    SET_ELEMENT_AT_IMPL_TYPE_SIZE(typename##4, sizeof(typename)*4)
161fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
162fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define GET_ELEMENT_AT_IMPL_TYPE(typename)          \
163fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    GET_ELEMENT_AT_IMPL_TYPE_SIZE(typename, sizeof(typename))        \
164fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    GET_ELEMENT_AT_IMPL_TYPE_SIZE(typename##2, sizeof(typename)*2)   \
165fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    GET_ELEMENT_AT_IMPL_TYPE_SIZE(typename##3, sizeof(typename)*4)   \
166fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    GET_ELEMENT_AT_IMPL_TYPE_SIZE(typename##4, sizeof(typename)*4)
167fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
168fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define ELEMENT_AT_IMPL_TYPE(typename)  \
169fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    SET_ELEMENT_AT_IMPL_TYPE(typename)  \
170fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    GET_ELEMENT_AT_IMPL_TYPE(typename)
171fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
172fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena BeckhamELEMENT_AT_IMPL_TYPE(char)
173fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena BeckhamELEMENT_AT_IMPL_TYPE(uchar)
174fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena BeckhamELEMENT_AT_IMPL_TYPE(short)
175fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena BeckhamELEMENT_AT_IMPL_TYPE(ushort)
176fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena BeckhamELEMENT_AT_IMPL_TYPE(int)
177fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena BeckhamELEMENT_AT_IMPL_TYPE(uint)
178fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena BeckhamELEMENT_AT_IMPL_TYPE(long)
179fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena BeckhamELEMENT_AT_IMPL_TYPE(ulong)
180fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena BeckhamELEMENT_AT_IMPL_TYPE(half)
181fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena BeckhamELEMENT_AT_IMPL_TYPE(float)
182fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena BeckhamELEMENT_AT_IMPL_TYPE(double)
183fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
184fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#undef ELEMENT_AT_IMPL_TYPE
185fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#undef GET_ELEMENT_AT_IMPL_TYPE
186fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#undef SET_ELEMENT_AT_IMPL_TYPE
187fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#undef GET_ELEMENT_AT_IMPL_TYPE_SIZE
188fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#undef SET_ELEMENT_AT_IMPL_TYPE_SIZE
189fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
190fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define SET_ELEMENT_AT_TYPE_IMPL(T, typename) /* nothing */
191fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define GET_ELEMENT_AT_TYPE_IMPL(T, typename) /* nothing */
192fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
193863237215cab4812df373b63ba3bbf2bc1d8647dJean-Luc Brouillet#else  //NOT RS_G_RUNTIME
194fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
195fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define SET_ELEMENT_AT_TYPE_IMPL(T, typename)                                    \
1961ed5ef9b253850a199eecff6b7941e57c408e509Tobias Grosser    void                                                                \
197cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    rsSetElementAtImpl_##typename(rs_allocation a, typename val, uint32_t x,   \
198fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham                                  uint32_t y, uint32_t z);
199fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
200fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define GET_ELEMENT_AT_TYPE_IMPL(T, typename)                                \
201fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    typename                                                            \
202fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    rsGetElementAtImpl_##typename(rs_allocation a, uint32_t x, uint32_t y, \
203fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham                                  uint32_t z);
204fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
205fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#endif //RS_G_RUNTIME
206fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
207fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define SET_ELEMENT_AT_TYPE_DEF(T, typename)                                    \
2085a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
209cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    rsSetElementAt_##typename(rs_allocation a, T val, uint32_t x) {     \
210cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray        rsSetElementAtImpl_##typename(a, (typename)val, x, 0, 0);              \
2115a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
21298f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser                                                                        \
2135a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
214cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    rsSetElementAt_##typename(rs_allocation a, T val, uint32_t x,       \
215cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray                              uint32_t y) {                             \
216cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray        rsSetElementAtImpl_##typename(a, (typename)val, x, y, 0);              \
2175a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
21898f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser                                                                        \
2195a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
220cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    rsSetElementAt_##typename(rs_allocation a, T val, uint32_t x, uint32_t y, \
221cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray                              uint32_t z) {                             \
222cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray        rsSetElementAtImpl_##typename(a, (typename)val, x, y, z);              \
223fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    }
224cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray
225fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define GET_ELEMENT_AT_TYPE_DEF(T, typename)                                \
226cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    extern typename __attribute__((overloadable))                       \
227cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    rsGetElementAt_##typename(rs_allocation a, uint32_t x) {            \
228cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray        return (typename)rsGetElementAtImpl_##typename(a, x, 0, 0);     \
2295a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
23098f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser                                                                        \
231cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    extern typename __attribute__((overloadable))                       \
232cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    rsGetElementAt_##typename(rs_allocation a, uint32_t x, uint32_t y) { \
233cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray        return (typename)rsGetElementAtImpl_##typename(a, x, y, 0);     \
2345a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
23598f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser                                                                        \
236cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    extern typename __attribute__((overloadable))                       \
237cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    rsGetElementAt_##typename(rs_allocation a, uint32_t x, uint32_t y,  \
238cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray                              uint32_t z) {                             \
239cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray        return (typename)rsGetElementAtImpl_##typename(a, x, y, z);     \
2405a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }
2415a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
242fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define SET_ELEMENT_AT(T) SET_ELEMENT_AT_TYPE_IMPL(T, T) \
243fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    SET_ELEMENT_AT_TYPE_DEF(T, T)
244fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define GET_ELEMENT_AT(T) GET_ELEMENT_AT_TYPE_IMPL(T, T) \
245fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    GET_ELEMENT_AT_TYPE_DEF(T, T)
246cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray
247cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray#define ELEMENT_AT(T)                           \
248cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    SET_ELEMENT_AT(T)                           \
249cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    GET_ELEMENT_AT(T)
2505a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
251b5a918ef5de4087d88ac9d17781c7cad59420fa2I-Jui (Ray) Sung#endif // RS_DEBUG_RUNTIME
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;
2846fb5a4f5411c16d36f123c7c2c9add4d937479efVerena Beckham    local_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;
2936fb5a4f5411c16d36f123c7c2c9add4d937479efVerena Beckham    local_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;
3036fb5a4f5411c16d36f123c7c2c9add4d937479efVerena Beckham    local_memcpy((void*)&p[(eSize * x) + (y * stride) + (z * stride * dimY)], ptr, eSize);
3045a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
3055a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3065a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(char)
3075a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(char2)
3085a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(char3)
3095a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(char4)
3105a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uchar)
3115a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uchar2)
3125a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uchar3)
3135a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uchar4)
3145a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(short)
3155a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(short2)
3165a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(short3)
3175a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(short4)
3185a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ushort)
3195a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ushort2)
3205a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ushort3)
3215a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ushort4)
3225a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(int)
3235a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(int2)
3245a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(int3)
3255a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(int4)
3265a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uint)
3275a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uint2)
3285a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uint3)
3295a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uint4)
3305a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(long)
3315a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(long2)
3325a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(long3)
3335a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(long4)
3345a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ulong)
3355a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ulong2)
3365a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ulong3)
3375a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ulong4)
3382dcbc3d33443c1224085cab081b634f99327c159Pirama Arumuga NainarELEMENT_AT(half)
3392dcbc3d33443c1224085cab081b634f99327c159Pirama Arumuga NainarELEMENT_AT(half2)
3402dcbc3d33443c1224085cab081b634f99327c159Pirama Arumuga NainarELEMENT_AT(half3)
3412dcbc3d33443c1224085cab081b634f99327c159Pirama Arumuga NainarELEMENT_AT(half4)
3425a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(float)
3435a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(float2)
3445a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(float3)
3455a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(float4)
3465a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(double)
3475a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(double2)
3485a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(double3)
3495a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(double4)
3505a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
351cbdb6480528fc374144df1ae9c604c9100d33268Tim Murraytypedef unsigned long long ull;
352cbdb6480528fc374144df1ae9c604c9100d33268Tim Murraytypedef unsigned long long ull2 __attribute__((ext_vector_type(2)));
353cbdb6480528fc374144df1ae9c604c9100d33268Tim Murraytypedef unsigned long long ull3 __attribute__((ext_vector_type(3)));
354cbdb6480528fc374144df1ae9c604c9100d33268Tim Murraytypedef unsigned long long ull4 __attribute__((ext_vector_type(4)));
355cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray
356cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray#ifndef RS_DEBUG_RUNTIME
357fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena BeckhamSET_ELEMENT_AT_TYPE_IMPL(ull, ulong)
358fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena BeckhamSET_ELEMENT_AT_TYPE_IMPL(ull2, ulong2)
359fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena BeckhamSET_ELEMENT_AT_TYPE_IMPL(ull3, ulong3)
360fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena BeckhamSET_ELEMENT_AT_TYPE_IMPL(ull4, ulong4)
361fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
362fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#undef SET_ELEMENT_AT_TYPE_DEF
363fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#undef GET_ELEMENT_AT_TYPE_DEF
364fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#undef SET_ELEMENT_AT_TYPE_IMPL
365fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#undef GET_ELEMENT_AT_TYPE_IMPL
366cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray#undef ELEMENT_AT_TYPE
367cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray#endif
368cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray
3695a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines#undef ELEMENT_AT
3705a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3715a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
372fb2a33d2532d2500bfc4da879f83761f9a01edebJean-Luc Brouilletextern uchar __attribute__((overloadable))
3735a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAtYuv_uchar_Y(rs_allocation a, uint32_t x, uint32_t y) {
3745a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return rsGetElementAt_uchar(a, x, y);
3755a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
3765a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
377fb2a33d2532d2500bfc4da879f83761f9a01edebJean-Luc Brouilletextern uchar __attribute__((overloadable))
3785a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAtYuv_uchar_U(rs_allocation a, uint32_t x, uint32_t y) {
3795a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3805a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
3815a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
38261656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    const size_t cstep = alloc->mHal.drvState.yuv.step;
38361656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    const size_t shift = alloc->mHal.drvState.yuv.shift;
3840052f8dcb5ebb5c9205a1d25445629fb5a772380Jason Sams    const size_t stride = alloc->mHal.drvState.lod[1].stride;
38561656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams
3860052f8dcb5ebb5c9205a1d25445629fb5a772380Jason Sams    const uchar *pin = (const uchar *)alloc->mHal.drvState.lod[1].mallocPtr;
38761656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams
38861656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    return pin[((x >> shift) * cstep) + ((y >> shift) * stride)];
3895a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
3905a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
391fb2a33d2532d2500bfc4da879f83761f9a01edebJean-Luc Brouilletextern uchar __attribute__((overloadable))
3925a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAtYuv_uchar_V(rs_allocation a, uint32_t x, uint32_t y) {
3935a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3945a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
3955a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
39661656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    const size_t cstep = alloc->mHal.drvState.yuv.step;
39761656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    const size_t shift = alloc->mHal.drvState.yuv.shift;
3980052f8dcb5ebb5c9205a1d25445629fb5a772380Jason Sams    const size_t stride = alloc->mHal.drvState.lod[2].stride;
39961656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams
4000052f8dcb5ebb5c9205a1d25445629fb5a772380Jason Sams    const uchar *pin = (const uchar *)alloc->mHal.drvState.lod[2].mallocPtr;
40161656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams
40261656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    return pin[((x >> shift) * cstep) + ((y >> shift) * stride)];
4035a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
4045a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
405fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham// The functions rsAllocationVLoadXImpl_T and rsAllocationVStoreXImpl_T are implemented in
406fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham// bitcode in ll32/allocation.ll and ll64/allocation.ll. To be able to provide debug info
407fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham// for these functions define them here instead, if we are linking with the debug library.
408fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#ifdef RS_G_RUNTIME
409fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
410fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define VOP_IMPL(T)                                                             \
411fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    void __rsAllocationVStoreXImpl_##T                                          \
412fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham            (rs_allocation a, const T val, uint32_t x, uint32_t y, uint32_t z) {\
413fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham        T *val_ptr = (T*)rsOffsetNs(a, x, y, z);                                \
4146fb5a4f5411c16d36f123c7c2c9add4d937479efVerena Beckham        local_memcpy(val_ptr, &val, sizeof(T));                                       \
415fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    }                                                                           \
416fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    T __rsAllocationVLoadXImpl_##T                                              \
417fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham            (rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {             \
418fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham        T result = {};                                                          \
419fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham        T* val_ptr = (T*)rsOffsetNs(a, x, y, z);                                \
4206fb5a4f5411c16d36f123c7c2c9add4d937479efVerena Beckham        local_memcpy(&result, val_ptr, sizeof(T));                                    \
421fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham        return result;                                                          \
422fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    }
423fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
424fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#else
42541660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams
426fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define VOP_IMPL(T)                                                          \
42741660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    extern void __rsAllocationVStoreXImpl_##T(rs_allocation a, const T val, uint32_t x, uint32_t y, uint32_t z); \
428fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    extern T __rsAllocationVLoadXImpl_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z);
429fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
430fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#endif // RS_G_RUNTIME
431fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
432fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define VOP_DEF(T)                                                      \
43341660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    extern void __attribute__((overloadable))                           \
43441660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    rsAllocationVStoreX_##T(rs_allocation a, T val, uint32_t x) {       \
43541660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams        __rsAllocationVStoreXImpl_##T(a, val, x, 0, 0);                 \
43641660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    }                                                                   \
43741660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    extern void __attribute__((overloadable))                           \
43841660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    rsAllocationVStoreX_##T(rs_allocation a, T val, uint32_t x, uint32_t y) { \
43941660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams        __rsAllocationVStoreXImpl_##T(a, val, x, y, 0);                 \
44041660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    }                                                                   \
44141660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    extern void __attribute__((overloadable))                           \
44241660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    rsAllocationVStoreX_##T(rs_allocation a, T val, uint32_t x, uint32_t y, uint32_t z) { \
44341660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams        __rsAllocationVStoreXImpl_##T(a, val, x, y, z);                 \
44441660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    }                                                                   \
44541660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    extern T __attribute__((overloadable))                              \
44641660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    rsAllocationVLoadX_##T(rs_allocation a, uint32_t x) {               \
44741660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams        return __rsAllocationVLoadXImpl_##T(a, x, 0, 0);                \
44841660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    }                                                                   \
44941660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    extern T __attribute__((overloadable))                              \
45041660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    rsAllocationVLoadX_##T(rs_allocation a, uint32_t x, uint32_t y) {   \
45141660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams        return __rsAllocationVLoadXImpl_##T(a, x, y, 0);                \
45241660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    }                                                                   \
45341660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    extern T __attribute__((overloadable))                              \
45441660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    rsAllocationVLoadX_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) { \
45541660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams        return __rsAllocationVLoadXImpl_##T(a, x, y, z);                \
45641660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    }
45741660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams
458fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define VOP(T) VOP_IMPL(T) \
459fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    VOP_DEF(T)
460fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
46141660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(char2)
46241660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(char3)
46341660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(char4)
46441660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(uchar2)
46541660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(uchar3)
46641660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(uchar4)
46741660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(short2)
46841660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(short3)
46941660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(short4)
47041660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(ushort2)
47141660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(ushort3)
47241660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(ushort4)
47341660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(int2)
47441660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(int3)
47541660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(int4)
47641660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(uint2)
47741660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(uint3)
47841660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(uint4)
47941660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(long2)
48041660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(long3)
48141660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(long4)
48241660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(ulong2)
48341660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(ulong3)
48441660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(ulong4)
48541660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(float2)
48641660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(float3)
48741660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(float4)
48841660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(double2)
48941660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(double3)
49041660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(double4)
49141660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams
492fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#undef VOP_IMPL
493fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#undef VOP_DEF
49441660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams#undef VOP
4957cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
496863237215cab4812df373b63ba3bbf2bc1d8647dJean-Luc Brouilletstatic const rs_element kInvalidElement = RS_NULL_OBJ;
4977cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
4987cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarextern rs_element __attribute__((overloadable)) rsCreateElement(
4997cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        int32_t dt, int32_t dk, bool isNormalized, uint32_t vecSize);
5007cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5017cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarextern rs_type __attribute__((overloadable)) rsCreateType(
5027cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    rs_element element, uint32_t dimX, uint32_t dimY, uint32_t dimZ,
5037cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    bool mipmaps, bool faces, rs_yuv_format yuv_format);
5047cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5057cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarextern rs_allocation __attribute__((overloadable)) rsCreateAllocation(
5067cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rs_type type, rs_allocation_mipmap_control mipmaps, uint32_t usages,
5077cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        void *ptr);
5087cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5097cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_element __attribute__((overloadable)) rsCreateElement(
5107cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rs_data_type data_type) {
5117cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5127cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    switch (data_type) {
5137cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_BOOLEAN:
5147e1013b9461a07d42df05b2c6f7e73ec6518b82aPirama Arumuga Nainar        case RS_TYPE_FLOAT_16:
5157cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_FLOAT_32:
5167cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_FLOAT_64:
5177cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_8:
5187cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_16:
5197cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_32:
5207cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_64:
5217cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_8:
5227cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_16:
5237cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_32:
5247cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_64:
5257cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_MATRIX_4X4:
5267cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_MATRIX_3X3:
5277cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_MATRIX_2X2:
5287cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_ELEMENT:
5297cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_TYPE:
5307cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_ALLOCATION:
5317cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SCRIPT:
5327cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            return rsCreateElement(data_type, RS_KIND_USER, false, 1);
5337cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        default:
5347cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            rsDebug("Invalid data_type", data_type);
5357cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            return kInvalidElement;
5367cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
5377cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
5387cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5397cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_element __attribute__((overloadable)) rsCreateVectorElement(
5407cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rs_data_type data_type, uint32_t vector_width) {
5417cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    if (vector_width < 2 || vector_width > 4) {
5427cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rsDebug("Invalid vector_width", vector_width);
5437cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        return kInvalidElement;
5447cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
5457cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    switch (data_type) {
5467cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_BOOLEAN:
5477e1013b9461a07d42df05b2c6f7e73ec6518b82aPirama Arumuga Nainar        case RS_TYPE_FLOAT_16:
5487cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_FLOAT_32:
5497cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_FLOAT_64:
5507cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_8:
5517cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_16:
5527cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_32:
5537cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_64:
5547cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_8:
5557cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_16:
5567cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_32:
5577cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_64:
5587cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            return rsCreateElement(data_type, RS_KIND_USER, false,
5597cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                                   vector_width);
5607cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        default:
5617cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            rsDebug("Invalid data_type for vector element", data_type);
5627cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            return kInvalidElement;
5637cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
5647cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
5657cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5667cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_element __attribute__((overloadable)) rsCreatePixelElement(
5677cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rs_data_type data_type, rs_data_kind data_kind) {
5687cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    if (data_type != RS_TYPE_UNSIGNED_8 &&
5697cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_type != RS_TYPE_UNSIGNED_16 &&
5707cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_type != RS_TYPE_UNSIGNED_5_6_5 &&
5717cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_type != RS_TYPE_UNSIGNED_4_4_4_4 &&
5727cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_type != RS_TYPE_UNSIGNED_5_5_5_1) {
5737cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5747cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rsDebug("Invalid data_type for pixel element", data_type);
5757cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        return kInvalidElement;
5767cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
5777cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    if (data_kind != RS_KIND_PIXEL_L &&
5787cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_A &&
5797cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_LA &&
5807cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_RGB &&
5817cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_RGBA &&
5827cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_DEPTH &&
5837cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_YUV) {
5847cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5857cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rsDebug("Invalid data_kind for pixel element", data_type);
5867cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        return kInvalidElement;
5877cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
5887cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    if (data_type == RS_TYPE_UNSIGNED_5_6_5 && data_kind != RS_KIND_PIXEL_RGB) {
5897cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rsDebug("Bad data_type and data_kind combo", data_type, data_kind);
5907cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        return kInvalidElement;
5917cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
5927cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    if (data_type == RS_TYPE_UNSIGNED_5_5_5_1 &&
5937cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_RGBA) {
5947cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5957cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rsDebug("Bad data_type and data_kind combo", data_type, data_kind);
5967cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        return kInvalidElement;
5977cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
5987cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    if (data_type == RS_TYPE_UNSIGNED_4_4_4_4 &&
5997cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_RGBA) {
6007cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
6017cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rsDebug("Bad data_type and data_kind combo", data_type, data_kind);
6027cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        return kInvalidElement;
6037cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
6047cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    if (data_type == RS_TYPE_UNSIGNED_16 && data_kind != RS_KIND_PIXEL_DEPTH) {
6057cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rsDebug("Bad data_type and data_kind combo", data_type, data_kind);
6067cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        return kInvalidElement;
6077cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
6087cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
6097cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    int vector_width = 1;
6107cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    switch (data_kind) {
6117cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_KIND_PIXEL_LA:
6127cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            vector_width = 2;
6137cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            break;
6147cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_KIND_PIXEL_RGB:
6157cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            vector_width = 3;
6167cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            break;
6177cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_KIND_PIXEL_RGBA:
6187cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            vector_width = 4;
6197cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            break;
6207cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_KIND_PIXEL_DEPTH:
6217cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            vector_width = 2;
6227cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            break;
623f72e74660567181b79673f2a476a6957db2507e5Stephen Hines        default:
624f72e74660567181b79673f2a476a6957db2507e5Stephen Hines            break;
6257cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
6267cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
6277cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    return rsCreateElement(data_type, data_kind, true, vector_width);
6287cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
6297cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
6307cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_type __attribute__((overloadable)) rsCreateType(rs_element element,
6317cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                                                   uint32_t dimX, uint32_t dimY,
6327cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                                                   uint32_t dimZ) {
6337cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    return rsCreateType(element, dimX, dimY, dimZ, false, false, RS_YUV_NONE);
6347cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
6357cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
6367cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_type __attribute__((overloadable)) rsCreateType(rs_element element,
6377cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                                                   uint32_t dimX,
6387cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                                                   uint32_t dimY) {
6397cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    return rsCreateType(element, dimX, dimY, 0, false, false, RS_YUV_NONE);
6407cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
6417cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
6427cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_type __attribute__((overloadable)) rsCreateType(rs_element element,
6437cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                                                   uint32_t dimX) {
6447cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    return rsCreateType(element, dimX, 0, 0, false, false, RS_YUV_NONE);
6457cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
6467cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
6477cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_allocation __attribute__((overloadable)) rsCreateAllocation(rs_type type,
6487cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                                                               uint32_t usage) {
6497cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    return rsCreateAllocation(type, RS_ALLOCATION_MIPMAP_NONE, usage, NULL);
6507cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
6517cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
6527cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_allocation __attribute__((overloadable)) rsCreateAllocation(rs_type type) {
6537cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    return rsCreateAllocation(type, RS_ALLOCATION_MIPMAP_NONE,
6547cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                              RS_ALLOCATION_USAGE_SCRIPT, NULL);
6557cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
656