rs_allocation.c revision 3ff0fe77fdba8ad4a920dc27157d8c1786bb3661
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 uint8_t *p = (uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr; 108 const uint32_t stride = alloc->mHal.drvState.lod[0].stride; 109 const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY; 110 uint8_t *dp = &p[(sizeOf * x) + (y * stride) + 111 (z * stride * dimY)]; 112 return dp; 113} 114 115uint8_t* 116rsOffsetNs(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) { 117 Allocation_t *alloc = (Allocation_t *)a.p; 118 uint8_t *p = (uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr; 119 const uint32_t stride = alloc->mHal.drvState.lod[0].stride; 120 const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY; 121 const uint32_t sizeOf = alloc->mHal.state.elementSizeBytes;; 122 uint8_t *dp = &p[(sizeOf * x) + (y * stride) + 123 (z * stride * dimY)]; 124 return dp; 125} 126 127#define ELEMENT_AT(T) \ 128 \ 129 void \ 130 rsSetElementAtImpl_##T(rs_allocation a, T val, uint32_t x, \ 131 uint32_t y, uint32_t z); \ 132 \ 133 extern void __attribute__((overloadable)) \ 134 rsSetElementAt_##T(rs_allocation a, T val, uint32_t x) { \ 135 rsSetElementAtImpl_##T(a, val, x, 0, 0); \ 136 } \ 137 \ 138 extern void __attribute__((overloadable)) \ 139 rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, \ 140 uint32_t y) { \ 141 rsSetElementAtImpl_##T(a, val, x, y, 0); \ 142 } \ 143 \ 144 extern void __attribute__((overloadable)) \ 145 rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y, \ 146 uint32_t z) { \ 147 rsSetElementAtImpl_##T(a, val, x, y, z); \ 148 } \ 149 \ 150 T \ 151 rsGetElementAtImpl_##T(rs_allocation a, uint32_t x, uint32_t y, \ 152 uint32_t z); \ 153 \ 154 extern T __attribute__((overloadable)) \ 155 rsGetElementAt_##T(rs_allocation a, uint32_t x) { \ 156 return rsGetElementAtImpl_##T(a, x, 0, 0); \ 157 } \ 158 \ 159 extern T __attribute__((overloadable)) \ 160 rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y) { \ 161 return rsGetElementAtImpl_##T(a, x, y, 0); \ 162 } \ 163 \ 164 extern T __attribute__((overloadable)) \ 165 rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y, \ 166 uint32_t z) { \ 167 return rsGetElementAtImpl_##T(a, x, y, z); \ 168 } 169 170 171 172extern const void * __attribute__((overloadable)) 173 rsGetElementAt(rs_allocation a, uint32_t x) { 174 Allocation_t *alloc = (Allocation_t *)a.p; 175 const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr; 176 const uint32_t eSize = alloc->mHal.state.elementSizeBytes; 177 return &p[eSize * x]; 178} 179 180extern const void * __attribute__((overloadable)) 181 rsGetElementAt(rs_allocation a, uint32_t x, uint32_t y) { 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 const uint32_t stride = alloc->mHal.drvState.lod[0].stride; 186 return &p[(eSize * x) + (y * stride)]; 187} 188 189extern const void * __attribute__((overloadable)) 190 rsGetElementAt(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) { 191 Allocation_t *alloc = (Allocation_t *)a.p; 192 const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr; 193 const uint32_t eSize = alloc->mHal.state.elementSizeBytes; 194 const uint32_t stride = alloc->mHal.drvState.lod[0].stride; 195 const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY; 196 return &p[(eSize * x) + (y * stride) + (z * stride * dimY)]; 197} 198extern void __attribute__((overloadable)) 199 rsSetElementAt(rs_allocation a, void* ptr, uint32_t x) { 200 Allocation_t *alloc = (Allocation_t *)a.p; 201 const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr; 202 const uint32_t eSize = alloc->mHal.state.elementSizeBytes; 203 memcpy((void*)&p[eSize * x], ptr, eSize); 204} 205 206extern void __attribute__((overloadable)) 207 rsSetElementAt(rs_allocation a, void* ptr, uint32_t x, uint32_t y) { 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 const uint32_t stride = alloc->mHal.drvState.lod[0].stride; 212 memcpy((void*)&p[(eSize * x) + (y * stride)], ptr, eSize); 213} 214 215extern void __attribute__((overloadable)) 216 rsSetElementAt(rs_allocation a, void* ptr, uint32_t x, uint32_t y, uint32_t z) { 217 Allocation_t *alloc = (Allocation_t *)a.p; 218 const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr; 219 const uint32_t eSize = alloc->mHal.state.elementSizeBytes; 220 const uint32_t stride = alloc->mHal.drvState.lod[0].stride; 221 const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY; 222 memcpy((void*)&p[(eSize * x) + (y * stride) + (z * stride * dimY)], ptr, eSize); 223} 224#endif 225 226ELEMENT_AT(char) 227ELEMENT_AT(char2) 228ELEMENT_AT(char3) 229ELEMENT_AT(char4) 230ELEMENT_AT(uchar) 231ELEMENT_AT(uchar2) 232ELEMENT_AT(uchar3) 233ELEMENT_AT(uchar4) 234ELEMENT_AT(short) 235ELEMENT_AT(short2) 236ELEMENT_AT(short3) 237ELEMENT_AT(short4) 238ELEMENT_AT(ushort) 239ELEMENT_AT(ushort2) 240ELEMENT_AT(ushort3) 241ELEMENT_AT(ushort4) 242ELEMENT_AT(int) 243ELEMENT_AT(int2) 244ELEMENT_AT(int3) 245ELEMENT_AT(int4) 246ELEMENT_AT(uint) 247ELEMENT_AT(uint2) 248ELEMENT_AT(uint3) 249ELEMENT_AT(uint4) 250ELEMENT_AT(long) 251ELEMENT_AT(long2) 252ELEMENT_AT(long3) 253ELEMENT_AT(long4) 254ELEMENT_AT(ulong) 255ELEMENT_AT(ulong2) 256ELEMENT_AT(ulong3) 257ELEMENT_AT(ulong4) 258ELEMENT_AT(float) 259ELEMENT_AT(float2) 260ELEMENT_AT(float3) 261ELEMENT_AT(float4) 262ELEMENT_AT(double) 263ELEMENT_AT(double2) 264ELEMENT_AT(double3) 265ELEMENT_AT(double4) 266 267#undef ELEMENT_AT 268 269 270extern const uchar __attribute__((overloadable)) 271 rsGetElementAtYuv_uchar_Y(rs_allocation a, uint32_t x, uint32_t y) { 272 return rsGetElementAt_uchar(a, x, y); 273} 274 275extern const uchar __attribute__((overloadable)) 276 rsGetElementAtYuv_uchar_U(rs_allocation a, uint32_t x, uint32_t y) { 277 278 Allocation_t *alloc = (Allocation_t *)a.p; 279 280 const size_t cstep = alloc->mHal.drvState.yuv.step; 281 const size_t shift = alloc->mHal.drvState.yuv.shift; 282 const size_t stride = alloc->mHal.drvState.lod[1].stride; 283 284 const uchar *pin = (const uchar *)alloc->mHal.drvState.lod[1].mallocPtr; 285 286 return pin[((x >> shift) * cstep) + ((y >> shift) * stride)]; 287} 288 289extern const uchar __attribute__((overloadable)) 290 rsGetElementAtYuv_uchar_V(rs_allocation a, uint32_t x, uint32_t y) { 291 292 Allocation_t *alloc = (Allocation_t *)a.p; 293 294 const size_t cstep = alloc->mHal.drvState.yuv.step; 295 const size_t shift = alloc->mHal.drvState.yuv.shift; 296 const size_t stride = alloc->mHal.drvState.lod[2].stride; 297 298 const uchar *pin = (const uchar *)alloc->mHal.drvState.lod[2].mallocPtr; 299 300 return pin[((x >> shift) * cstep) + ((y >> shift) * stride)]; 301} 302 303 304#define VOP(T) \ 305 extern void __rsAllocationVStoreXImpl_##T(rs_allocation a, const T val, uint32_t x, uint32_t y, uint32_t z); \ 306 extern T __rsAllocationVLoadXImpl_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z); \ 307 \ 308 extern void __attribute__((overloadable)) \ 309 rsAllocationVStoreX_##T(rs_allocation a, T val, uint32_t x) { \ 310 __rsAllocationVStoreXImpl_##T(a, val, x, 0, 0); \ 311 } \ 312 extern void __attribute__((overloadable)) \ 313 rsAllocationVStoreX_##T(rs_allocation a, T val, uint32_t x, uint32_t y) { \ 314 __rsAllocationVStoreXImpl_##T(a, val, x, y, 0); \ 315 } \ 316 extern void __attribute__((overloadable)) \ 317 rsAllocationVStoreX_##T(rs_allocation a, T val, uint32_t x, uint32_t y, uint32_t z) { \ 318 __rsAllocationVStoreXImpl_##T(a, val, x, y, z); \ 319 } \ 320 extern T __attribute__((overloadable)) \ 321 rsAllocationVLoadX_##T(rs_allocation a, uint32_t x) { \ 322 return __rsAllocationVLoadXImpl_##T(a, x, 0, 0); \ 323 } \ 324 extern T __attribute__((overloadable)) \ 325 rsAllocationVLoadX_##T(rs_allocation a, uint32_t x, uint32_t y) { \ 326 return __rsAllocationVLoadXImpl_##T(a, x, y, 0); \ 327 } \ 328 extern T __attribute__((overloadable)) \ 329 rsAllocationVLoadX_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) { \ 330 return __rsAllocationVLoadXImpl_##T(a, x, y, z); \ 331 } 332 333VOP(char2) 334VOP(char3) 335VOP(char4) 336VOP(uchar2) 337VOP(uchar3) 338VOP(uchar4) 339VOP(short2) 340VOP(short3) 341VOP(short4) 342VOP(ushort2) 343VOP(ushort3) 344VOP(ushort4) 345VOP(int2) 346VOP(int3) 347VOP(int4) 348VOP(uint2) 349VOP(uint3) 350VOP(uint4) 351VOP(long2) 352VOP(long3) 353VOP(long4) 354VOP(ulong2) 355VOP(ulong3) 356VOP(ulong4) 357VOP(float2) 358VOP(float3) 359VOP(float4) 360VOP(double2) 361VOP(double3) 362VOP(double4) 363 364#undef VOP 365 366