1 #include "rs_core.rsh" 2 #include "rs_graphics.rsh" 3 #include "rs_structs.h" 4 5 // Opaque Allocation type operations 6 extern 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 12 extern 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 18 extern 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 24 extern 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 30 extern 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 37 extern 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 50 static 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 103 #else 104 #define ELEMENT_AT(T) \ 105 extern void __attribute__((overloadable)) \ 106 rsSetElementAt_##T(rs_allocation a, T val, uint32_t x) { \ 107 Allocation_t *alloc = (Allocation_t *)a.p; \ 108 uint8_t *p = (uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr; \ 109 const uint32_t eSize = sizeof(T); \ 110 *((T*)&p[(eSize * x)]) = val; \ 111 } \ 112 extern void __attribute__((overloadable)) \ 113 rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y) { \ 114 Allocation_t *alloc = (Allocation_t *)a.p; \ 115 uint8_t *p = (uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr; \ 116 const uint32_t eSize = sizeof(T); \ 117 const uint32_t stride = alloc->mHal.drvState.lod[0].stride; \ 118 *((T*)&p[(eSize * x) + (y * stride)]) = val; \ 119 } \ 120 extern void __attribute__((overloadable)) \ 121 rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y, uint32_t z) { \ 122 Allocation_t *alloc = (Allocation_t *)a.p; \ 123 uint8_t *p = (uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr; \ 124 const uint32_t stride = alloc->mHal.drvState.lod[0].stride; \ 125 const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY; \ 126 uint8_t *dp = &p[(sizeof(T) * x) + (y * stride) + (z * stride * dimY)]; \ 127 ((T*)dp)[0] = val; \ 128 } \ 129 extern T __attribute__((overloadable)) \ 130 rsGetElementAt_##T(rs_allocation a, uint32_t x) { \ 131 Allocation_t *alloc = (Allocation_t *)a.p; \ 132 const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr; \ 133 return *((T*)&p[(sizeof(T) * x)]); \ 134 } \ 135 extern T __attribute__((overloadable)) \ 136 rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y) { \ 137 Allocation_t *alloc = (Allocation_t *)a.p; \ 138 const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr; \ 139 const uint32_t stride = alloc->mHal.drvState.lod[0].stride; \ 140 return *((T*)&p[(sizeof(T) * x) + (y * stride)]); \ 141 } \ 142 extern T __attribute__((overloadable)) \ 143 rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) { \ 144 Allocation_t *alloc = (Allocation_t *)a.p; \ 145 const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr; \ 146 const uint32_t stride = alloc->mHal.drvState.lod[0].stride; \ 147 const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY; \ 148 const uint8_t *dp = &p[(sizeof(T) * x) + (y * stride) + (z * stride * dimY)]; \ 149 return ((const T*)dp)[0]; \ 150 } 151 152 153 154 extern const void * __attribute__((overloadable)) 155 rsGetElementAt(rs_allocation a, uint32_t x) { 156 Allocation_t *alloc = (Allocation_t *)a.p; 157 const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr; 158 const uint32_t eSize = alloc->mHal.state.elementSizeBytes; 159 return &p[eSize * x]; 160 } 161 162 extern const void * __attribute__((overloadable)) 163 rsGetElementAt(rs_allocation a, uint32_t x, uint32_t y) { 164 Allocation_t *alloc = (Allocation_t *)a.p; 165 const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr; 166 const uint32_t eSize = alloc->mHal.state.elementSizeBytes; 167 const uint32_t stride = alloc->mHal.drvState.lod[0].stride; 168 return &p[(eSize * x) + (y * stride)]; 169 } 170 171 extern const void * __attribute__((overloadable)) 172 rsGetElementAt(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) { 173 Allocation_t *alloc = (Allocation_t *)a.p; 174 const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[0].mallocPtr; 175 const uint32_t eSize = alloc->mHal.state.elementSizeBytes; 176 const uint32_t stride = alloc->mHal.drvState.lod[0].stride; 177 const uint32_t dimY = alloc->mHal.drvState.lod[0].dimY; 178 return &p[(eSize * x) + (y * stride) + (z * stride * dimY)]; 179 } 180 extern void __attribute__((overloadable)) 181 rsSetElementAt(rs_allocation a, void* ptr, 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 memcpy((void*)&p[eSize * x], ptr, eSize); 186 } 187 188 extern void __attribute__((overloadable)) 189 rsSetElementAt(rs_allocation a, void* ptr, 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 memcpy((void*)&p[(eSize * x) + (y * stride)], ptr, eSize); 195 } 196 197 extern void __attribute__((overloadable)) 198 rsSetElementAt(rs_allocation a, void* ptr, 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 memcpy((void*)&p[(eSize * x) + (y * stride) + (z * stride * dimY)], ptr, eSize); 205 } 206 #endif 207 208 ELEMENT_AT(char) 209 ELEMENT_AT(char2) 210 ELEMENT_AT(char3) 211 ELEMENT_AT(char4) 212 ELEMENT_AT(uchar) 213 ELEMENT_AT(uchar2) 214 ELEMENT_AT(uchar3) 215 ELEMENT_AT(uchar4) 216 ELEMENT_AT(short) 217 ELEMENT_AT(short2) 218 ELEMENT_AT(short3) 219 ELEMENT_AT(short4) 220 ELEMENT_AT(ushort) 221 ELEMENT_AT(ushort2) 222 ELEMENT_AT(ushort3) 223 ELEMENT_AT(ushort4) 224 ELEMENT_AT(int) 225 ELEMENT_AT(int2) 226 ELEMENT_AT(int3) 227 ELEMENT_AT(int4) 228 ELEMENT_AT(uint) 229 ELEMENT_AT(uint2) 230 ELEMENT_AT(uint3) 231 ELEMENT_AT(uint4) 232 ELEMENT_AT(long) 233 ELEMENT_AT(long2) 234 ELEMENT_AT(long3) 235 ELEMENT_AT(long4) 236 ELEMENT_AT(ulong) 237 ELEMENT_AT(ulong2) 238 ELEMENT_AT(ulong3) 239 ELEMENT_AT(ulong4) 240 ELEMENT_AT(float) 241 ELEMENT_AT(float2) 242 ELEMENT_AT(float3) 243 ELEMENT_AT(float4) 244 ELEMENT_AT(double) 245 ELEMENT_AT(double2) 246 ELEMENT_AT(double3) 247 ELEMENT_AT(double4) 248 249 #undef ELEMENT_AT 250 251 252 extern const uchar __attribute__((overloadable)) 253 rsGetElementAtYuv_uchar_Y(rs_allocation a, uint32_t x, uint32_t y) { 254 return rsGetElementAt_uchar(a, x, y); 255 } 256 257 extern const uchar __attribute__((overloadable)) 258 rsGetElementAtYuv_uchar_U(rs_allocation a, uint32_t x, uint32_t y) { 259 260 Allocation_t *alloc = (Allocation_t *)a.p; 261 const uint32_t yuvID = alloc->mHal.state.yuv; 262 const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[1].mallocPtr; 263 const uint32_t stride = alloc->mHal.drvState.lod[1].stride; 264 265 switch(yuvID) { 266 case 0x32315659: //HAL_PIXEL_FORMAT_YV12: 267 x >>= 1; 268 y >>= 1; 269 return p[x + (y * stride)]; 270 case 11: //HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 271 x >>= 1; 272 y >>= 1; 273 return p[(x<<1) + (y * stride)]; 274 default: 275 break; 276 } 277 278 return 0; 279 } 280 281 extern const uchar __attribute__((overloadable)) 282 rsGetElementAtYuv_uchar_V(rs_allocation a, uint32_t x, uint32_t y) { 283 284 Allocation_t *alloc = (Allocation_t *)a.p; 285 const uint32_t yuvID = alloc->mHal.state.yuv; 286 287 switch(yuvID) { 288 case 0x32315659: //HAL_PIXEL_FORMAT_YV12: 289 { 290 const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[2].mallocPtr; 291 const uint32_t stride = alloc->mHal.drvState.lod[2].stride; 292 x >>= 1; 293 y >>= 1; 294 return p[x + (y * stride)]; 295 } 296 case 11: //HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 297 { 298 const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.lod[1].mallocPtr; 299 const uint32_t stride = alloc->mHal.drvState.lod[1].stride; 300 x >>= 1; 301 y >>= 1; 302 return p[(x<<1) + (y * stride) + 1]; 303 } 304 default: 305 break; 306 } 307 308 return 0; 309 } 310 311