xref: /aosp_15_r20/frameworks/rs/driver/runtime/rs_allocation.c (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker #include "rs_core.rsh"
2*e1eccf28SAndroid Build Coastguard Worker #include "rs_structs.h"
3*e1eccf28SAndroid Build Coastguard Worker 
4*e1eccf28SAndroid Build Coastguard Worker // Opaque Allocation type operations
5*e1eccf28SAndroid Build Coastguard Worker extern uint32_t __attribute__((overloadable))
rsAllocationGetDimX(rs_allocation a)6*e1eccf28SAndroid Build Coastguard Worker     rsAllocationGetDimX(rs_allocation a) {
7*e1eccf28SAndroid Build Coastguard Worker     Allocation_t *alloc = (Allocation_t *)a.p;
8*e1eccf28SAndroid Build Coastguard Worker     return alloc->mHal.drvState.lod[0].dimX;
9*e1eccf28SAndroid Build Coastguard Worker }
10*e1eccf28SAndroid Build Coastguard Worker 
11*e1eccf28SAndroid Build Coastguard Worker extern uint32_t __attribute__((overloadable))
rsAllocationGetDimY(rs_allocation a)12*e1eccf28SAndroid Build Coastguard Worker         rsAllocationGetDimY(rs_allocation a) {
13*e1eccf28SAndroid Build Coastguard Worker     Allocation_t *alloc = (Allocation_t *)a.p;
14*e1eccf28SAndroid Build Coastguard Worker     return alloc->mHal.drvState.lod[0].dimY;
15*e1eccf28SAndroid Build Coastguard Worker }
16*e1eccf28SAndroid Build Coastguard Worker 
17*e1eccf28SAndroid Build Coastguard Worker extern uint32_t __attribute__((overloadable))
rsAllocationGetDimZ(rs_allocation a)18*e1eccf28SAndroid Build Coastguard Worker         rsAllocationGetDimZ(rs_allocation a) {
19*e1eccf28SAndroid Build Coastguard Worker     Allocation_t *alloc = (Allocation_t *)a.p;
20*e1eccf28SAndroid Build Coastguard Worker     return alloc->mHal.drvState.lod[0].dimZ;
21*e1eccf28SAndroid Build Coastguard Worker }
22*e1eccf28SAndroid Build Coastguard Worker 
23*e1eccf28SAndroid Build Coastguard Worker extern uint32_t __attribute__((overloadable))
rsAllocationGetDimLOD(rs_allocation a)24*e1eccf28SAndroid Build Coastguard Worker         rsAllocationGetDimLOD(rs_allocation a) {
25*e1eccf28SAndroid Build Coastguard Worker     Allocation_t *alloc = (Allocation_t *)a.p;
26*e1eccf28SAndroid Build Coastguard Worker     return alloc->mHal.state.hasMipmaps;
27*e1eccf28SAndroid Build Coastguard Worker }
28*e1eccf28SAndroid Build Coastguard Worker 
29*e1eccf28SAndroid Build Coastguard Worker extern uint32_t __attribute__((overloadable))
rsAllocationGetDimFaces(rs_allocation a)30*e1eccf28SAndroid Build Coastguard Worker         rsAllocationGetDimFaces(rs_allocation a) {
31*e1eccf28SAndroid Build Coastguard Worker     Allocation_t *alloc = (Allocation_t *)a.p;
32*e1eccf28SAndroid Build Coastguard Worker     return alloc->mHal.state.hasFaces;
33*e1eccf28SAndroid Build Coastguard Worker }
34*e1eccf28SAndroid Build Coastguard Worker 
35*e1eccf28SAndroid Build Coastguard Worker 
36*e1eccf28SAndroid Build Coastguard Worker extern rs_element __attribute__((overloadable))
rsAllocationGetElement(rs_allocation a)37*e1eccf28SAndroid Build Coastguard Worker         rsAllocationGetElement(rs_allocation a) {
38*e1eccf28SAndroid Build Coastguard Worker     Allocation_t *alloc = (Allocation_t *)a.p;
39*e1eccf28SAndroid Build Coastguard Worker     if (alloc == NULL) {
40*e1eccf28SAndroid Build Coastguard Worker         rs_element nullElem = RS_NULL_OBJ;
41*e1eccf28SAndroid Build Coastguard Worker         return nullElem;
42*e1eccf28SAndroid Build Coastguard Worker     }
43*e1eccf28SAndroid Build Coastguard Worker     Type_t *type = (Type_t *)alloc->mHal.state.type;
44*e1eccf28SAndroid Build Coastguard Worker     rs_element returnElem = {
45*e1eccf28SAndroid Build Coastguard Worker         type->mHal.state.element
46*e1eccf28SAndroid Build Coastguard Worker #ifdef __LP64__
47*e1eccf28SAndroid Build Coastguard Worker         , 0, 0, 0
48*e1eccf28SAndroid Build Coastguard Worker #endif
49*e1eccf28SAndroid Build Coastguard Worker     };
50*e1eccf28SAndroid Build Coastguard Worker     rs_element rs_retval = RS_NULL_OBJ;
51*e1eccf28SAndroid Build Coastguard Worker     rsSetObject(&rs_retval, returnElem);
52*e1eccf28SAndroid Build Coastguard Worker     return rs_retval;
53*e1eccf28SAndroid Build Coastguard Worker }
54*e1eccf28SAndroid Build Coastguard Worker 
55*e1eccf28SAndroid Build Coastguard Worker // TODO: this needs to be optimized, obviously
local_memcpy(void * dst,const void * src,size_t size)56*e1eccf28SAndroid Build Coastguard Worker static void local_memcpy(void* dst, const void* src, size_t size) {
57*e1eccf28SAndroid Build Coastguard Worker     char* dst_c = (char*) dst;
58*e1eccf28SAndroid Build Coastguard Worker     const char* src_c = (const char*) src;
59*e1eccf28SAndroid Build Coastguard Worker     for (; size > 0; size--) {
60*e1eccf28SAndroid Build Coastguard Worker         *dst_c++ = *src_c++;
61*e1eccf28SAndroid Build Coastguard Worker     }
62*e1eccf28SAndroid Build Coastguard Worker }
63*e1eccf28SAndroid Build Coastguard Worker 
64*e1eccf28SAndroid Build Coastguard Worker uint8_t*
rsOffset(rs_allocation a,uint32_t sizeOf,uint32_t x,uint32_t y,uint32_t z)65*e1eccf28SAndroid Build Coastguard Worker rsOffset(rs_allocation a, uint32_t sizeOf, uint32_t x, uint32_t y,
66*e1eccf28SAndroid Build Coastguard Worker          uint32_t z) {
67*e1eccf28SAndroid Build Coastguard Worker     Allocation_t *alloc = (Allocation_t *)a.p;
68*e1eccf28SAndroid Build Coastguard Worker     uint8_t *p = (uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
69*e1eccf28SAndroid Build Coastguard Worker     const uint32_t stride = (uint32_t)alloc->mHal.drvState.lod[0].stride;
70*e1eccf28SAndroid Build Coastguard Worker     const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
71*e1eccf28SAndroid Build Coastguard Worker     uint8_t *dp = &p[(sizeOf * x) + (y * stride) +
72*e1eccf28SAndroid Build Coastguard Worker                      (z * stride * dimY)];
73*e1eccf28SAndroid Build Coastguard Worker     return dp;
74*e1eccf28SAndroid Build Coastguard Worker }
75*e1eccf28SAndroid Build Coastguard Worker 
76*e1eccf28SAndroid Build Coastguard Worker uint8_t*
rsOffsetNs(rs_allocation a,uint32_t x,uint32_t y,uint32_t z)77*e1eccf28SAndroid Build Coastguard Worker rsOffsetNs(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {
78*e1eccf28SAndroid Build Coastguard Worker     Allocation_t *alloc = (Allocation_t *)a.p;
79*e1eccf28SAndroid Build Coastguard Worker     uint8_t *p = (uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
80*e1eccf28SAndroid Build Coastguard Worker     const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
81*e1eccf28SAndroid Build Coastguard Worker     const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
82*e1eccf28SAndroid Build Coastguard Worker     const uint32_t sizeOf = alloc->mHal.state.elementSizeBytes;;
83*e1eccf28SAndroid Build Coastguard Worker     uint8_t *dp = &p[(sizeOf * x) + (y * stride) +
84*e1eccf28SAndroid Build Coastguard Worker                      (z * stride * dimY)];
85*e1eccf28SAndroid Build Coastguard Worker     return dp;
86*e1eccf28SAndroid Build Coastguard Worker }
87*e1eccf28SAndroid Build Coastguard Worker 
88*e1eccf28SAndroid Build Coastguard Worker #ifdef RS_DEBUG_RUNTIME
89*e1eccf28SAndroid Build Coastguard Worker #define ELEMENT_AT(T)                                                   \
90*e1eccf28SAndroid Build Coastguard Worker     extern void __attribute__((overloadable))                           \
91*e1eccf28SAndroid Build Coastguard Worker         rsSetElementAt_##T(rs_allocation a, const T *val, uint32_t x);  \
92*e1eccf28SAndroid Build Coastguard Worker     extern void __attribute__((overloadable))                           \
93*e1eccf28SAndroid Build Coastguard Worker         rsSetElementAt_##T(rs_allocation a, const T *val, uint32_t x, uint32_t y); \
94*e1eccf28SAndroid Build Coastguard Worker     extern void __attribute__((overloadable))                           \
95*e1eccf28SAndroid Build Coastguard Worker         rsSetElementAt_##T(rs_allocation a, const T *val, uint32_t x, uint32_t y, uint32_t z); \
96*e1eccf28SAndroid Build Coastguard Worker     extern void __attribute__((overloadable))                           \
97*e1eccf28SAndroid Build Coastguard Worker         rsGetElementAt_##T(rs_allocation a, T *val, uint32_t x);  \
98*e1eccf28SAndroid Build Coastguard Worker     extern void __attribute__((overloadable))                           \
99*e1eccf28SAndroid Build Coastguard Worker         rsGetElementAt_##T(rs_allocation a, T *val, uint32_t x, uint32_t y); \
100*e1eccf28SAndroid Build Coastguard Worker     extern void __attribute__((overloadable))                           \
101*e1eccf28SAndroid Build Coastguard Worker         rsGetElementAt_##T(rs_allocation a, T *val, uint32_t x, uint32_t y, uint32_t z); \
102*e1eccf28SAndroid Build Coastguard Worker                                                                         \
103*e1eccf28SAndroid Build Coastguard Worker     extern void __attribute__((overloadable))                           \
104*e1eccf28SAndroid Build Coastguard Worker     rsSetElementAt_##T(rs_allocation a, T val, uint32_t x) {            \
105*e1eccf28SAndroid Build Coastguard Worker         rsSetElementAt_##T(a, &val, x);                                 \
106*e1eccf28SAndroid Build Coastguard Worker     }                                                                   \
107*e1eccf28SAndroid Build Coastguard Worker     extern void __attribute__((overloadable))                           \
108*e1eccf28SAndroid Build Coastguard Worker     rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y) { \
109*e1eccf28SAndroid Build Coastguard Worker         rsSetElementAt_##T(a, &val, x, y);                              \
110*e1eccf28SAndroid Build Coastguard Worker     }                                                                   \
111*e1eccf28SAndroid Build Coastguard Worker     extern void __attribute__((overloadable))                           \
112*e1eccf28SAndroid Build Coastguard Worker     rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y, uint32_t z) { \
113*e1eccf28SAndroid Build Coastguard Worker         rsSetElementAt_##T(a, &val, x, y, z);                           \
114*e1eccf28SAndroid Build Coastguard Worker     }                                                                   \
115*e1eccf28SAndroid Build Coastguard Worker     extern T __attribute__((overloadable))                              \
116*e1eccf28SAndroid Build Coastguard Worker     rsGetElementAt_##T(rs_allocation a, uint32_t x) {                   \
117*e1eccf28SAndroid Build Coastguard Worker         T tmp;                                                          \
118*e1eccf28SAndroid Build Coastguard Worker         rsGetElementAt_##T(a, &tmp, x);                                 \
119*e1eccf28SAndroid Build Coastguard Worker         return tmp;                                                     \
120*e1eccf28SAndroid Build Coastguard Worker     }                                                                   \
121*e1eccf28SAndroid Build Coastguard Worker     extern T __attribute__((overloadable))                              \
122*e1eccf28SAndroid Build Coastguard Worker     rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y) {       \
123*e1eccf28SAndroid Build Coastguard Worker         T tmp;                                                          \
124*e1eccf28SAndroid Build Coastguard Worker         rsGetElementAt_##T(a, &tmp, x, y);                              \
125*e1eccf28SAndroid Build Coastguard Worker         return tmp;                                                     \
126*e1eccf28SAndroid Build Coastguard Worker     }                                                                   \
127*e1eccf28SAndroid Build Coastguard Worker     extern T __attribute__((overloadable))                              \
128*e1eccf28SAndroid Build Coastguard Worker     rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) { \
129*e1eccf28SAndroid Build Coastguard Worker         T tmp;                                                          \
130*e1eccf28SAndroid Build Coastguard Worker         rsGetElementAt_##T(a, &tmp, x, y, z);                           \
131*e1eccf28SAndroid Build Coastguard Worker         return tmp;                                                     \
132*e1eccf28SAndroid Build Coastguard Worker     }
133*e1eccf28SAndroid Build Coastguard Worker #else  // NOT RS_DEBUG_RUNTIME
134*e1eccf28SAndroid Build Coastguard Worker 
135*e1eccf28SAndroid Build Coastguard Worker #define SET_ELEMENT_AT_TYPE_IMPL(T, typename)                                    \
136*e1eccf28SAndroid Build Coastguard Worker     void                                                                \
137*e1eccf28SAndroid Build Coastguard Worker     rsSetElementAtImpl_##typename(rs_allocation a, typename val, uint32_t x,   \
138*e1eccf28SAndroid Build Coastguard Worker                                   uint32_t y, uint32_t z);
139*e1eccf28SAndroid Build Coastguard Worker 
140*e1eccf28SAndroid Build Coastguard Worker #define GET_ELEMENT_AT_TYPE_IMPL(T, typename)                                \
141*e1eccf28SAndroid Build Coastguard Worker     typename                                                            \
142*e1eccf28SAndroid Build Coastguard Worker     rsGetElementAtImpl_##typename(rs_allocation a, uint32_t x, uint32_t y, \
143*e1eccf28SAndroid Build Coastguard Worker                                   uint32_t z);
144*e1eccf28SAndroid Build Coastguard Worker 
145*e1eccf28SAndroid Build Coastguard Worker #define SET_ELEMENT_AT_TYPE_DEF(T, typename)                                    \
146*e1eccf28SAndroid Build Coastguard Worker     extern void __attribute__((overloadable))                           \
147*e1eccf28SAndroid Build Coastguard Worker     rsSetElementAt_##typename(rs_allocation a, T val, uint32_t x) {     \
148*e1eccf28SAndroid Build Coastguard Worker         rsSetElementAtImpl_##typename(a, (typename)val, x, 0, 0);              \
149*e1eccf28SAndroid Build Coastguard Worker     }                                                                   \
150*e1eccf28SAndroid Build Coastguard Worker                                                                         \
151*e1eccf28SAndroid Build Coastguard Worker     extern void __attribute__((overloadable))                           \
152*e1eccf28SAndroid Build Coastguard Worker     rsSetElementAt_##typename(rs_allocation a, T val, uint32_t x,       \
153*e1eccf28SAndroid Build Coastguard Worker                               uint32_t y) {                             \
154*e1eccf28SAndroid Build Coastguard Worker         rsSetElementAtImpl_##typename(a, (typename)val, x, y, 0);              \
155*e1eccf28SAndroid Build Coastguard Worker     }                                                                   \
156*e1eccf28SAndroid Build Coastguard Worker                                                                         \
157*e1eccf28SAndroid Build Coastguard Worker     extern void __attribute__((overloadable))                           \
158*e1eccf28SAndroid Build Coastguard Worker     rsSetElementAt_##typename(rs_allocation a, T val, uint32_t x, uint32_t y, \
159*e1eccf28SAndroid Build Coastguard Worker                               uint32_t z) {                             \
160*e1eccf28SAndroid Build Coastguard Worker         rsSetElementAtImpl_##typename(a, (typename)val, x, y, z);              \
161*e1eccf28SAndroid Build Coastguard Worker     }
162*e1eccf28SAndroid Build Coastguard Worker 
163*e1eccf28SAndroid Build Coastguard Worker #define GET_ELEMENT_AT_TYPE_DEF(T, typename)                                \
164*e1eccf28SAndroid Build Coastguard Worker     extern typename __attribute__((overloadable))                       \
165*e1eccf28SAndroid Build Coastguard Worker     rsGetElementAt_##typename(rs_allocation a, uint32_t x) {            \
166*e1eccf28SAndroid Build Coastguard Worker         return (typename)rsGetElementAtImpl_##typename(a, x, 0, 0);     \
167*e1eccf28SAndroid Build Coastguard Worker     }                                                                   \
168*e1eccf28SAndroid Build Coastguard Worker                                                                         \
169*e1eccf28SAndroid Build Coastguard Worker     extern typename __attribute__((overloadable))                       \
170*e1eccf28SAndroid Build Coastguard Worker     rsGetElementAt_##typename(rs_allocation a, uint32_t x, uint32_t y) { \
171*e1eccf28SAndroid Build Coastguard Worker         return (typename)rsGetElementAtImpl_##typename(a, x, y, 0);     \
172*e1eccf28SAndroid Build Coastguard Worker     }                                                                   \
173*e1eccf28SAndroid Build Coastguard Worker                                                                         \
174*e1eccf28SAndroid Build Coastguard Worker     extern typename __attribute__((overloadable))                       \
175*e1eccf28SAndroid Build Coastguard Worker     rsGetElementAt_##typename(rs_allocation a, uint32_t x, uint32_t y,  \
176*e1eccf28SAndroid Build Coastguard Worker                               uint32_t z) {                             \
177*e1eccf28SAndroid Build Coastguard Worker         return (typename)rsGetElementAtImpl_##typename(a, x, y, z);     \
178*e1eccf28SAndroid Build Coastguard Worker     }
179*e1eccf28SAndroid Build Coastguard Worker 
180*e1eccf28SAndroid Build Coastguard Worker #define SET_ELEMENT_AT(T) SET_ELEMENT_AT_TYPE_IMPL(T, T) \
181*e1eccf28SAndroid Build Coastguard Worker     SET_ELEMENT_AT_TYPE_DEF(T, T)
182*e1eccf28SAndroid Build Coastguard Worker #define GET_ELEMENT_AT(T) GET_ELEMENT_AT_TYPE_IMPL(T, T) \
183*e1eccf28SAndroid Build Coastguard Worker     GET_ELEMENT_AT_TYPE_DEF(T, T)
184*e1eccf28SAndroid Build Coastguard Worker 
185*e1eccf28SAndroid Build Coastguard Worker #define ELEMENT_AT(T)                           \
186*e1eccf28SAndroid Build Coastguard Worker     SET_ELEMENT_AT(T)                           \
187*e1eccf28SAndroid Build Coastguard Worker     GET_ELEMENT_AT(T)
188*e1eccf28SAndroid Build Coastguard Worker 
189*e1eccf28SAndroid Build Coastguard Worker #endif // RS_DEBUG_RUNTIME
190*e1eccf28SAndroid Build Coastguard Worker 
191*e1eccf28SAndroid Build Coastguard Worker extern const void * __attribute__((overloadable))
rsGetElementAt(rs_allocation a,uint32_t x)192*e1eccf28SAndroid Build Coastguard Worker         rsGetElementAt(rs_allocation a, uint32_t x) {
193*e1eccf28SAndroid Build Coastguard Worker     Allocation_t *alloc = (Allocation_t *)a.p;
194*e1eccf28SAndroid Build Coastguard Worker     const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
195*e1eccf28SAndroid Build Coastguard Worker     const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
196*e1eccf28SAndroid Build Coastguard Worker     return &p[eSize * x];
197*e1eccf28SAndroid Build Coastguard Worker }
198*e1eccf28SAndroid Build Coastguard Worker 
199*e1eccf28SAndroid Build Coastguard Worker extern const void * __attribute__((overloadable))
rsGetElementAt(rs_allocation a,uint32_t x,uint32_t y)200*e1eccf28SAndroid Build Coastguard Worker         rsGetElementAt(rs_allocation a, uint32_t x, uint32_t y) {
201*e1eccf28SAndroid Build Coastguard Worker     Allocation_t *alloc = (Allocation_t *)a.p;
202*e1eccf28SAndroid Build Coastguard Worker     const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
203*e1eccf28SAndroid Build Coastguard Worker     const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
204*e1eccf28SAndroid Build Coastguard Worker     const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
205*e1eccf28SAndroid Build Coastguard Worker     return &p[(eSize * x) + (y * stride)];
206*e1eccf28SAndroid Build Coastguard Worker }
207*e1eccf28SAndroid Build Coastguard Worker 
208*e1eccf28SAndroid Build Coastguard Worker extern const void * __attribute__((overloadable))
rsGetElementAt(rs_allocation a,uint32_t x,uint32_t y,uint32_t z)209*e1eccf28SAndroid Build Coastguard Worker         rsGetElementAt(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {
210*e1eccf28SAndroid Build Coastguard Worker     Allocation_t *alloc = (Allocation_t *)a.p;
211*e1eccf28SAndroid Build Coastguard Worker     const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
212*e1eccf28SAndroid Build Coastguard Worker     const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
213*e1eccf28SAndroid Build Coastguard Worker     const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
214*e1eccf28SAndroid Build Coastguard Worker     const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
215*e1eccf28SAndroid Build Coastguard Worker     return &p[(eSize * x) + (y * stride) + (z * stride * dimY)];
216*e1eccf28SAndroid Build Coastguard Worker }
217*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsSetElementAt(rs_allocation a,void * ptr,uint32_t x)218*e1eccf28SAndroid Build Coastguard Worker         rsSetElementAt(rs_allocation a, void* ptr, uint32_t x) {
219*e1eccf28SAndroid Build Coastguard Worker     Allocation_t *alloc = (Allocation_t *)a.p;
220*e1eccf28SAndroid Build Coastguard Worker     const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
221*e1eccf28SAndroid Build Coastguard Worker     const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
222*e1eccf28SAndroid Build Coastguard Worker     local_memcpy((void*)&p[eSize * x], ptr, eSize);
223*e1eccf28SAndroid Build Coastguard Worker }
224*e1eccf28SAndroid Build Coastguard Worker 
225*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsSetElementAt(rs_allocation a,void * ptr,uint32_t x,uint32_t y)226*e1eccf28SAndroid Build Coastguard Worker         rsSetElementAt(rs_allocation a, void* ptr, uint32_t x, uint32_t y) {
227*e1eccf28SAndroid Build Coastguard Worker     Allocation_t *alloc = (Allocation_t *)a.p;
228*e1eccf28SAndroid Build Coastguard Worker     const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
229*e1eccf28SAndroid Build Coastguard Worker     const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
230*e1eccf28SAndroid Build Coastguard Worker     const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
231*e1eccf28SAndroid Build Coastguard Worker     local_memcpy((void*)&p[(eSize * x) + (y * stride)], ptr, eSize);
232*e1eccf28SAndroid Build Coastguard Worker }
233*e1eccf28SAndroid Build Coastguard Worker 
234*e1eccf28SAndroid Build Coastguard Worker extern void __attribute__((overloadable))
rsSetElementAt(rs_allocation a,void * ptr,uint32_t x,uint32_t y,uint32_t z)235*e1eccf28SAndroid Build Coastguard Worker         rsSetElementAt(rs_allocation a, void* ptr, uint32_t x, uint32_t y, uint32_t z) {
236*e1eccf28SAndroid Build Coastguard Worker     Allocation_t *alloc = (Allocation_t *)a.p;
237*e1eccf28SAndroid Build Coastguard Worker     const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
238*e1eccf28SAndroid Build Coastguard Worker     const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
239*e1eccf28SAndroid Build Coastguard Worker     const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
240*e1eccf28SAndroid Build Coastguard Worker     const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
241*e1eccf28SAndroid Build Coastguard Worker     local_memcpy((void*)&p[(eSize * x) + (y * stride) + (z * stride * dimY)], ptr, eSize);
242*e1eccf28SAndroid Build Coastguard Worker }
243*e1eccf28SAndroid Build Coastguard Worker 
244*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(char)
245*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(char2)
246*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(char3)
247*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(char4)
248*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(uchar)
249*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(uchar2)
250*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(uchar3)
251*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(uchar4)
252*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(short)
253*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(short2)
254*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(short3)
255*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(short4)
256*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(ushort)
257*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(ushort2)
258*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(ushort3)
259*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(ushort4)
260*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(int)
261*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(int2)
262*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(int3)
263*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(int4)
264*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(uint)
265*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(uint2)
266*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(uint3)
267*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(uint4)
268*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(long)
269*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(long2)
270*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(long3)
271*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(long4)
272*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(ulong)
273*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(ulong2)
274*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(ulong3)
275*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(ulong4)
276*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(half)
277*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(half2)
278*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(half3)
279*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(half4)
280*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(float)
281*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(float2)
282*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(float3)
283*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(float4)
284*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(double)
285*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(double2)
286*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(double3)
287*e1eccf28SAndroid Build Coastguard Worker ELEMENT_AT(double4)
288*e1eccf28SAndroid Build Coastguard Worker 
289*e1eccf28SAndroid Build Coastguard Worker typedef unsigned long long ull;
290*e1eccf28SAndroid Build Coastguard Worker typedef unsigned long long ull2 __attribute__((ext_vector_type(2)));
291*e1eccf28SAndroid Build Coastguard Worker typedef unsigned long long ull3 __attribute__((ext_vector_type(3)));
292*e1eccf28SAndroid Build Coastguard Worker typedef unsigned long long ull4 __attribute__((ext_vector_type(4)));
293*e1eccf28SAndroid Build Coastguard Worker 
294*e1eccf28SAndroid Build Coastguard Worker #ifndef RS_DEBUG_RUNTIME
SET_ELEMENT_AT_TYPE_IMPL(ull,ulong)295*e1eccf28SAndroid Build Coastguard Worker SET_ELEMENT_AT_TYPE_IMPL(ull, ulong)
296*e1eccf28SAndroid Build Coastguard Worker SET_ELEMENT_AT_TYPE_IMPL(ull2, ulong2)
297*e1eccf28SAndroid Build Coastguard Worker SET_ELEMENT_AT_TYPE_IMPL(ull3, ulong3)
298*e1eccf28SAndroid Build Coastguard Worker SET_ELEMENT_AT_TYPE_IMPL(ull4, ulong4)
299*e1eccf28SAndroid Build Coastguard Worker 
300*e1eccf28SAndroid Build Coastguard Worker #undef SET_ELEMENT_AT_TYPE_DEF
301*e1eccf28SAndroid Build Coastguard Worker #undef GET_ELEMENT_AT_TYPE_DEF
302*e1eccf28SAndroid Build Coastguard Worker #undef SET_ELEMENT_AT_TYPE_IMPL
303*e1eccf28SAndroid Build Coastguard Worker #undef GET_ELEMENT_AT_TYPE_IMPL
304*e1eccf28SAndroid Build Coastguard Worker #undef ELEMENT_AT_TYPE
305*e1eccf28SAndroid Build Coastguard Worker #endif
306*e1eccf28SAndroid Build Coastguard Worker 
307*e1eccf28SAndroid Build Coastguard Worker #undef ELEMENT_AT
308*e1eccf28SAndroid Build Coastguard Worker 
309*e1eccf28SAndroid Build Coastguard Worker 
310*e1eccf28SAndroid Build Coastguard Worker extern uchar __attribute__((overloadable))
311*e1eccf28SAndroid Build Coastguard Worker         rsGetElementAtYuv_uchar_Y(rs_allocation a, uint32_t x, uint32_t y) {
312*e1eccf28SAndroid Build Coastguard Worker     return rsGetElementAt_uchar(a, x, y);
313*e1eccf28SAndroid Build Coastguard Worker }
314*e1eccf28SAndroid Build Coastguard Worker 
315*e1eccf28SAndroid Build Coastguard Worker extern uchar __attribute__((overloadable))
rsGetElementAtYuv_uchar_U(rs_allocation a,uint32_t x,uint32_t y)316*e1eccf28SAndroid Build Coastguard Worker         rsGetElementAtYuv_uchar_U(rs_allocation a, uint32_t x, uint32_t y) {
317*e1eccf28SAndroid Build Coastguard Worker 
318*e1eccf28SAndroid Build Coastguard Worker     Allocation_t *alloc = (Allocation_t *)a.p;
319*e1eccf28SAndroid Build Coastguard Worker 
320*e1eccf28SAndroid Build Coastguard Worker     const size_t cstep = alloc->mHal.drvState.yuv.step;
321*e1eccf28SAndroid Build Coastguard Worker     const size_t shift = alloc->mHal.drvState.yuv.shift;
322*e1eccf28SAndroid Build Coastguard Worker     const size_t stride = alloc->mHal.drvState.lod[1].stride;
323*e1eccf28SAndroid Build Coastguard Worker 
324*e1eccf28SAndroid Build Coastguard Worker     const uchar *pin = (const uchar *)alloc->mHal.drvState.lod[1].mallocPtr;
325*e1eccf28SAndroid Build Coastguard Worker 
326*e1eccf28SAndroid Build Coastguard Worker     return pin[((x >> shift) * cstep) + ((y >> shift) * stride)];
327*e1eccf28SAndroid Build Coastguard Worker }
328*e1eccf28SAndroid Build Coastguard Worker 
329*e1eccf28SAndroid Build Coastguard Worker extern uchar __attribute__((overloadable))
rsGetElementAtYuv_uchar_V(rs_allocation a,uint32_t x,uint32_t y)330*e1eccf28SAndroid Build Coastguard Worker         rsGetElementAtYuv_uchar_V(rs_allocation a, uint32_t x, uint32_t y) {
331*e1eccf28SAndroid Build Coastguard Worker 
332*e1eccf28SAndroid Build Coastguard Worker     Allocation_t *alloc = (Allocation_t *)a.p;
333*e1eccf28SAndroid Build Coastguard Worker 
334*e1eccf28SAndroid Build Coastguard Worker     const size_t cstep = alloc->mHal.drvState.yuv.step;
335*e1eccf28SAndroid Build Coastguard Worker     const size_t shift = alloc->mHal.drvState.yuv.shift;
336*e1eccf28SAndroid Build Coastguard Worker     const size_t stride = alloc->mHal.drvState.lod[2].stride;
337*e1eccf28SAndroid Build Coastguard Worker 
338*e1eccf28SAndroid Build Coastguard Worker     const uchar *pin = (const uchar *)alloc->mHal.drvState.lod[2].mallocPtr;
339*e1eccf28SAndroid Build Coastguard Worker 
340*e1eccf28SAndroid Build Coastguard Worker     return pin[((x >> shift) * cstep) + ((y >> shift) * stride)];
341*e1eccf28SAndroid Build Coastguard Worker }
342*e1eccf28SAndroid Build Coastguard Worker 
343*e1eccf28SAndroid Build Coastguard Worker #define VOP_IMPL(T)                                                          \
344*e1eccf28SAndroid Build Coastguard Worker     extern void __rsAllocationVStoreXImpl_##T(rs_allocation a, const T val, uint32_t x, uint32_t y, uint32_t z); \
345*e1eccf28SAndroid Build Coastguard Worker     extern T __rsAllocationVLoadXImpl_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z);
346*e1eccf28SAndroid Build Coastguard Worker 
347*e1eccf28SAndroid Build Coastguard Worker #define VOP_DEF(T)                                                      \
348*e1eccf28SAndroid Build Coastguard Worker     extern void __attribute__((overloadable))                           \
349*e1eccf28SAndroid Build Coastguard Worker     rsAllocationVStoreX_##T(rs_allocation a, T val, uint32_t x) {       \
350*e1eccf28SAndroid Build Coastguard Worker         __rsAllocationVStoreXImpl_##T(a, val, x, 0, 0);                 \
351*e1eccf28SAndroid Build Coastguard Worker     }                                                                   \
352*e1eccf28SAndroid Build Coastguard Worker     extern void __attribute__((overloadable))                           \
353*e1eccf28SAndroid Build Coastguard Worker     rsAllocationVStoreX_##T(rs_allocation a, T val, uint32_t x, uint32_t y) { \
354*e1eccf28SAndroid Build Coastguard Worker         __rsAllocationVStoreXImpl_##T(a, val, x, y, 0);                 \
355*e1eccf28SAndroid Build Coastguard Worker     }                                                                   \
356*e1eccf28SAndroid Build Coastguard Worker     extern void __attribute__((overloadable))                           \
357*e1eccf28SAndroid Build Coastguard Worker     rsAllocationVStoreX_##T(rs_allocation a, T val, uint32_t x, uint32_t y, uint32_t z) { \
358*e1eccf28SAndroid Build Coastguard Worker         __rsAllocationVStoreXImpl_##T(a, val, x, y, z);                 \
359*e1eccf28SAndroid Build Coastguard Worker     }                                                                   \
360*e1eccf28SAndroid Build Coastguard Worker     extern T __attribute__((overloadable))                              \
361*e1eccf28SAndroid Build Coastguard Worker     rsAllocationVLoadX_##T(rs_allocation a, uint32_t x) {               \
362*e1eccf28SAndroid Build Coastguard Worker         return __rsAllocationVLoadXImpl_##T(a, x, 0, 0);                \
363*e1eccf28SAndroid Build Coastguard Worker     }                                                                   \
364*e1eccf28SAndroid Build Coastguard Worker     extern T __attribute__((overloadable))                              \
365*e1eccf28SAndroid Build Coastguard Worker     rsAllocationVLoadX_##T(rs_allocation a, uint32_t x, uint32_t y) {   \
366*e1eccf28SAndroid Build Coastguard Worker         return __rsAllocationVLoadXImpl_##T(a, x, y, 0);                \
367*e1eccf28SAndroid Build Coastguard Worker     }                                                                   \
368*e1eccf28SAndroid Build Coastguard Worker     extern T __attribute__((overloadable))                              \
369*e1eccf28SAndroid Build Coastguard Worker     rsAllocationVLoadX_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) { \
370*e1eccf28SAndroid Build Coastguard Worker         return __rsAllocationVLoadXImpl_##T(a, x, y, z);                \
371*e1eccf28SAndroid Build Coastguard Worker     }
372*e1eccf28SAndroid Build Coastguard Worker 
373*e1eccf28SAndroid Build Coastguard Worker #define VOP(T) VOP_IMPL(T) \
374*e1eccf28SAndroid Build Coastguard Worker     VOP_DEF(T)
375*e1eccf28SAndroid Build Coastguard Worker 
376*e1eccf28SAndroid Build Coastguard Worker VOP(char2)
377*e1eccf28SAndroid Build Coastguard Worker VOP(char3)
378*e1eccf28SAndroid Build Coastguard Worker VOP(char4)
379*e1eccf28SAndroid Build Coastguard Worker VOP(uchar2)
380*e1eccf28SAndroid Build Coastguard Worker VOP(uchar3)
381*e1eccf28SAndroid Build Coastguard Worker VOP(uchar4)
382*e1eccf28SAndroid Build Coastguard Worker VOP(short2)
383*e1eccf28SAndroid Build Coastguard Worker VOP(short3)
384*e1eccf28SAndroid Build Coastguard Worker VOP(short4)
385*e1eccf28SAndroid Build Coastguard Worker VOP(ushort2)
386*e1eccf28SAndroid Build Coastguard Worker VOP(ushort3)
387*e1eccf28SAndroid Build Coastguard Worker VOP(ushort4)
388*e1eccf28SAndroid Build Coastguard Worker VOP(int2)
389*e1eccf28SAndroid Build Coastguard Worker VOP(int3)
390*e1eccf28SAndroid Build Coastguard Worker VOP(int4)
391*e1eccf28SAndroid Build Coastguard Worker VOP(uint2)
392*e1eccf28SAndroid Build Coastguard Worker VOP(uint3)
393*e1eccf28SAndroid Build Coastguard Worker VOP(uint4)
394*e1eccf28SAndroid Build Coastguard Worker VOP(long2)
395*e1eccf28SAndroid Build Coastguard Worker VOP(long3)
396*e1eccf28SAndroid Build Coastguard Worker VOP(long4)
397*e1eccf28SAndroid Build Coastguard Worker VOP(ulong2)
398*e1eccf28SAndroid Build Coastguard Worker VOP(ulong3)
399*e1eccf28SAndroid Build Coastguard Worker VOP(ulong4)
400*e1eccf28SAndroid Build Coastguard Worker VOP(float2)
401*e1eccf28SAndroid Build Coastguard Worker VOP(float3)
402*e1eccf28SAndroid Build Coastguard Worker VOP(float4)
403*e1eccf28SAndroid Build Coastguard Worker VOP(double2)
404*e1eccf28SAndroid Build Coastguard Worker VOP(double3)
405*e1eccf28SAndroid Build Coastguard Worker VOP(double4)
406*e1eccf28SAndroid Build Coastguard Worker 
407*e1eccf28SAndroid Build Coastguard Worker #undef VOP_IMPL
408*e1eccf28SAndroid Build Coastguard Worker #undef VOP_DEF
409*e1eccf28SAndroid Build Coastguard Worker #undef VOP
410*e1eccf28SAndroid Build Coastguard Worker 
411*e1eccf28SAndroid Build Coastguard Worker static const rs_element kInvalidElement = RS_NULL_OBJ;
412*e1eccf28SAndroid Build Coastguard Worker 
413*e1eccf28SAndroid Build Coastguard Worker extern rs_element __attribute__((overloadable)) rsCreateElement(
414*e1eccf28SAndroid Build Coastguard Worker         int32_t dt, int32_t dk, bool isNormalized, uint32_t vecSize);
415*e1eccf28SAndroid Build Coastguard Worker 
416*e1eccf28SAndroid Build Coastguard Worker extern rs_type __attribute__((overloadable)) rsCreateType(
417*e1eccf28SAndroid Build Coastguard Worker     rs_element element, uint32_t dimX, uint32_t dimY, uint32_t dimZ,
418*e1eccf28SAndroid Build Coastguard Worker     bool mipmaps, bool faces, rs_yuv_format yuv_format);
419*e1eccf28SAndroid Build Coastguard Worker 
420*e1eccf28SAndroid Build Coastguard Worker extern rs_allocation __attribute__((overloadable)) rsCreateAllocation(
421*e1eccf28SAndroid Build Coastguard Worker         rs_type type, rs_allocation_mipmap_control mipmaps, uint32_t usages,
422*e1eccf28SAndroid Build Coastguard Worker         void *ptr);
423*e1eccf28SAndroid Build Coastguard Worker 
rsCreateElement(rs_data_type data_type)424*e1eccf28SAndroid Build Coastguard Worker rs_element __attribute__((overloadable)) rsCreateElement(
425*e1eccf28SAndroid Build Coastguard Worker         rs_data_type data_type) {
426*e1eccf28SAndroid Build Coastguard Worker 
427*e1eccf28SAndroid Build Coastguard Worker     switch (data_type) {
428*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_BOOLEAN:
429*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_FLOAT_16:
430*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_FLOAT_32:
431*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_FLOAT_64:
432*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_SIGNED_8:
433*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_SIGNED_16:
434*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_SIGNED_32:
435*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_SIGNED_64:
436*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_UNSIGNED_8:
437*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_UNSIGNED_16:
438*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_UNSIGNED_32:
439*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_UNSIGNED_64:
440*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_MATRIX_4X4:
441*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_MATRIX_3X3:
442*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_MATRIX_2X2:
443*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_ELEMENT:
444*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_TYPE:
445*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_ALLOCATION:
446*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_SCRIPT:
447*e1eccf28SAndroid Build Coastguard Worker             return rsCreateElement(data_type, RS_KIND_USER, false, 1);
448*e1eccf28SAndroid Build Coastguard Worker         default:
449*e1eccf28SAndroid Build Coastguard Worker             rsDebug("Invalid data_type", data_type);
450*e1eccf28SAndroid Build Coastguard Worker             return kInvalidElement;
451*e1eccf28SAndroid Build Coastguard Worker     }
452*e1eccf28SAndroid Build Coastguard Worker }
453*e1eccf28SAndroid Build Coastguard Worker 
rsCreateVectorElement(rs_data_type data_type,uint32_t vector_width)454*e1eccf28SAndroid Build Coastguard Worker rs_element __attribute__((overloadable)) rsCreateVectorElement(
455*e1eccf28SAndroid Build Coastguard Worker         rs_data_type data_type, uint32_t vector_width) {
456*e1eccf28SAndroid Build Coastguard Worker     if (vector_width < 2 || vector_width > 4) {
457*e1eccf28SAndroid Build Coastguard Worker         rsDebug("Invalid vector_width", vector_width);
458*e1eccf28SAndroid Build Coastguard Worker         return kInvalidElement;
459*e1eccf28SAndroid Build Coastguard Worker     }
460*e1eccf28SAndroid Build Coastguard Worker     switch (data_type) {
461*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_BOOLEAN:
462*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_FLOAT_16:
463*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_FLOAT_32:
464*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_FLOAT_64:
465*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_SIGNED_8:
466*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_SIGNED_16:
467*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_SIGNED_32:
468*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_SIGNED_64:
469*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_UNSIGNED_8:
470*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_UNSIGNED_16:
471*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_UNSIGNED_32:
472*e1eccf28SAndroid Build Coastguard Worker         case RS_TYPE_UNSIGNED_64:
473*e1eccf28SAndroid Build Coastguard Worker             return rsCreateElement(data_type, RS_KIND_USER, false,
474*e1eccf28SAndroid Build Coastguard Worker                                    vector_width);
475*e1eccf28SAndroid Build Coastguard Worker         default:
476*e1eccf28SAndroid Build Coastguard Worker             rsDebug("Invalid data_type for vector element", data_type);
477*e1eccf28SAndroid Build Coastguard Worker             return kInvalidElement;
478*e1eccf28SAndroid Build Coastguard Worker     }
479*e1eccf28SAndroid Build Coastguard Worker }
480*e1eccf28SAndroid Build Coastguard Worker 
rsCreatePixelElement(rs_data_type data_type,rs_data_kind data_kind)481*e1eccf28SAndroid Build Coastguard Worker rs_element __attribute__((overloadable)) rsCreatePixelElement(
482*e1eccf28SAndroid Build Coastguard Worker         rs_data_type data_type, rs_data_kind data_kind) {
483*e1eccf28SAndroid Build Coastguard Worker     if (data_type != RS_TYPE_UNSIGNED_8 &&
484*e1eccf28SAndroid Build Coastguard Worker         data_type != RS_TYPE_UNSIGNED_16 &&
485*e1eccf28SAndroid Build Coastguard Worker         data_type != RS_TYPE_UNSIGNED_5_6_5 &&
486*e1eccf28SAndroid Build Coastguard Worker         data_type != RS_TYPE_UNSIGNED_4_4_4_4 &&
487*e1eccf28SAndroid Build Coastguard Worker         data_type != RS_TYPE_UNSIGNED_5_5_5_1) {
488*e1eccf28SAndroid Build Coastguard Worker 
489*e1eccf28SAndroid Build Coastguard Worker         rsDebug("Invalid data_type for pixel element", data_type);
490*e1eccf28SAndroid Build Coastguard Worker         return kInvalidElement;
491*e1eccf28SAndroid Build Coastguard Worker     }
492*e1eccf28SAndroid Build Coastguard Worker     if (data_kind != RS_KIND_PIXEL_L &&
493*e1eccf28SAndroid Build Coastguard Worker         data_kind != RS_KIND_PIXEL_A &&
494*e1eccf28SAndroid Build Coastguard Worker         data_kind != RS_KIND_PIXEL_LA &&
495*e1eccf28SAndroid Build Coastguard Worker         data_kind != RS_KIND_PIXEL_RGB &&
496*e1eccf28SAndroid Build Coastguard Worker         data_kind != RS_KIND_PIXEL_RGBA &&
497*e1eccf28SAndroid Build Coastguard Worker         data_kind != RS_KIND_PIXEL_DEPTH &&
498*e1eccf28SAndroid Build Coastguard Worker         data_kind != RS_KIND_PIXEL_YUV) {
499*e1eccf28SAndroid Build Coastguard Worker 
500*e1eccf28SAndroid Build Coastguard Worker         rsDebug("Invalid data_kind for pixel element", data_type);
501*e1eccf28SAndroid Build Coastguard Worker         return kInvalidElement;
502*e1eccf28SAndroid Build Coastguard Worker     }
503*e1eccf28SAndroid Build Coastguard Worker     if (data_type == RS_TYPE_UNSIGNED_5_6_5 && data_kind != RS_KIND_PIXEL_RGB) {
504*e1eccf28SAndroid Build Coastguard Worker         rsDebug("Bad data_type and data_kind combo", data_type, data_kind);
505*e1eccf28SAndroid Build Coastguard Worker         return kInvalidElement;
506*e1eccf28SAndroid Build Coastguard Worker     }
507*e1eccf28SAndroid Build Coastguard Worker     if (data_type == RS_TYPE_UNSIGNED_5_5_5_1 &&
508*e1eccf28SAndroid Build Coastguard Worker         data_kind != RS_KIND_PIXEL_RGBA) {
509*e1eccf28SAndroid Build Coastguard Worker 
510*e1eccf28SAndroid Build Coastguard Worker         rsDebug("Bad data_type and data_kind combo", data_type, data_kind);
511*e1eccf28SAndroid Build Coastguard Worker         return kInvalidElement;
512*e1eccf28SAndroid Build Coastguard Worker     }
513*e1eccf28SAndroid Build Coastguard Worker     if (data_type == RS_TYPE_UNSIGNED_4_4_4_4 &&
514*e1eccf28SAndroid Build Coastguard Worker         data_kind != RS_KIND_PIXEL_RGBA) {
515*e1eccf28SAndroid Build Coastguard Worker 
516*e1eccf28SAndroid Build Coastguard Worker         rsDebug("Bad data_type and data_kind combo", data_type, data_kind);
517*e1eccf28SAndroid Build Coastguard Worker         return kInvalidElement;
518*e1eccf28SAndroid Build Coastguard Worker     }
519*e1eccf28SAndroid Build Coastguard Worker     if (data_type == RS_TYPE_UNSIGNED_16 && data_kind != RS_KIND_PIXEL_DEPTH) {
520*e1eccf28SAndroid Build Coastguard Worker         rsDebug("Bad data_type and data_kind combo", data_type, data_kind);
521*e1eccf28SAndroid Build Coastguard Worker         return kInvalidElement;
522*e1eccf28SAndroid Build Coastguard Worker     }
523*e1eccf28SAndroid Build Coastguard Worker 
524*e1eccf28SAndroid Build Coastguard Worker     int vector_width = 1;
525*e1eccf28SAndroid Build Coastguard Worker     switch (data_kind) {
526*e1eccf28SAndroid Build Coastguard Worker         case RS_KIND_PIXEL_LA:
527*e1eccf28SAndroid Build Coastguard Worker             vector_width = 2;
528*e1eccf28SAndroid Build Coastguard Worker             break;
529*e1eccf28SAndroid Build Coastguard Worker         case RS_KIND_PIXEL_RGB:
530*e1eccf28SAndroid Build Coastguard Worker             vector_width = 3;
531*e1eccf28SAndroid Build Coastguard Worker             break;
532*e1eccf28SAndroid Build Coastguard Worker         case RS_KIND_PIXEL_RGBA:
533*e1eccf28SAndroid Build Coastguard Worker             vector_width = 4;
534*e1eccf28SAndroid Build Coastguard Worker             break;
535*e1eccf28SAndroid Build Coastguard Worker         case RS_KIND_PIXEL_DEPTH:
536*e1eccf28SAndroid Build Coastguard Worker             vector_width = 2;
537*e1eccf28SAndroid Build Coastguard Worker             break;
538*e1eccf28SAndroid Build Coastguard Worker         default:
539*e1eccf28SAndroid Build Coastguard Worker             break;
540*e1eccf28SAndroid Build Coastguard Worker     }
541*e1eccf28SAndroid Build Coastguard Worker 
542*e1eccf28SAndroid Build Coastguard Worker     return rsCreateElement(data_type, data_kind, true, vector_width);
543*e1eccf28SAndroid Build Coastguard Worker }
544*e1eccf28SAndroid Build Coastguard Worker 
rsCreateType(rs_element element,uint32_t dimX,uint32_t dimY,uint32_t dimZ)545*e1eccf28SAndroid Build Coastguard Worker rs_type __attribute__((overloadable)) rsCreateType(rs_element element,
546*e1eccf28SAndroid Build Coastguard Worker                                                    uint32_t dimX, uint32_t dimY,
547*e1eccf28SAndroid Build Coastguard Worker                                                    uint32_t dimZ) {
548*e1eccf28SAndroid Build Coastguard Worker     return rsCreateType(element, dimX, dimY, dimZ, false, false, RS_YUV_NONE);
549*e1eccf28SAndroid Build Coastguard Worker }
550*e1eccf28SAndroid Build Coastguard Worker 
rsCreateType(rs_element element,uint32_t dimX,uint32_t dimY)551*e1eccf28SAndroid Build Coastguard Worker rs_type __attribute__((overloadable)) rsCreateType(rs_element element,
552*e1eccf28SAndroid Build Coastguard Worker                                                    uint32_t dimX,
553*e1eccf28SAndroid Build Coastguard Worker                                                    uint32_t dimY) {
554*e1eccf28SAndroid Build Coastguard Worker     return rsCreateType(element, dimX, dimY, 0, false, false, RS_YUV_NONE);
555*e1eccf28SAndroid Build Coastguard Worker }
556*e1eccf28SAndroid Build Coastguard Worker 
rsCreateType(rs_element element,uint32_t dimX)557*e1eccf28SAndroid Build Coastguard Worker rs_type __attribute__((overloadable)) rsCreateType(rs_element element,
558*e1eccf28SAndroid Build Coastguard Worker                                                    uint32_t dimX) {
559*e1eccf28SAndroid Build Coastguard Worker     return rsCreateType(element, dimX, 0, 0, false, false, RS_YUV_NONE);
560*e1eccf28SAndroid Build Coastguard Worker }
561*e1eccf28SAndroid Build Coastguard Worker 
rsCreateAllocation(rs_type type,uint32_t usage)562*e1eccf28SAndroid Build Coastguard Worker rs_allocation __attribute__((overloadable)) rsCreateAllocation(rs_type type,
563*e1eccf28SAndroid Build Coastguard Worker                                                                uint32_t usage) {
564*e1eccf28SAndroid Build Coastguard Worker     return rsCreateAllocation(type, RS_ALLOCATION_MIPMAP_NONE, usage, NULL);
565*e1eccf28SAndroid Build Coastguard Worker }
566*e1eccf28SAndroid Build Coastguard Worker 
rsCreateAllocation(rs_type type)567*e1eccf28SAndroid Build Coastguard Worker rs_allocation __attribute__((overloadable)) rsCreateAllocation(rs_type type) {
568*e1eccf28SAndroid Build Coastguard Worker     return rsCreateAllocation(type, RS_ALLOCATION_MIPMAP_NONE,
569*e1eccf28SAndroid Build Coastguard Worker                               RS_ALLOCATION_USAGE_SCRIPT, NULL);
570*e1eccf28SAndroid Build Coastguard Worker }
571