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
64f4882cb90cacad9db128e6d7f06b553258f843ffDavid Grossuint8_t*
65f4882cb90cacad9db128e6d7f06b553258f843ffDavid GrossrsOffset(rs_allocation a, uint32_t sizeOf, uint32_t x, uint32_t y,
66f4882cb90cacad9db128e6d7f06b553258f843ffDavid Gross         uint32_t z) {
67f4882cb90cacad9db128e6d7f06b553258f843ffDavid Gross    Allocation_t *alloc = (Allocation_t *)a.p;
68f4882cb90cacad9db128e6d7f06b553258f843ffDavid Gross    uint8_t *p = (uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
69f4882cb90cacad9db128e6d7f06b553258f843ffDavid Gross    const uint32_t stride = (uint32_t)alloc->mHal.drvState.lod[0].stride;
70f4882cb90cacad9db128e6d7f06b553258f843ffDavid Gross    const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
71f4882cb90cacad9db128e6d7f06b553258f843ffDavid Gross    uint8_t *dp = &p[(sizeOf * x) + (y * stride) +
72f4882cb90cacad9db128e6d7f06b553258f843ffDavid Gross                     (z * stride * dimY)];
73f4882cb90cacad9db128e6d7f06b553258f843ffDavid Gross    return dp;
74f4882cb90cacad9db128e6d7f06b553258f843ffDavid Gross}
75f4882cb90cacad9db128e6d7f06b553258f843ffDavid Gross
76f4882cb90cacad9db128e6d7f06b553258f843ffDavid Grossuint8_t*
77f4882cb90cacad9db128e6d7f06b553258f843ffDavid GrossrsOffsetNs(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {
78f4882cb90cacad9db128e6d7f06b553258f843ffDavid Gross    Allocation_t *alloc = (Allocation_t *)a.p;
79f4882cb90cacad9db128e6d7f06b553258f843ffDavid Gross    uint8_t *p = (uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
80f4882cb90cacad9db128e6d7f06b553258f843ffDavid Gross    const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
81f4882cb90cacad9db128e6d7f06b553258f843ffDavid Gross    const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
82f4882cb90cacad9db128e6d7f06b553258f843ffDavid Gross    const uint32_t sizeOf = alloc->mHal.state.elementSizeBytes;;
83f4882cb90cacad9db128e6d7f06b553258f843ffDavid Gross    uint8_t *dp = &p[(sizeOf * x) + (y * stride) +
84f4882cb90cacad9db128e6d7f06b553258f843ffDavid Gross                     (z * stride * dimY)];
85f4882cb90cacad9db128e6d7f06b553258f843ffDavid Gross    return dp;
86f4882cb90cacad9db128e6d7f06b553258f843ffDavid Gross}
87f4882cb90cacad9db128e6d7f06b553258f843ffDavid Gross
885a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines#ifdef RS_DEBUG_RUNTIME
895a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines#define ELEMENT_AT(T)                                                   \
905a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
915a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt_##T(rs_allocation a, const T *val, uint32_t x);  \
925a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
935a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt_##T(rs_allocation a, const T *val, uint32_t x, uint32_t y); \
945a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
955a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt_##T(rs_allocation a, const T *val, uint32_t x, uint32_t y, uint32_t z); \
965a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
975a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt_##T(rs_allocation a, T *val, uint32_t x);  \
985a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
995a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt_##T(rs_allocation a, T *val, uint32_t x, uint32_t y); \
1005a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
1015a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt_##T(rs_allocation a, T *val, uint32_t x, uint32_t y, uint32_t z); \
1025a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines                                                                        \
1035a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
1045a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    rsSetElementAt_##T(rs_allocation a, T val, uint32_t x) {            \
1055a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt_##T(a, &val, x);                                 \
1065a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
1075a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
1085a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y) { \
1095a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt_##T(a, &val, x, y);                              \
1105a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
1115a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
1125a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y, uint32_t z) { \
1135a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt_##T(a, &val, x, y, z);                           \
1145a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
1155a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern T __attribute__((overloadable))                              \
1165a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    rsGetElementAt_##T(rs_allocation a, uint32_t x) {                   \
1175a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        T tmp;                                                          \
1185a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt_##T(a, &tmp, x);                                 \
1195a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        return tmp;                                                     \
1205a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
1215a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern T __attribute__((overloadable))                              \
1225a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y) {       \
1235a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        T tmp;                                                          \
1245a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt_##T(a, &tmp, x, y);                              \
1255a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        return tmp;                                                     \
1265a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
1275a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern T __attribute__((overloadable))                              \
1285a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) { \
1295a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        T tmp;                                                          \
1305a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt_##T(a, &tmp, x, y, z);                           \
1315a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        return tmp;                                                     \
1325a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }
133863237215cab4812df373b63ba3bbf2bc1d8647dJean-Luc Brouillet#else  // NOT RS_DEBUG_RUNTIME
13498f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser
135fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define SET_ELEMENT_AT_TYPE_IMPL(T, typename)                                    \
1361ed5ef9b253850a199eecff6b7941e57c408e509Tobias Grosser    void                                                                \
137cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    rsSetElementAtImpl_##typename(rs_allocation a, typename val, uint32_t x,   \
138fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham                                  uint32_t y, uint32_t z);
139fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
140fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define GET_ELEMENT_AT_TYPE_IMPL(T, typename)                                \
141fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    typename                                                            \
142fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    rsGetElementAtImpl_##typename(rs_allocation a, uint32_t x, uint32_t y, \
143fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham                                  uint32_t z);
144fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
145fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define SET_ELEMENT_AT_TYPE_DEF(T, typename)                                    \
1465a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
147cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    rsSetElementAt_##typename(rs_allocation a, T val, uint32_t x) {     \
148cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray        rsSetElementAtImpl_##typename(a, (typename)val, x, 0, 0);              \
1495a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
15098f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser                                                                        \
1515a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
152cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    rsSetElementAt_##typename(rs_allocation a, T val, uint32_t x,       \
153cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray                              uint32_t y) {                             \
154cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray        rsSetElementAtImpl_##typename(a, (typename)val, x, y, 0);              \
1555a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
15698f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser                                                                        \
1575a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    extern void __attribute__((overloadable))                           \
158cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    rsSetElementAt_##typename(rs_allocation a, T val, uint32_t x, uint32_t y, \
159cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray                              uint32_t z) {                             \
160cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray        rsSetElementAtImpl_##typename(a, (typename)val, x, y, z);              \
161fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    }
162cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray
163fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define GET_ELEMENT_AT_TYPE_DEF(T, typename)                                \
164cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    extern typename __attribute__((overloadable))                       \
165cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    rsGetElementAt_##typename(rs_allocation a, uint32_t x) {            \
166cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray        return (typename)rsGetElementAtImpl_##typename(a, x, 0, 0);     \
1675a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
16898f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser                                                                        \
169cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    extern typename __attribute__((overloadable))                       \
170cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    rsGetElementAt_##typename(rs_allocation a, uint32_t x, uint32_t y) { \
171cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray        return (typename)rsGetElementAtImpl_##typename(a, x, y, 0);     \
1725a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }                                                                   \
17398f1f05105146e1caeb124cae6e286c151f63151Tobias Grosser                                                                        \
174cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    extern typename __attribute__((overloadable))                       \
175cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    rsGetElementAt_##typename(rs_allocation a, uint32_t x, uint32_t y,  \
176cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray                              uint32_t z) {                             \
177cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray        return (typename)rsGetElementAtImpl_##typename(a, x, y, z);     \
1785a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    }
1795a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
180fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define SET_ELEMENT_AT(T) SET_ELEMENT_AT_TYPE_IMPL(T, T) \
181fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    SET_ELEMENT_AT_TYPE_DEF(T, T)
182fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define GET_ELEMENT_AT(T) GET_ELEMENT_AT_TYPE_IMPL(T, T) \
183fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    GET_ELEMENT_AT_TYPE_DEF(T, T)
184cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray
185cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray#define ELEMENT_AT(T)                           \
186cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    SET_ELEMENT_AT(T)                           \
187cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray    GET_ELEMENT_AT(T)
1885a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
1899d6d872676e11549281f525e29fa72864248f402I-Jui (Ray) Sung#endif // RS_DEBUG_RUNTIME
1905a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
1915a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern const void * __attribute__((overloadable))
1925a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt(rs_allocation a, uint32_t x) {
1935a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
1945a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
1955a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
1965a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return &p[eSize * x];
1975a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
1985a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
1995a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern const void * __attribute__((overloadable))
2005a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt(rs_allocation a, uint32_t x, uint32_t y) {
2015a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
2025a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
2035a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
2045a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
2055a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return &p[(eSize * x) + (y * stride)];
2065a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2075a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2085a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern const void * __attribute__((overloadable))
2095a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAt(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {
2105a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
2115a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
2125a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
2135a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
2145a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
2155a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return &p[(eSize * x) + (y * stride) + (z * stride * dimY)];
2165a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2175a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern void __attribute__((overloadable))
2185a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt(rs_allocation a, void* ptr, uint32_t x) {
2195a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
2205a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
2215a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
2226fb5a4f5411c16d36f123c7c2c9add4d937479efVerena Beckham    local_memcpy((void*)&p[eSize * x], ptr, eSize);
2235a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2245a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2255a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern void __attribute__((overloadable))
2265a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt(rs_allocation a, void* ptr, uint32_t x, uint32_t y) {
2275a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
2285a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
2295a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
2305a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
2316fb5a4f5411c16d36f123c7c2c9add4d937479efVerena Beckham    local_memcpy((void*)&p[(eSize * x) + (y * stride)], ptr, eSize);
2325a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2335a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2345a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hinesextern void __attribute__((overloadable))
2355a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsSetElementAt(rs_allocation a, void* ptr, uint32_t x, uint32_t y, uint32_t z) {
2365a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
2375a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
2385a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
2395a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
2405a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
2416fb5a4f5411c16d36f123c7c2c9add4d937479efVerena Beckham    local_memcpy((void*)&p[(eSize * x) + (y * stride) + (z * stride * dimY)], ptr, eSize);
2425a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
2435a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
2445a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(char)
2455a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(char2)
2465a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(char3)
2475a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(char4)
2485a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uchar)
2495a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uchar2)
2505a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uchar3)
2515a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uchar4)
2525a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(short)
2535a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(short2)
2545a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(short3)
2555a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(short4)
2565a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ushort)
2575a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ushort2)
2585a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ushort3)
2595a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ushort4)
2605a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(int)
2615a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(int2)
2625a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(int3)
2635a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(int4)
2645a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uint)
2655a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uint2)
2665a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uint3)
2675a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(uint4)
2685a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(long)
2695a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(long2)
2705a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(long3)
2715a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(long4)
2725a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ulong)
2735a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ulong2)
2745a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ulong3)
2755a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(ulong4)
2762dcbc3d33443c1224085cab081b634f99327c159Pirama Arumuga NainarELEMENT_AT(half)
2772dcbc3d33443c1224085cab081b634f99327c159Pirama Arumuga NainarELEMENT_AT(half2)
2782dcbc3d33443c1224085cab081b634f99327c159Pirama Arumuga NainarELEMENT_AT(half3)
2792dcbc3d33443c1224085cab081b634f99327c159Pirama Arumuga NainarELEMENT_AT(half4)
2805a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(float)
2815a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(float2)
2825a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(float3)
2835a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(float4)
2845a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(double)
2855a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(double2)
2865a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(double3)
2875a47020542c52af3e879c1cd67674ca979ff0a18Stephen HinesELEMENT_AT(double4)
2885a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
289cbdb6480528fc374144df1ae9c604c9100d33268Tim Murraytypedef unsigned long long ull;
290cbdb6480528fc374144df1ae9c604c9100d33268Tim Murraytypedef unsigned long long ull2 __attribute__((ext_vector_type(2)));
291cbdb6480528fc374144df1ae9c604c9100d33268Tim Murraytypedef unsigned long long ull3 __attribute__((ext_vector_type(3)));
292cbdb6480528fc374144df1ae9c604c9100d33268Tim Murraytypedef unsigned long long ull4 __attribute__((ext_vector_type(4)));
293cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray
294cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray#ifndef RS_DEBUG_RUNTIME
295fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena BeckhamSET_ELEMENT_AT_TYPE_IMPL(ull, ulong)
296fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena BeckhamSET_ELEMENT_AT_TYPE_IMPL(ull2, ulong2)
297fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena BeckhamSET_ELEMENT_AT_TYPE_IMPL(ull3, ulong3)
298fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena BeckhamSET_ELEMENT_AT_TYPE_IMPL(ull4, ulong4)
299fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
300fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#undef SET_ELEMENT_AT_TYPE_DEF
301fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#undef GET_ELEMENT_AT_TYPE_DEF
302fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#undef SET_ELEMENT_AT_TYPE_IMPL
303fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#undef GET_ELEMENT_AT_TYPE_IMPL
304cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray#undef ELEMENT_AT_TYPE
305cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray#endif
306cbdb6480528fc374144df1ae9c604c9100d33268Tim Murray
3075a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines#undef ELEMENT_AT
3085a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3095a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
310fb2a33d2532d2500bfc4da879f83761f9a01edebJean-Luc Brouilletextern uchar __attribute__((overloadable))
3115a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAtYuv_uchar_Y(rs_allocation a, uint32_t x, uint32_t y) {
3125a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    return rsGetElementAt_uchar(a, x, y);
3135a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
3145a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
315fb2a33d2532d2500bfc4da879f83761f9a01edebJean-Luc Brouilletextern uchar __attribute__((overloadable))
3165a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAtYuv_uchar_U(rs_allocation a, uint32_t x, uint32_t y) {
3175a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3185a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
3195a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
32061656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    const size_t cstep = alloc->mHal.drvState.yuv.step;
32161656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    const size_t shift = alloc->mHal.drvState.yuv.shift;
3220052f8dcb5ebb5c9205a1d25445629fb5a772380Jason Sams    const size_t stride = alloc->mHal.drvState.lod[1].stride;
32361656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams
3240052f8dcb5ebb5c9205a1d25445629fb5a772380Jason Sams    const uchar *pin = (const uchar *)alloc->mHal.drvState.lod[1].mallocPtr;
32561656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams
32661656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    return pin[((x >> shift) * cstep) + ((y >> shift) * stride)];
3275a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
3285a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
329fb2a33d2532d2500bfc4da879f83761f9a01edebJean-Luc Brouilletextern uchar __attribute__((overloadable))
3305a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines        rsGetElementAtYuv_uchar_V(rs_allocation a, uint32_t x, uint32_t y) {
3315a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
3325a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
3335a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
33461656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    const size_t cstep = alloc->mHal.drvState.yuv.step;
33561656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    const size_t shift = alloc->mHal.drvState.yuv.shift;
3360052f8dcb5ebb5c9205a1d25445629fb5a772380Jason Sams    const size_t stride = alloc->mHal.drvState.lod[2].stride;
33761656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams
3380052f8dcb5ebb5c9205a1d25445629fb5a772380Jason Sams    const uchar *pin = (const uchar *)alloc->mHal.drvState.lod[2].mallocPtr;
33961656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams
34061656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    return pin[((x >> shift) * cstep) + ((y >> shift) * stride)];
3415a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines}
3425a47020542c52af3e879c1cd67674ca979ff0a18Stephen Hines
343fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define VOP_IMPL(T)                                                          \
34441660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    extern void __rsAllocationVStoreXImpl_##T(rs_allocation a, const T val, uint32_t x, uint32_t y, uint32_t z); \
345fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    extern T __rsAllocationVLoadXImpl_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z);
346fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
347fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define VOP_DEF(T)                                                      \
34841660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    extern void __attribute__((overloadable))                           \
34941660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    rsAllocationVStoreX_##T(rs_allocation a, T val, uint32_t x) {       \
35041660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams        __rsAllocationVStoreXImpl_##T(a, val, x, 0, 0);                 \
35141660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    }                                                                   \
35241660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    extern void __attribute__((overloadable))                           \
35341660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    rsAllocationVStoreX_##T(rs_allocation a, T val, uint32_t x, uint32_t y) { \
35441660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams        __rsAllocationVStoreXImpl_##T(a, val, x, y, 0);                 \
35541660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    }                                                                   \
35641660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    extern void __attribute__((overloadable))                           \
35741660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    rsAllocationVStoreX_##T(rs_allocation a, T val, uint32_t x, uint32_t y, uint32_t z) { \
35841660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams        __rsAllocationVStoreXImpl_##T(a, val, x, y, z);                 \
35941660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    }                                                                   \
36041660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    extern T __attribute__((overloadable))                              \
36141660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    rsAllocationVLoadX_##T(rs_allocation a, uint32_t x) {               \
36241660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams        return __rsAllocationVLoadXImpl_##T(a, x, 0, 0);                \
36341660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    }                                                                   \
36441660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    extern T __attribute__((overloadable))                              \
36541660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    rsAllocationVLoadX_##T(rs_allocation a, uint32_t x, uint32_t y) {   \
36641660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams        return __rsAllocationVLoadXImpl_##T(a, x, y, 0);                \
36741660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    }                                                                   \
36841660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    extern T __attribute__((overloadable))                              \
36941660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    rsAllocationVLoadX_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) { \
37041660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams        return __rsAllocationVLoadXImpl_##T(a, x, y, z);                \
37141660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams    }
37241660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams
373fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#define VOP(T) VOP_IMPL(T) \
374fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham    VOP_DEF(T)
375fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham
37641660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(char2)
37741660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(char3)
37841660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(char4)
37941660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(uchar2)
38041660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(uchar3)
38141660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(uchar4)
38241660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(short2)
38341660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(short3)
38441660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(short4)
38541660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(ushort2)
38641660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(ushort3)
38741660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(ushort4)
38841660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(int2)
38941660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(int3)
39041660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(int4)
39141660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(uint2)
39241660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(uint3)
39341660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(uint4)
39441660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(long2)
39541660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(long3)
39641660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(long4)
39741660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(ulong2)
39841660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(ulong3)
39941660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(ulong4)
40041660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(float2)
40141660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(float3)
40241660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(float4)
40341660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(double2)
40441660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(double3)
40541660c4c73fc425a2e3511e2070b2748cdd1107cJason SamsVOP(double4)
40641660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams
407fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#undef VOP_IMPL
408fb99e0f905b0f73a505c7900b434531ce7c3e2e5Verena Beckham#undef VOP_DEF
40941660c4c73fc425a2e3511e2070b2748cdd1107cJason Sams#undef VOP
4107cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
411863237215cab4812df373b63ba3bbf2bc1d8647dJean-Luc Brouilletstatic const rs_element kInvalidElement = RS_NULL_OBJ;
4127cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
4137cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarextern rs_element __attribute__((overloadable)) rsCreateElement(
4147cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        int32_t dt, int32_t dk, bool isNormalized, uint32_t vecSize);
4157cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
4167cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarextern rs_type __attribute__((overloadable)) rsCreateType(
4177cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    rs_element element, uint32_t dimX, uint32_t dimY, uint32_t dimZ,
4187cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    bool mipmaps, bool faces, rs_yuv_format yuv_format);
4197cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
4207cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarextern rs_allocation __attribute__((overloadable)) rsCreateAllocation(
4217cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rs_type type, rs_allocation_mipmap_control mipmaps, uint32_t usages,
4227cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        void *ptr);
4237cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
4247cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_element __attribute__((overloadable)) rsCreateElement(
4257cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rs_data_type data_type) {
4267cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
4277cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    switch (data_type) {
4287cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_BOOLEAN:
4297e1013b9461a07d42df05b2c6f7e73ec6518b82aPirama Arumuga Nainar        case RS_TYPE_FLOAT_16:
4307cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_FLOAT_32:
4317cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_FLOAT_64:
4327cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_8:
4337cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_16:
4347cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_32:
4357cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_64:
4367cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_8:
4377cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_16:
4387cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_32:
4397cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_64:
4407cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_MATRIX_4X4:
4417cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_MATRIX_3X3:
4427cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_MATRIX_2X2:
4437cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_ELEMENT:
4447cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_TYPE:
4457cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_ALLOCATION:
4467cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SCRIPT:
4477cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            return rsCreateElement(data_type, RS_KIND_USER, false, 1);
4487cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        default:
4497cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            rsDebug("Invalid data_type", data_type);
4507cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            return kInvalidElement;
4517cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
4527cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
4537cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
4547cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_element __attribute__((overloadable)) rsCreateVectorElement(
4557cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rs_data_type data_type, uint32_t vector_width) {
4567cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    if (vector_width < 2 || vector_width > 4) {
4577cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rsDebug("Invalid vector_width", vector_width);
4587cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        return kInvalidElement;
4597cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
4607cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    switch (data_type) {
4617cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_BOOLEAN:
4627e1013b9461a07d42df05b2c6f7e73ec6518b82aPirama Arumuga Nainar        case RS_TYPE_FLOAT_16:
4637cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_FLOAT_32:
4647cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_FLOAT_64:
4657cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_8:
4667cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_16:
4677cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_32:
4687cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_SIGNED_64:
4697cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_8:
4707cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_16:
4717cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_32:
4727cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_TYPE_UNSIGNED_64:
4737cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            return rsCreateElement(data_type, RS_KIND_USER, false,
4747cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                                   vector_width);
4757cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        default:
4767cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            rsDebug("Invalid data_type for vector element", data_type);
4777cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            return kInvalidElement;
4787cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
4797cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
4807cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
4817cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_element __attribute__((overloadable)) rsCreatePixelElement(
4827cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rs_data_type data_type, rs_data_kind data_kind) {
4837cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    if (data_type != RS_TYPE_UNSIGNED_8 &&
4847cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_type != RS_TYPE_UNSIGNED_16 &&
4857cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_type != RS_TYPE_UNSIGNED_5_6_5 &&
4867cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_type != RS_TYPE_UNSIGNED_4_4_4_4 &&
4877cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_type != RS_TYPE_UNSIGNED_5_5_5_1) {
4887cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
4897cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rsDebug("Invalid data_type for pixel element", data_type);
4907cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        return kInvalidElement;
4917cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
4927cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    if (data_kind != RS_KIND_PIXEL_L &&
4937cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_A &&
4947cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_LA &&
4957cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_RGB &&
4967cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_RGBA &&
4977cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_DEPTH &&
4987cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_YUV) {
4997cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5007cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rsDebug("Invalid data_kind for pixel element", data_type);
5017cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        return kInvalidElement;
5027cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
5037cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    if (data_type == RS_TYPE_UNSIGNED_5_6_5 && data_kind != RS_KIND_PIXEL_RGB) {
5047cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rsDebug("Bad data_type and data_kind combo", data_type, data_kind);
5057cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        return kInvalidElement;
5067cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
5077cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    if (data_type == RS_TYPE_UNSIGNED_5_5_5_1 &&
5087cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_RGBA) {
5097cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5107cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rsDebug("Bad data_type and data_kind combo", data_type, data_kind);
5117cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        return kInvalidElement;
5127cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
5137cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    if (data_type == RS_TYPE_UNSIGNED_4_4_4_4 &&
5147cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        data_kind != RS_KIND_PIXEL_RGBA) {
5157cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5167cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rsDebug("Bad data_type and data_kind combo", data_type, data_kind);
5177cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        return kInvalidElement;
5187cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
5197cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    if (data_type == RS_TYPE_UNSIGNED_16 && data_kind != RS_KIND_PIXEL_DEPTH) {
5207cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        rsDebug("Bad data_type and data_kind combo", data_type, data_kind);
5217cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        return kInvalidElement;
5227cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
5237cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5247cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    int vector_width = 1;
5257cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    switch (data_kind) {
5267cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_KIND_PIXEL_LA:
5277cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            vector_width = 2;
5287cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            break;
5297cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_KIND_PIXEL_RGB:
5307cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            vector_width = 3;
5317cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            break;
5327cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_KIND_PIXEL_RGBA:
5337cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            vector_width = 4;
5347cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            break;
5357cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar        case RS_KIND_PIXEL_DEPTH:
5367cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            vector_width = 2;
5377cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar            break;
538f72e74660567181b79673f2a476a6957db2507e5Stephen Hines        default:
539f72e74660567181b79673f2a476a6957db2507e5Stephen Hines            break;
5407cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    }
5417cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5427cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    return rsCreateElement(data_type, data_kind, true, vector_width);
5437cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
5447cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5457cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_type __attribute__((overloadable)) rsCreateType(rs_element element,
5467cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                                                   uint32_t dimX, uint32_t dimY,
5477cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                                                   uint32_t dimZ) {
5487cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    return rsCreateType(element, dimX, dimY, dimZ, false, false, RS_YUV_NONE);
5497cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
5507cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5517cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_type __attribute__((overloadable)) rsCreateType(rs_element element,
5527cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                                                   uint32_t dimX,
5537cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                                                   uint32_t dimY) {
5547cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    return rsCreateType(element, dimX, dimY, 0, false, false, RS_YUV_NONE);
5557cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
5567cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5577cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_type __attribute__((overloadable)) rsCreateType(rs_element element,
5587cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                                                   uint32_t dimX) {
5597cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    return rsCreateType(element, dimX, 0, 0, false, false, RS_YUV_NONE);
5607cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
5617cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5627cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_allocation __attribute__((overloadable)) rsCreateAllocation(rs_type type,
5637cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                                                               uint32_t usage) {
5647cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    return rsCreateAllocation(type, RS_ALLOCATION_MIPMAP_NONE, usage, NULL);
5657cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
5667cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar
5677cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainarrs_allocation __attribute__((overloadable)) rsCreateAllocation(rs_type type) {
5687cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar    return rsCreateAllocation(type, RS_ALLOCATION_MIPMAP_NONE,
5697cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar                              RS_ALLOCATION_USAGE_SCRIPT, NULL);
5707cb2273d4487b482d99d29f596506743c6a14534Pirama Arumuga Nainar}
571