rs_allocation.c revision 1aa9dfc002f6b763d34d75d9f47abb4aa70584a2
1#include "rs_core.rsh"
2#include "rs_structs.h"
3
4// Opaque Allocation type operations
5extern uint32_t __attribute__((overloadable))
6    rsAllocationGetDimX(rs_allocation a) {
7    Allocation_t *alloc = (Allocation_t *)a.p;
8    return alloc->mHal.drvState.lod[0].dimX;
9}
10
11extern uint32_t __attribute__((overloadable))
12        rsAllocationGetDimY(rs_allocation a) {
13    Allocation_t *alloc = (Allocation_t *)a.p;
14    return alloc->mHal.drvState.lod[0].dimY;
15}
16
17extern uint32_t __attribute__((overloadable))
18        rsAllocationGetDimZ(rs_allocation a) {
19    Allocation_t *alloc = (Allocation_t *)a.p;
20    return alloc->mHal.drvState.lod[0].dimZ;
21}
22
23extern uint32_t __attribute__((overloadable))
24        rsAllocationGetDimLOD(rs_allocation a) {
25    Allocation_t *alloc = (Allocation_t *)a.p;
26    return alloc->mHal.state.hasMipmaps;
27}
28
29extern uint32_t __attribute__((overloadable))
30        rsAllocationGetDimFaces(rs_allocation a) {
31    Allocation_t *alloc = (Allocation_t *)a.p;
32    return alloc->mHal.state.hasFaces;
33}
34
35
36extern rs_element __attribute__((overloadable))
37        rsAllocationGetElement(rs_allocation a) {
38    Allocation_t *alloc = (Allocation_t *)a.p;
39    if (alloc == NULL) {
40        rs_element nullElem = {0};
41        return nullElem;
42    }
43    Type_t *type = (Type_t *)alloc->mHal.state.type;
44    rs_element returnElem = {type->mHal.state.element};
45    return returnElem;
46}
47
48// TODO: this needs to be optimized, obviously
49static void memcpy(void* dst, void* src, size_t size) {
50    char* dst_c = (char*) dst, *src_c = (char*) src;
51    for (; size > 0; size--) {
52        *dst_c++ = *src_c++;
53    }
54}
55
56#ifdef RS_DEBUG_RUNTIME
57#define ELEMENT_AT(T)                                                   \
58    extern void __attribute__((overloadable))                           \
59        rsSetElementAt_##T(rs_allocation a, const T *val, uint32_t x);  \
60    extern void __attribute__((overloadable))                           \
61        rsSetElementAt_##T(rs_allocation a, const T *val, uint32_t x, uint32_t y); \
62    extern void __attribute__((overloadable))                           \
63        rsSetElementAt_##T(rs_allocation a, const T *val, uint32_t x, uint32_t y, uint32_t z); \
64    extern void __attribute__((overloadable))                           \
65        rsGetElementAt_##T(rs_allocation a, T *val, uint32_t x);  \
66    extern void __attribute__((overloadable))                           \
67        rsGetElementAt_##T(rs_allocation a, T *val, uint32_t x, uint32_t y); \
68    extern void __attribute__((overloadable))                           \
69        rsGetElementAt_##T(rs_allocation a, T *val, uint32_t x, uint32_t y, uint32_t z); \
70                                                                        \
71    extern void __attribute__((overloadable))                           \
72    rsSetElementAt_##T(rs_allocation a, T val, uint32_t x) {            \
73        rsSetElementAt_##T(a, &val, x);                                 \
74    }                                                                   \
75    extern void __attribute__((overloadable))                           \
76    rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y) { \
77        rsSetElementAt_##T(a, &val, x, y);                              \
78    }                                                                   \
79    extern void __attribute__((overloadable))                           \
80    rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y, uint32_t z) { \
81        rsSetElementAt_##T(a, &val, x, y, z);                           \
82    }                                                                   \
83    extern T __attribute__((overloadable))                              \
84    rsGetElementAt_##T(rs_allocation a, uint32_t x) {                   \
85        T tmp;                                                          \
86        rsGetElementAt_##T(a, &tmp, x);                                 \
87        return tmp;                                                     \
88    }                                                                   \
89    extern T __attribute__((overloadable))                              \
90    rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y) {       \
91        T tmp;                                                          \
92        rsGetElementAt_##T(a, &tmp, x, y);                              \
93        return tmp;                                                     \
94    }                                                                   \
95    extern T __attribute__((overloadable))                              \
96    rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) { \
97        T tmp;                                                          \
98        rsGetElementAt_##T(a, &tmp, x, y, z);                           \
99        return tmp;                                                     \
100    }
101#else
102
103uint8_t*
104rsOffset(rs_allocation a, uint32_t sizeOf, uint32_t x, uint32_t y,
105         uint32_t z) {
106    Allocation_t *alloc = (Allocation_t *)a.p;
107    //#ifdef __LP64__
108    //    uint8_t *p = (uint8_t *)a.r;
109    //#else
110    uint8_t *p = (uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
111    //#endif
112    const uint32_t stride = (uint32_t)alloc->mHal.drvState.lod[0].stride;
113    const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
114    uint8_t *dp = &p[(sizeOf * x) + (y * stride) +
115                     (z * stride * dimY)];
116    return dp;
117}
118
119uint8_t*
120rsOffsetNs(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {
121    Allocation_t *alloc = (Allocation_t *)a.p;
122#ifdef __LP64__
123    uint8_t *p = (uint8_t *)a.r;
124#else
125    uint8_t *p = (uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
126#endif
127    const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
128    const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
129    const uint32_t sizeOf = alloc->mHal.state.elementSizeBytes;;
130    uint8_t *dp = &p[(sizeOf * x) + (y * stride) +
131                     (z * stride * dimY)];
132    return dp;
133}
134
135#define ELEMENT_AT(T)                                                   \
136                                                                        \
137    void                                                                \
138    rsSetElementAtImpl_##T(rs_allocation a, T val, uint32_t x,          \
139                           uint32_t y, uint32_t z);                     \
140                                                                        \
141    extern void __attribute__((overloadable))                           \
142    rsSetElementAt_##T(rs_allocation a, T val, uint32_t x) {            \
143        rsSetElementAtImpl_##T(a, val, x, 0, 0);                        \
144    }                                                                   \
145                                                                        \
146    extern void __attribute__((overloadable))                           \
147    rsSetElementAt_##T(rs_allocation a, T val, uint32_t x,              \
148                       uint32_t y) {                                    \
149        rsSetElementAtImpl_##T(a, val, x, y, 0);                        \
150    }                                                                   \
151                                                                        \
152    extern void __attribute__((overloadable))                           \
153    rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y,  \
154                       uint32_t z) {                                    \
155        rsSetElementAtImpl_##T(a, val, x, y, z);                        \
156    }                                                                   \
157                                                                        \
158    T                                                                   \
159    rsGetElementAtImpl_##T(rs_allocation a, uint32_t x, uint32_t y,     \
160                       uint32_t z);                                     \
161                                                                        \
162    extern T __attribute__((overloadable))                              \
163    rsGetElementAt_##T(rs_allocation a, uint32_t x) {                   \
164        return rsGetElementAtImpl_##T(a, x, 0, 0);                      \
165    }                                                                   \
166                                                                        \
167    extern T __attribute__((overloadable))                              \
168    rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y) {       \
169        return rsGetElementAtImpl_##T(a, x, y, 0);                      \
170    }                                                                   \
171                                                                        \
172    extern T __attribute__((overloadable))                              \
173    rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y,         \
174                       uint32_t z) {                                    \
175        return rsGetElementAtImpl_##T(a, x, y, z);                      \
176    }
177
178
179
180extern const void * __attribute__((overloadable))
181        rsGetElementAt(rs_allocation a, uint32_t x) {
182    Allocation_t *alloc = (Allocation_t *)a.p;
183    const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
184    const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
185    return &p[eSize * x];
186}
187
188extern const void * __attribute__((overloadable))
189        rsGetElementAt(rs_allocation a, uint32_t x, uint32_t y) {
190    Allocation_t *alloc = (Allocation_t *)a.p;
191    const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
192    const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
193    const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
194    return &p[(eSize * x) + (y * stride)];
195}
196
197extern const void * __attribute__((overloadable))
198        rsGetElementAt(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {
199    Allocation_t *alloc = (Allocation_t *)a.p;
200    const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
201    const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
202    const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
203    const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
204    return &p[(eSize * x) + (y * stride) + (z * stride * dimY)];
205}
206extern void __attribute__((overloadable))
207        rsSetElementAt(rs_allocation a, void* ptr, uint32_t x) {
208    Allocation_t *alloc = (Allocation_t *)a.p;
209    const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
210    const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
211    memcpy((void*)&p[eSize * x], ptr, eSize);
212}
213
214extern void __attribute__((overloadable))
215        rsSetElementAt(rs_allocation a, void* ptr, uint32_t x, uint32_t y) {
216    Allocation_t *alloc = (Allocation_t *)a.p;
217    const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
218    const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
219    const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
220    memcpy((void*)&p[(eSize * x) + (y * stride)], ptr, eSize);
221}
222
223extern void __attribute__((overloadable))
224        rsSetElementAt(rs_allocation a, void* ptr, uint32_t x, uint32_t y, uint32_t z) {
225    Allocation_t *alloc = (Allocation_t *)a.p;
226    const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr;
227    const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
228    const uint32_t stride = alloc->mHal.drvState.lod[0].stride;
229    const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY;
230    memcpy((void*)&p[(eSize * x) + (y * stride) + (z * stride * dimY)], ptr, eSize);
231}
232#endif
233
234ELEMENT_AT(char)
235ELEMENT_AT(char2)
236ELEMENT_AT(char3)
237ELEMENT_AT(char4)
238ELEMENT_AT(uchar)
239ELEMENT_AT(uchar2)
240ELEMENT_AT(uchar3)
241ELEMENT_AT(uchar4)
242ELEMENT_AT(short)
243ELEMENT_AT(short2)
244ELEMENT_AT(short3)
245ELEMENT_AT(short4)
246ELEMENT_AT(ushort)
247ELEMENT_AT(ushort2)
248ELEMENT_AT(ushort3)
249ELEMENT_AT(ushort4)
250ELEMENT_AT(int)
251ELEMENT_AT(int2)
252ELEMENT_AT(int3)
253ELEMENT_AT(int4)
254ELEMENT_AT(uint)
255ELEMENT_AT(uint2)
256ELEMENT_AT(uint3)
257ELEMENT_AT(uint4)
258ELEMENT_AT(long)
259ELEMENT_AT(long2)
260ELEMENT_AT(long3)
261ELEMENT_AT(long4)
262ELEMENT_AT(ulong)
263ELEMENT_AT(ulong2)
264ELEMENT_AT(ulong3)
265ELEMENT_AT(ulong4)
266ELEMENT_AT(float)
267ELEMENT_AT(float2)
268ELEMENT_AT(float3)
269ELEMENT_AT(float4)
270ELEMENT_AT(double)
271ELEMENT_AT(double2)
272ELEMENT_AT(double3)
273ELEMENT_AT(double4)
274
275#undef ELEMENT_AT
276
277
278extern const uchar __attribute__((overloadable))
279        rsGetElementAtYuv_uchar_Y(rs_allocation a, uint32_t x, uint32_t y) {
280    return rsGetElementAt_uchar(a, x, y);
281}
282
283extern const uchar __attribute__((overloadable))
284        rsGetElementAtYuv_uchar_U(rs_allocation a, uint32_t x, uint32_t y) {
285
286    Allocation_t *alloc = (Allocation_t *)a.p;
287
288    const size_t cstep = alloc->mHal.drvState.yuv.step;
289    const size_t shift = alloc->mHal.drvState.yuv.shift;
290    const size_t stride = alloc->mHal.drvState.lod[1].stride;
291
292    const uchar *pin = (const uchar *)alloc->mHal.drvState.lod[1].mallocPtr;
293
294    return pin[((x >> shift) * cstep) + ((y >> shift) * stride)];
295}
296
297extern const uchar __attribute__((overloadable))
298        rsGetElementAtYuv_uchar_V(rs_allocation a, uint32_t x, uint32_t y) {
299
300    Allocation_t *alloc = (Allocation_t *)a.p;
301
302    const size_t cstep = alloc->mHal.drvState.yuv.step;
303    const size_t shift = alloc->mHal.drvState.yuv.shift;
304    const size_t stride = alloc->mHal.drvState.lod[2].stride;
305
306    const uchar *pin = (const uchar *)alloc->mHal.drvState.lod[2].mallocPtr;
307
308    return pin[((x >> shift) * cstep) + ((y >> shift) * stride)];
309}
310
311
312#define VOP(T)                                                          \
313    extern void __rsAllocationVStoreXImpl_##T(rs_allocation a, const T val, uint32_t x, uint32_t y, uint32_t z); \
314    extern T __rsAllocationVLoadXImpl_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z); \
315                                                                        \
316    extern void __attribute__((overloadable))                           \
317    rsAllocationVStoreX_##T(rs_allocation a, T val, uint32_t x) {       \
318        __rsAllocationVStoreXImpl_##T(a, val, x, 0, 0);                 \
319    }                                                                   \
320    extern void __attribute__((overloadable))                           \
321    rsAllocationVStoreX_##T(rs_allocation a, T val, uint32_t x, uint32_t y) { \
322        __rsAllocationVStoreXImpl_##T(a, val, x, y, 0);                 \
323    }                                                                   \
324    extern void __attribute__((overloadable))                           \
325    rsAllocationVStoreX_##T(rs_allocation a, T val, uint32_t x, uint32_t y, uint32_t z) { \
326        __rsAllocationVStoreXImpl_##T(a, val, x, y, z);                 \
327    }                                                                   \
328    extern T __attribute__((overloadable))                              \
329    rsAllocationVLoadX_##T(rs_allocation a, uint32_t x) {               \
330        return __rsAllocationVLoadXImpl_##T(a, x, 0, 0);                \
331    }                                                                   \
332    extern T __attribute__((overloadable))                              \
333    rsAllocationVLoadX_##T(rs_allocation a, uint32_t x, uint32_t y) {   \
334        return __rsAllocationVLoadXImpl_##T(a, x, y, 0);                \
335    }                                                                   \
336    extern T __attribute__((overloadable))                              \
337    rsAllocationVLoadX_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) { \
338        return __rsAllocationVLoadXImpl_##T(a, x, y, z);                \
339    }
340
341VOP(char2)
342VOP(char3)
343VOP(char4)
344VOP(uchar2)
345VOP(uchar3)
346VOP(uchar4)
347VOP(short2)
348VOP(short3)
349VOP(short4)
350VOP(ushort2)
351VOP(ushort3)
352VOP(ushort4)
353VOP(int2)
354VOP(int3)
355VOP(int4)
356VOP(uint2)
357VOP(uint3)
358VOP(uint4)
359VOP(long2)
360VOP(long3)
361VOP(long4)
362VOP(ulong2)
363VOP(ulong3)
364VOP(ulong4)
365VOP(float2)
366VOP(float3)
367VOP(float4)
368VOP(double2)
369VOP(double3)
370VOP(double4)
371
372#undef VOP
373