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