1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /** @file rs_allocation.rsh 18 * \brief Allocation routines 19 * 20 * 21 */ 22 23 #ifndef __RS_ALLOCATION_RSH__ 24 #define __RS_ALLOCATION_RSH__ 25 26 /** 27 * Returns the Allocation for a given pointer. The pointer should point within 28 * a valid allocation. The results are undefined if the pointer is not from a 29 * valid allocation. 30 * 31 * This function is deprecated and will be removed in the SDK from a future 32 * release. 33 */ 34 extern rs_allocation __attribute__((overloadable)) 35 rsGetAllocation(const void *); 36 37 /** 38 * Query the dimension of an allocation. 39 * 40 * @return uint32_t The X dimension of the allocation. 41 */ 42 extern uint32_t __attribute__((overloadable)) 43 rsAllocationGetDimX(rs_allocation); 44 45 /** 46 * Query the dimension of an allocation. 47 * 48 * @return uint32_t The Y dimension of the allocation. 49 */ 50 extern uint32_t __attribute__((overloadable)) 51 rsAllocationGetDimY(rs_allocation); 52 53 /** 54 * Query the dimension of an allocation. 55 * 56 * @return uint32_t The Z dimension of the allocation. 57 */ 58 extern uint32_t __attribute__((overloadable)) 59 rsAllocationGetDimZ(rs_allocation); 60 61 /** 62 * Query an allocation for the presence of more than one LOD. 63 * 64 * @return uint32_t Returns 1 if more than one LOD is present, 0 otherwise. 65 */ 66 extern uint32_t __attribute__((overloadable)) 67 rsAllocationGetDimLOD(rs_allocation); 68 69 /** 70 * Query an allocation for the presence of more than one face. 71 * 72 * @return uint32_t Returns 1 if more than one face is present, 0 otherwise. 73 */ 74 extern uint32_t __attribute__((overloadable)) 75 rsAllocationGetDimFaces(rs_allocation); 76 77 #if (defined(RS_VERSION) && (RS_VERSION >= 14)) 78 79 /** 80 * Copy part of an allocation from another allocation. 81 * 82 * @param dstAlloc Allocation to copy data into. 83 * @param dstOff The offset of the first element to be copied in 84 * the destination allocation. 85 * @param dstMip Mip level in the destination allocation. 86 * @param count The number of elements to be copied. 87 * @param srcAlloc The source data allocation. 88 * @param srcOff The offset of the first element in data to be 89 * copied in the source allocation. 90 * @param srcMip Mip level in the source allocation. 91 */ 92 extern void __attribute__((overloadable)) 93 rsAllocationCopy1DRange(rs_allocation dstAlloc, 94 uint32_t dstOff, uint32_t dstMip, 95 uint32_t count, 96 rs_allocation srcAlloc, 97 uint32_t srcOff, uint32_t srcMip); 98 99 /** 100 * Copy a rectangular region into the allocation from another 101 * allocation. 102 * 103 * @param dstAlloc allocation to copy data into. 104 * @param dstXoff X offset of the region to update in the 105 * destination allocation. 106 * @param dstYoff Y offset of the region to update in the 107 * destination allocation. 108 * @param dstMip Mip level in the destination allocation. 109 * @param dstFace Cubemap face of the destination allocation, 110 * ignored for allocations that aren't cubemaps. 111 * @param width Width of the incoming region to update. 112 * @param height Height of the incoming region to update. 113 * @param srcAlloc The source data allocation. 114 * @param srcXoff X offset in data of the source allocation. 115 * @param srcYoff Y offset in data of the source allocation. 116 * @param srcMip Mip level in the source allocation. 117 * @param srcFace Cubemap face of the source allocation, 118 * ignored for allocations that aren't cubemaps. 119 */ 120 extern void __attribute__((overloadable)) 121 rsAllocationCopy2DRange(rs_allocation dstAlloc, 122 uint32_t dstXoff, uint32_t dstYoff, 123 uint32_t dstMip, 124 rs_allocation_cubemap_face dstFace, 125 uint32_t width, uint32_t height, 126 rs_allocation srcAlloc, 127 uint32_t srcXoff, uint32_t srcYoff, 128 uint32_t srcMip, 129 rs_allocation_cubemap_face srcFace); 130 131 #endif //defined(RS_VERSION) && (RS_VERSION >= 14) 132 133 /** 134 * Extract a single element from an allocation. 135 */ 136 extern const void * __attribute__((overloadable)) 137 rsGetElementAt(rs_allocation, uint32_t x); 138 /** 139 * \overload 140 */ 141 extern const void * __attribute__((overloadable)) 142 rsGetElementAt(rs_allocation, uint32_t x, uint32_t y); 143 /** 144 * \overload 145 */ 146 extern const void * __attribute__((overloadable)) 147 rsGetElementAt(rs_allocation, uint32_t x, uint32_t y, uint32_t z); 148 149 150 #if (defined(RS_VERSION) && (RS_VERSION >= 18)) 151 #define GET_ELEMENT_AT(T) \ 152 extern T __attribute__((overloadable)) \ 153 rsGetElementAt_##T(rs_allocation a, uint32_t x); \ 154 extern T __attribute__((overloadable)) \ 155 rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y); \ 156 extern T __attribute__((overloadable)) \ 157 rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z); 158 #else 159 #define GET_ELEMENT_AT(T) \ 160 static inline T __attribute__((overloadable)) \ 161 rsGetElementAt_##T(rs_allocation a, uint32_t x) { \ 162 return ((T *)rsGetElementAt(a, x))[0]; \ 163 } \ 164 static inline T __attribute__((overloadable)) \ 165 rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y) { \ 166 return ((T *)rsGetElementAt(a, x, y))[0]; \ 167 } \ 168 static inline T __attribute__((overloadable)) \ 169 rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) { \ 170 return ((T *)rsGetElementAt(a, x, y, z))[0]; \ 171 } 172 #endif 173 174 GET_ELEMENT_AT(char) 175 GET_ELEMENT_AT(char2) 176 GET_ELEMENT_AT(char3) 177 GET_ELEMENT_AT(char4) 178 GET_ELEMENT_AT(uchar) 179 GET_ELEMENT_AT(uchar2) 180 GET_ELEMENT_AT(uchar3) 181 GET_ELEMENT_AT(uchar4) 182 GET_ELEMENT_AT(short) 183 GET_ELEMENT_AT(short2) 184 GET_ELEMENT_AT(short3) 185 GET_ELEMENT_AT(short4) 186 GET_ELEMENT_AT(ushort) 187 GET_ELEMENT_AT(ushort2) 188 GET_ELEMENT_AT(ushort3) 189 GET_ELEMENT_AT(ushort4) 190 GET_ELEMENT_AT(int) 191 GET_ELEMENT_AT(int2) 192 GET_ELEMENT_AT(int3) 193 GET_ELEMENT_AT(int4) 194 GET_ELEMENT_AT(uint) 195 GET_ELEMENT_AT(uint2) 196 GET_ELEMENT_AT(uint3) 197 GET_ELEMENT_AT(uint4) 198 GET_ELEMENT_AT(long) 199 GET_ELEMENT_AT(long2) 200 GET_ELEMENT_AT(long3) 201 GET_ELEMENT_AT(long4) 202 GET_ELEMENT_AT(ulong) 203 GET_ELEMENT_AT(ulong2) 204 GET_ELEMENT_AT(ulong3) 205 GET_ELEMENT_AT(ulong4) 206 GET_ELEMENT_AT(float) 207 GET_ELEMENT_AT(float2) 208 GET_ELEMENT_AT(float3) 209 GET_ELEMENT_AT(float4) 210 GET_ELEMENT_AT(double) 211 GET_ELEMENT_AT(double2) 212 GET_ELEMENT_AT(double3) 213 GET_ELEMENT_AT(double4) 214 215 #undef GET_ELEMENT_AT 216 217 // Jelly Bean 218 #if (defined(RS_VERSION) && (RS_VERSION >= 16)) 219 220 /** 221 * Send the contents of the Allocation to the queue. 222 * @param a allocation to work on 223 */ 224 extern const void __attribute__((overloadable)) 225 rsAllocationIoSend(rs_allocation a); 226 227 /** 228 * Receive a new set of contents from the queue. 229 * @param a allocation to work on 230 */ 231 extern const void __attribute__((overloadable)) 232 rsAllocationIoReceive(rs_allocation a); 233 234 235 /** 236 * Get the element object describing the allocation's layout 237 * @param a allocation to get data from 238 * @return element describing allocation layout 239 */ 240 extern rs_element __attribute__((overloadable)) 241 rsAllocationGetElement(rs_allocation a); 242 243 /** 244 * Fetch allocation in a way described by the sampler 245 * @param a 1D allocation to sample from 246 * @param s sampler state 247 * @param location to sample from 248 */ 249 extern const float4 __attribute__((overloadable)) 250 rsSample(rs_allocation a, rs_sampler s, float location); 251 /** 252 * Fetch allocation in a way described by the sampler 253 * @param a 1D allocation to sample from 254 * @param s sampler state 255 * @param location to sample from 256 * @param lod mip level to sample from, for fractional values 257 * mip levels will be interpolated if 258 * RS_SAMPLER_LINEAR_MIP_LINEAR is used 259 */ 260 extern const float4 __attribute__((overloadable)) 261 rsSample(rs_allocation a, rs_sampler s, float location, float lod); 262 263 /** 264 * Fetch allocation in a way described by the sampler 265 * @param a 2D allocation to sample from 266 * @param s sampler state 267 * @param location to sample from 268 */ 269 extern const float4 __attribute__((overloadable)) 270 rsSample(rs_allocation a, rs_sampler s, float2 location); 271 272 /** 273 * Fetch allocation in a way described by the sampler 274 * @param a 2D allocation to sample from 275 * @param s sampler state 276 * @param location to sample from 277 * @param lod mip level to sample from, for fractional values 278 * mip levels will be interpolated if 279 * RS_SAMPLER_LINEAR_MIP_LINEAR is used 280 */ 281 extern const float4 __attribute__((overloadable)) 282 rsSample(rs_allocation a, rs_sampler s, float2 location, float lod); 283 284 #endif // (defined(RS_VERSION) && (RS_VERSION >= 16)) 285 286 #if (defined(RS_VERSION) && (RS_VERSION >= 18)) 287 288 /** 289 * Set single element of an allocation. 290 */ 291 extern void __attribute__((overloadable)) 292 rsSetElementAt(rs_allocation a, void* ptr, uint32_t x); 293 294 /** 295 * \overload 296 */ 297 extern void __attribute__((overloadable)) 298 rsSetElementAt(rs_allocation a, void* ptr, uint32_t x, uint32_t y); 299 300 #define SET_ELEMENT_AT(T) \ 301 extern void __attribute__((overloadable)) \ 302 rsSetElementAt_##T(rs_allocation a, T val, uint32_t x); \ 303 extern void __attribute__((overloadable)) \ 304 rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y); \ 305 extern void __attribute__((overloadable)) \ 306 rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y, uint32_t z); 307 308 309 SET_ELEMENT_AT(char) 310 SET_ELEMENT_AT(char2) 311 SET_ELEMENT_AT(char3) 312 SET_ELEMENT_AT(char4) 313 SET_ELEMENT_AT(uchar) 314 SET_ELEMENT_AT(uchar2) 315 SET_ELEMENT_AT(uchar3) 316 SET_ELEMENT_AT(uchar4) 317 SET_ELEMENT_AT(short) 318 SET_ELEMENT_AT(short2) 319 SET_ELEMENT_AT(short3) 320 SET_ELEMENT_AT(short4) 321 SET_ELEMENT_AT(ushort) 322 SET_ELEMENT_AT(ushort2) 323 SET_ELEMENT_AT(ushort3) 324 SET_ELEMENT_AT(ushort4) 325 SET_ELEMENT_AT(int) 326 SET_ELEMENT_AT(int2) 327 SET_ELEMENT_AT(int3) 328 SET_ELEMENT_AT(int4) 329 SET_ELEMENT_AT(uint) 330 SET_ELEMENT_AT(uint2) 331 SET_ELEMENT_AT(uint3) 332 SET_ELEMENT_AT(uint4) 333 SET_ELEMENT_AT(long) 334 SET_ELEMENT_AT(long2) 335 SET_ELEMENT_AT(long3) 336 SET_ELEMENT_AT(long4) 337 SET_ELEMENT_AT(ulong) 338 SET_ELEMENT_AT(ulong2) 339 SET_ELEMENT_AT(ulong3) 340 SET_ELEMENT_AT(ulong4) 341 SET_ELEMENT_AT(float) 342 SET_ELEMENT_AT(float2) 343 SET_ELEMENT_AT(float3) 344 SET_ELEMENT_AT(float4) 345 SET_ELEMENT_AT(double) 346 SET_ELEMENT_AT(double2) 347 SET_ELEMENT_AT(double3) 348 SET_ELEMENT_AT(double4) 349 350 #undef SET_ELEMENT_AT 351 352 353 /** 354 * Extract a single element from an allocation. 355 */ 356 extern const uchar __attribute__((overloadable)) 357 rsGetElementAtYuv_uchar_Y(rs_allocation a, uint32_t x, uint32_t y); 358 359 /** 360 * Extract a single element from an allocation. 361 * 362 * Coordinates are in the dimensions of the Y plane 363 */ 364 extern const uchar __attribute__((overloadable)) 365 rsGetElementAtYuv_uchar_U(rs_allocation a, uint32_t x, uint32_t y); 366 367 /** 368 * Extract a single element from an allocation. 369 * 370 * Coordinates are in the dimensions of the Y plane 371 */ 372 extern const uchar __attribute__((overloadable)) 373 rsGetElementAtYuv_uchar_V(rs_allocation a, uint32_t x, uint32_t y); 374 375 #endif // (defined(RS_VERSION) && (RS_VERSION >= 18)) 376 377 #endif 378 379