1/* 2 * Copyright (C) 2017 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 17package android.hardware.renderscript@1.0; 18 19import android.hardware.renderscript@1.0::types; 20 21// TODO: is there any way to keep this documentation in sync with the 22// corresponding Java doc? 23// 24// TODO: Some of the documentation was taken from Java docs, whereas others were 25// undocumented. Because of this, there's somewhat two different styles of 26// comments. Look into having a consistent convention. 27// 28// TODO: There was some confusion as to why some paramters use vec<> and others 29// use Ptr/Size. The convention is that vec<> is used whenever the paramter is 30// only an input parameter. HIDL is not supposed to include any output 31// parameters, so a more explicit Ptr/Size is used. 32 33interface IContext { 34 35 /** 36 * TODO: Do we need to define "selectors"? It may be a property of the 37 * "adapted allocation" that's returned. 38 * 39 * Creates an arbitrary window into the base allocation. The type describes 40 * the shape of the window. Any dimensions present in the type must be 41 * equal to or smaller than the dimensions in the source allocation. A 42 * dimension present in the allocation that is not present in the type must 43 * be constrained away with the selectors. If a dimension is present in 44 * both the type and allocation, one of two things must happen. If the type 45 * is smaller than the allocation, a window must be created, the selected 46 * value in the adapter for that dimension must act as the base address, 47 * and the type must describe the size of the view starting at that point. 48 * If the type and allocation dimension are of the same size, then setting 49 * the selector for the dimension must be an error. 50 * 51 * @param type Type describing data layout 52 * @param baseAlloc Allocation 53 * @return subAlloc AllocationAdapter 54 */ 55 @callflow(next={"*"}) 56 allocationAdapterCreate(Type type, Allocation baseAlloc) 57 generates (AllocationAdapter subAlloc); 58 59 /** 60 * TODO: Need to relate "offset" back to the terminology in 61 * allocationAdapterCreate() -- the latter uses the terms "selector" and 62 * "selected value". Can we use consistent terminology? Are "offset" and 63 * "selector" actually two different things? 64 * 65 * TODO: Explain the flattened layout in the offsets vec 66 * 67 * Sets the offsets for an Allocation Adapter. 68 * 69 * @param alloc AllocationAdapter 70 * @param offsets Collection of offsets 71 */ 72 @callflow(next={"*"}) 73 allocationAdapterOffset(AllocationAdapter alloc, vec<uint32_t> offsets); 74 75 /** 76 * TODO: add more explanation here. 77 * 78 * Returns the Type of the Allocation. 79 * 80 * @param allocation Allocation 81 * @return type Allocation's Type 82 */ 83 @callflow(next={"*"}) 84 allocationGetType(Allocation allocation) generates (Type type); 85 86 /** 87 * TODO: more clarification needed describing if the pointer can be aliased 88 * or if the data can outlive the allocation. 89 * 90 * Creates an Allocation for use by scripts with a given Type and a backing 91 * pointer. For use with ALLOCATION_USAGE_SHARED. 92 * 93 * @param type Type describing data layout 94 * @param mips AllocationMipmapControl specifies desired mipmap behavior for 95 * the allocation 96 * @param usage Bit field specifying how the Allocation is utilized 97 * @param ptr Pointer to client-side data 98 * @return allocation Created Allocation 99 */ 100 @callflow(next={"*"}) 101 allocationCreateTyped(Type type, AllocationMipmapControl mips, 102 bitfield<AllocationUsageType> usage, Ptr ptr) 103 generates (Allocation allocation); 104 105 /** 106 * Creates an Allocation from a Bitmap. 107 * 108 * @param type Type describing data layout 109 * @param mips AllocationMipmapControl specifies desired mipmap behavior for 110 * the allocation 111 * @param bitmap Bitmap source for the allocation data 112 * @param usage Bit field specifying how the Allocation is utilized 113 * @return allocation Created Allocation containing bitmap data 114 */ 115 @callflow(next={"*"}) 116 allocationCreateFromBitmap(Type type, AllocationMipmapControl mips, 117 vec<uint8_t> bitmap, 118 bitfield<AllocationUsageType> usage) 119 generates (Allocation allocation); 120 121 /** 122 * Creates a Cubemapped Allocation from a Bitmap. 123 * 124 * @param type Type describing data layout 125 * @param mips AllocationMipmapControl specifies desired mipmap behavior 126 * for the allocation 127 * @param bitmap Bitmap with cubemap faces layed out in the following 128 * format: right, left, top, bottom, front, back 129 * @param usage Bit field specifying how the Allocation is used 130 * @return allocation Created Allocation containing cubemap data 131 */ 132 @callflow(next={"*"}) 133 allocationCubeCreateFromBitmap(Type type, AllocationMipmapControl mips, 134 vec<uint8_t> bitmap, 135 bitfield<AllocationUsageType> usage) 136 generates (Allocation allocation); 137 138 /** 139 * Returns the handle to a raw buffer that is being managed by the screen 140 * compositor. This operation is only valid for Allocations with 141 * USAGE_IO_INPUT. 142 * 143 * @param allocation Allocation 144 * @return nativeWindow NativeWindow object associated with allocation 145 */ 146 @callflow(next={"*"}) 147 allocationGetNativeWindow(Allocation allocation) 148 generates (NativeWindow nativeWindow); 149 150 /** 151 * TODO: more clarification needed 152 * 153 * Sets the NativeWindow of an Allocation. This operation is only valid 154 * for Allocations with USAGE_IO_INPUT. 155 * 156 * @param allocation Allocation to be modified 157 * @pram nativeWindow NativeWindow to associate with allocation 158 */ 159 @callflow(next={"*"}) 160 allocationSetNativeWindow(Allocation allocation, NativeWindow nativewindow); 161 162 /** 163 * Initialize BufferQueue with specified max number of buffers. 164 * 165 * @param alloc Allocation 166 * @param numBuffer Maximum number of buffers 167 */ 168 @callflow(next={"*"}) 169 allocationSetupBufferQueue(Allocation alloc, uint32_t numBuffer); 170 171 /** 172 * TODO: clearly define baseAlloc vs subAlloc 173 * 174 * Shares the BufferQueue with another Allocation. Both must be 175 * USAGE_IO_INPUT Allocations. 176 * 177 * @param baseAlloc Base Allocation 178 * @param subAlloc Allocation to use the same buffer queue as the Base 179 * Allocation 180 */ 181 @callflow(next={"*"}) 182 allocationShareBufferQueue(Allocation baseAlloc, Allocation subAlloc); 183 184 /** 185 * Copies from the Allocation into a Bitmap. The bitmap must match the 186 * dimensions of the Allocation. 187 * 188 * HIDL is always running in Passthrough mode for RenderScript, so the 189 * buffer is modified directly by the driver. 190 * 191 * @param allocation Allocation 192 * @param data Buffer to be copied into 193 * @param sizeBytes Size of the buffer pointed to by "data" 194 */ 195 @callflow(next={"*"}) 196 allocationCopyToBitmap(Allocation allocation, Ptr data, Size sizeBytes); 197 198 /** 199 * TODO: should we consolidate all [123]DWrite functions or [123]DRead 200 * functions into the same API call? Our current plan is to be very similar 201 * to the dispatch table API. How much should we deviate from the original 202 * API? 203 * TODO: better description on Vec3/Vec4 and padding. 204 * 205 * Copies data into a 1D region of this Allocation. 206 * 207 * When this HAL entry is executed, all Vec3 elements have been explicitly 208 * padded as Vec4 elements. 209 * 210 * The size of the region is: count * Element's size. 211 * 212 * @param allocation Allocation to be modified 213 * @param offset The offset of the first element to be copied 214 * @param lod Selected mipmap level of detail 215 * @param count Number of elements to be copied 216 * @param data Source data to be copied to Allocation 217 */ 218 @callflow(next={"*"}) 219 allocation1DWrite(Allocation allocation, uint32_t offset, uint32_t lod, 220 uint32_t count, vec<uint8_t> data); 221 222 /** 223 * Copies a value into a single sub-Element of this Allocation. 224 * 225 * @param allocation Allocation to be updated 226 * @param x X position of the first element in the Allocation to be updated 227 * @param y Y position of the first element in the Allocation to be 228 * updated; for a 1D Allocation, this value must be 0 229 * @param z Z position of the first element in the Allocation to be 230 * updated; for a 1D or 2D Allocation, this value must be 0 231 * @param lod Selected mipmap level of detail 232 * @param data Data to be copied from 233 * @param compIdx Component number to identify which sub-Element is updated 234 */ 235 @callflow(next={"*"}) 236 allocationElementWrite(Allocation allocation, uint32_t x, uint32_t y, 237 uint32_t z, uint32_t lod, vec<uint8_t> data, 238 Size compIdx); 239 240 /** 241 * Copies from an array into a rectangular region in this Allocation. 242 * 243 * When this HAL entry is executed, all Vec3 elements have been explicitly 244 * padded as Vec4 elements. 245 * 246 * The size of the region is: w * h * Element's size. 247 * 248 * @param allocation Allocation to be modified 249 * @param xoff X offset of the region to update in this Allocation 250 * @param yoff Y offset of the region to update in this Allocation 251 * @param lod Selected mipmap level of detail 252 * @param face AllocationCubemapFace 253 * @param w Width of the region to update 254 * @param h Height of the region to update 255 * @param data Data to be placed into the Allocation 256 * @param stride For 1D Allocation, the stride must be the number of bytes 257 * of this Allocation. For 2D and 3D Allocations, the stride 258 * must be the stride in X dimension measuring in bytes. 259 */ 260 @callflow(next={"*"}) 261 allocation2DWrite(Allocation allocation, uint32_t xoff, uint32_t yoff, 262 uint32_t lod, AllocationCubemapFace face, uint32_t w, 263 uint32_t h, vec<uint8_t> data, Size stride); 264 265 /** 266 * Copies from an array into a 3D region in this Allocation. 267 * 268 * When this HAL entry is executed, all Vec3 elements have been explicitly 269 * padded as Vec4 elements. 270 * 271 * The size of the region is: w * h * d * Element's size. 272 * 273 * @param allocation Allocation to be modified 274 * @param xoff X offset of the region to update in this Allocation 275 * @param yoff Y offset of the region to update in this Allocation 276 * @param zoff Z offset of the region to update in this Allocation 277 * @param lod Selected mipmap level of detail 278 * @param w Width of the region to update 279 * @param h Height of the region to update 280 * @param d Depth of the region to update 281 * @param data Data to be placed in the Allocation 282 * @param stride For 1D Allocation, the stride must be the number of bytes 283 * of this Allocation. For 2D and 3D Allocations, the stride 284 * must be the stride in X dimension measuring in bytes. 285 */ 286 @callflow(next={"*"}) 287 allocation3DWrite(Allocation allocation, uint32_t xoff, uint32_t yoff, 288 uint32_t zoff, uint32_t lod, uint32_t w, uint32_t h, 289 uint32_t d, vec<uint8_t> data, Size stride); 290 291 /** 292 * Generates a mipmap chain. This is only valid if the Type of the 293 * Allocation includes mipmaps. 294 * 295 * This function generates a complete set of mipmaps from the top level 296 * LOD. 297 * 298 * If the Allocation is also using other memory spaces, a call to 299 * allocationSyncAll(context, allocation, usage) is required. 300 * 301 * @param allocation Allocation which has its top LOD read and lower LOD 302 * written to 303 */ 304 @callflow(next={"*"}) 305 allocationGenerateMipmaps(Allocation allocation); 306 307 /** 308 * Copies all of an Allocation's data into an array. 309 * 310 * All Vec3 elements of an Allocation are padded to be Vec4, so the data 311 * returned by this function automatically includes padding. 312 * 313 * HIDL is always running in Passthrough mode for RenderScript, so the 314 * buffer is modified directly by the driver. 315 * 316 * @param allocation Allocation to be read 317 * @param data Buffer to be copied into 318 * @param sizeBytes Size of the buffer pointed to by "data" 319 */ 320 @callflow(next={"*"}) 321 allocationRead(Allocation allocation, Ptr data, Size sizeBytes); 322 323 /** 324 * Copies a 1D region of this Allocation into an array. 325 * 326 * All Vec3 elements of an Allocation are padded to be Vec4, so the data 327 * returned by this function automatically includes padding. 328 * 329 * The size of the region is: count * Element's size. 330 * 331 * HIDL is always running in Passthrough mode for RenderScript, so the 332 * buffer is modified directly by the driver. 333 * 334 * @param allocation Allocation to be read 335 * @param xoff X offset of the first element to be copied 336 * @param lod Mipmap level of detail 337 * @param count The number of elements to be copied 338 * @param data Buffer to be copied into 339 * @param sizeBytes Size of the buffer pointed to by "data" 340 */ 341 @callflow(next={"*"}) 342 allocation1DRead(Allocation allocation, uint32_t xoff, uint32_t lod, 343 uint32_t count, Ptr data, Size sizeBytes); 344 345 /** 346 * Returns the value of a single sub-Element of this Allocation. 347 * 348 * HIDL is always running in Passthrough mode for RenderScript, so the 349 * buffer is modified directly by the driver. 350 * 351 * @param allocation Allocation to be read 352 * @param x X position of the first element in the Allocation to be read 353 * @param y Y position of the first element in the Allocation to be read 354 * @param z Z position of the first element in the Allocation to be read 355 * @param lod Mipmap level of detail 356 * @param data Buffer to be copied into 357 * @param sizeBytes Size of the buffer pointed to by "data" 358 * @param compIdx Component number to identify which sub-Element is updated 359 */ 360 @callflow(next={"*"}) 361 allocationElementRead(Allocation allocation, uint32_t x, uint32_t y, 362 uint32_t z, uint32_t lod, Ptr data, Size sizeBytes, 363 Size compIdx); 364 365 /** 366 * Copies from a rectangular region in this Allocation to an array. 367 * 368 * All Vec3 elements of an Allocation are padded to be Vec4, so the data 369 * returned by this function automatically includes padding. 370 * 371 * The size of the region is: w * h * Element's size. 372 * 373 * HIDL is always running in Passthrough mode for RenderScript, so the 374 * buffer is modified directly by the driver. 375 * 376 * @param allocation Allocation to be read 377 * @param xoff X offset of the region to copy in this array 378 * @param yoff Y offset of the region to copy in this array 379 * @param lod Mipmap level of detail 380 * @param face AllocationCubemapFace 381 * @param w Width of the region to copy 382 * @param h Height of the region to copy 383 * @param data Buffer to be copied into 384 * @param sizeBytes Size of the buffer pointed to by "data" 385 * @param stride For 1D Allocation, the stride must be the number of bytes 386 * of this Allocation. For 2D and 3D Allocations, the stride 387 * must be the stride in X dimension measuring in bytes. 388 */ 389 @callflow(next={"*"}) 390 allocation2DRead(Allocation allocation, uint32_t xoff, uint32_t yoff, 391 uint32_t lod, AllocationCubemapFace face, uint32_t w, 392 uint32_t h, Ptr data, Size sizeBytes, Size stride); 393 394 /** 395 * Copies from a rectangular cuboid region in this Allocation to an array. 396 * 397 * All Vec3 elements of an Allocation are padded to be Vec4, so the data 398 * returned by this function automatically includes padding. 399 * 400 * The size of the region is: w * h * d * Element's size. 401 * 402 * HIDL is always running in Passthrough mode for RenderScript, so the 403 * buffer is modified directly by the driver. 404 * 405 * @param allocation Allocation to be read 406 * @param xoff X offset of the region to copy in this array 407 * @param yoff Y offset of the region to copy in this array 408 * @param zoff Z offset of the region to copy in this array 409 * @param lod Mipmap level of detail 410 * @param w Width of the region to copy 411 * @param h Height of the region to copy 412 * @param d Depth of the region to copy 413 * @param data Buffer to be copied into 414 * @param sizeBytes Size of the buffer pointed to by "data" 415 * @param stride For 1D Allocation, the stride must be the number of bytes 416 * of this Allocation. For 2D and 3D Allocations, the stride 417 * must be the stride in X dimension measuring in bytes. 418 */ 419 @callflow(next={"*"}) 420 allocation3DRead(Allocation allocation, uint32_t xoff, uint32_t yoff, 421 uint32_t zoff, uint32_t lod, uint32_t w, uint32_t h, 422 uint32_t d, Ptr data, Size sizeBytes, Size stride); 423 424 /** 425 * Propagates changes from one usage of the Allocation to the other usages 426 * of the Allocation. 427 * 428 * @param allocation First usage of the Allocation 429 * @param usageType Allocation usage type 430 */ 431 @callflow(next={"*"}) 432 allocationSyncAll(Allocation allocation, AllocationUsageType usageType); 433 434 /** 435 * TODO: describe the functionality of resize1D better 436 * TODO: original Java Doc description seems to contradict itself ("with 437 * null contents and the region is otherwise undefined") 438 * TODO: should "new elements" be "new cells"? 439 * TODO: what does "objects are created" mean? 440 * TODO: what does "new dimension" mean? IS the type of the resized 441 * allocation different than the type before resizing? 442 * 443 * Resizes a 1D allocation. The contents of the allocation are preserved. 444 * If new elements are allocated, objects are created with null contents 445 * and the new region is otherwise undefined. 446 * 447 * If the new region is smaller, the references of any object outside the 448 * new region must be released. 449 * 450 * A new type must be created with the new dimension. 451 * 452 * @param allocation Allocation to be resized 453 * @param dimX New size along the x dimension of the Allocation 454 */ 455 @callflow(next={"*"}) 456 allocationResize1D(Allocation allocation, uint32_t dimX); 457 458 /** 459 * TODO: There are allocationCopy2DRange and 3DRange, but no 1DRange. Should 460 * the interface be cleaned up more? 461 * 462 * Copies a rectangular region from an Allocation into a rectangular region 463 * in this Allocation. 464 * 465 * @param dstAlloc Allocation to be updated 466 * @param dstXoff X offset of the region to update 467 * @param dstYoff Y offset of the region to update 468 * @param dstMip Selected mipmap level of the Allocation to update 469 * @param dstFace Destination AllocationCubemapFace 470 * @param width Width of the region to update 471 * @param height Height of the region to update 472 * @param srcAlloc Source Allocation, to be read 473 * @param srcXoff X offset of the region in the source Allocation 474 * @param srcYoff Y offset of the region in the source Allocation 475 * @param srcMip Selected mipmap level of the source Allocation 476 * @param srcFace Source AllocationCubemapFace 477 */ 478 @callflow(next={"*"}) 479 allocationCopy2DRange(Allocation dstAlloc, uint32_t dstXoff, 480 uint32_t dstYoff, uint32_t dstMip, 481 AllocationCubemapFace dstFace, uint32_t width, 482 uint32_t height, Allocation srcAlloc, 483 uint32_t srcXoff, uint32_t srcYoff, uint32_t srcMip, 484 AllocationCubemapFace srcFace); 485 486 /** 487 * Copies a rectangular cuboid region into the allocation from another 488 * Allocation. 489 * 490 * @param dstAlloc Allocation to be updated 491 * @param dstXoff X offset of the region to update 492 * @param dstYoff Y offset of the region to update 493 * @param dstZoff Z offset of the region to update 494 * @param dstMip Selected mipmap level of the Allocation to update 495 * @param width Width of the region to update 496 * @param height Height of the region to update 497 * @param depth Depth of the region to update 498 * @param srcAlloc Source Allocation, to be read 499 * @param srcXoff Source X offset of the region in the source Allocation 500 * @param srcYoff Source Y offset of the region in the source Allocation 501 * @param srcZoff Source Z offset of the region in the souce Allocation 502 * @param srcMip Selected mipmap level of the Allocation to read 503 */ 504 @callflow(next={"*"}) 505 allocationCopy3DRange(Allocation dstAlloc, uint32_t dstXoff, 506 uint32_t dstYoff, uint32_t dstZoff, uint32_t dstMip, 507 uint32_t width, uint32_t height, uint32_t depth, 508 Allocation srcAlloc, uint32_t srcXoff, 509 uint32_t srcYoff, uint32_t srcZoff, uint32_t srcMip); 510 511 /** 512 * TODO: define buffer and output stream 513 * 514 * Sends a buffer to the output stream. The contents of the Allocation may 515 * be undefined after this operation. This operation is only valid if 516 * USAGE_IO_OUTPUT is set on the Allocation. 517 * 518 * @param allocation Allocation to be sent 519 */ 520 @callflow(next={"*"}) 521 allocationIoSend(Allocation allocation); 522 523 /** 524 * Receives the latest input into the Allocation. This operation is only 525 * valid if USAGE_IO_INPUT is set on the Allocation, otherwise an error 526 * must be reported and no operations may be executed. 527 * 528 * @param allocation Allocation to be updated 529 */ 530 @callflow(next={"*"}) 531 allocationIoReceive(Allocation allocation); 532 533 /** 534 * TODO: describe default values for lod, face, and z better. 535 * TODO: what cases can invalidate the pointer? Resize? It should be 536 * clarified that this method should always return a valid pointer, but the 537 * returned pointer might become invalid later. 538 * 539 * Retrieves the pointer to the actual data an Allocation contains as well 540 * as the data's stride. 541 * 542 * If Allocation lacks the corresponding dimension for lod, face, or z, an 543 * error message must be sent to the message queue and nullptr must be 544 * returned for dataPtr and 0 for stride. All missing values must be 0 or 545 * NONE in the corresponding enum. 546 * 547 * @param allocation Allocation 548 * @param lod Mipmap level of detail 549 * @param face AllocationCubemapFace 550 * @param z Z position 551 * @return pointer Pointer to the server-side data; if this points to an 552 * invalid location in memory (because the buffer was 553 * freed), this may result in undefined behavior 554 * @return stride For 1D Allocation, the stride must be the number of bytes 555 * of this Allocation. For 2D and 3D Allocations, the stride 556 * must be the stride in X dimension measuring in bytes. 557 */ 558 @callflow(next={"*"}) 559 allocationGetPointer(Allocation allocation, uint32_t lod, 560 AllocationCubemapFace face, uint32_t z) 561 generates (Ptr dataPtr, Size stride); 562 563 /** 564 * Retrieves an Element's metadata from native code. 565 * 566 * @param element Element to be read 567 * @return elemData Element data 568 */ 569 @callflow(next={"*"}) 570 elementGetNativeMetadata(Element element) 571 generates (vec<uint32_t> elemData); 572 573 /** 574 * TODO: define Sub-Element handles better. 575 * 576 * Retrieves an Element's sub Elements, specifically their identifiers, 577 * names, and sizes. 578 * 579 * @param element Element to be read 580 * @param numSubElem Number of sub-Elements 581 * @return ids Sub-Element handles 582 * @return names Sub-Element Names 583 * @return arraySizes Sizes of sub-Element arrays 584 */ 585 @callflow(next={"*"}) 586 elementGetSubElements(Element element, Size numSubElem) 587 generates (vec<Element> ids, vec<string> names, 588 vec<Size> arraySizes); 589 590 /** 591 * TODO: can normalization flag be removed? 592 * 593 * Creates an Element. 594 * 595 * @param dt Data type 596 * @param dk Data kind 597 * @param norm Flag for normalization 598 * @param size Vector length, with scalar = 1 599 * @return element Created Element 600 */ 601 @callflow(next={"*"}) 602 elementCreate(DataType dt, DataKind dk, bool norm, uint32_t size) 603 generates (Element element); 604 605 /** 606 * Creates a complex Element. 607 * 608 * @param einsPtr Container of input Elements 609 * @param namesPtr Container of input names 610 * @param arraySizesPtr Container of array sizes 611 * @return element Created Element 612 */ 613 @callflow(next={"*"}) 614 elementComplexCreate(vec<Element> einsPtr, vec<string> names, 615 vec<Size> arraySizesPtr) 616 generates (Element element); 617 618 /** 619 * Retrives a Type's metadata from native code. 620 * 621 * @param type Type describing data layout 622 * @return metadata Type's native metadata 623 */ 624 @callflow(next={"*"}) 625 typeGetNativeMetadata(Type type) generates (vec<OpaqueHandle> metadata); 626 627 /** 628 * Creates a new Type. 629 * 630 * If Type is 1D, Y and Z must be 0. If Type is 2D, Z must be 0. 631 * 632 * @param element Element of the Type 633 * @param dimX X dimension 634 * @param dimY Y dimension 635 * @param dimZ Z dimension 636 * @param mipmaps Flag indicating whether Type has mipmaps 637 * @param faces Flag indicating whether Type has faces 638 * @param yuv Enumeration specifying which type of YUV format, if any, Type 639 * uses 640 * @return type Created Type 641 */ 642 @callflow(next={"*"}) 643 typeCreate(Element element, uint32_t dimX, uint32_t dimY, uint32_t dimZ, 644 bool mipmaps, bool faces, YuvFormat yuv) 645 generates (Type type); 646 647 /** 648 * Destroys provided RenderScript context, including all objects created in 649 * this context. 650 */ 651 @exit 652 contextDestroy(); 653 654 /** 655 * TODO: provide overview of messaging model and figure out if this should 656 * be part of HAL or not. 657 * TODO: what is the "client" for purposes of this interface? 658 * TODO: consider using send/receive to be more similar to other calls 659 * TODO: define the purpose of size more 660 * 661 * Fills the provided buffer with message data. "size" should be at least 662 * as large as the message size. Returns the MessageType and size of the 663 * message are returned. 664 * 665 * @param data A pointer to a buffer to be filled with a message 666 * @param size Size in bytes of the buffer pointed to by "data" 667 * @return messageType Type of message sent to the client 668 * @return receiveLen Length of the message in bytes 669 */ 670 @callflow(next={"*"}) 671 contextGetMessage(Ptr data, Size size) 672 generates (MessageToClientType messageType, Size receiveLen); 673 674 /** 675 * TODO: define subID better. 676 * 677 * Gets the metadata of a message to ensure entire message can be properly 678 * received. Can be used to determine size of data to allocate when calling 679 * contextGetMessage. 680 * 681 * @return messageType Type of message sent to the client 682 * @return receiveLen Length of message 683 * @return subID Message sub identifier 684 */ 685 @callflow(next={"*"}) 686 contextPeekMessage() 687 generates (MessageToClientType messageType, Size receiveLen, 688 uint32_t subID); 689 690 /** 691 * TODO: Define "previous commands" better 692 * TODO: Is the message identifier the same as subID? 693 * 694 * Places a message into the message queue to be sent back to the message 695 * handler once all previous commands have been executed. The message data 696 * is copied into the queue and can be discarded by the client after this 697 * call. 698 * 699 * @param id Message identifier 700 * @param data Message data 701 */ 702 @callflow(next={"*"}) 703 contextSendMessage(uint32_t id, vec<uint8_t> data); 704 705 /** 706 * TODO: Can this be done automatically as part of context creation? What 707 * happens if we perform message operations before doing this? 708 * 709 * Initializes the messaging thread, so that the front-end API can receive 710 * messages from the driver. This call also waits for the messaging FIFO to 711 * start up. 712 */ 713 @callflow(next={"*"}) 714 contextInitToClient(); 715 716 /** 717 * TODO: Why doesn't this happen automatically as part of context 718 * destruction? What happens if the FIFO is not empty? 719 * 720 * Deinitializes a the messaging thread. Shuts down the FIFO. 721 */ 722 @callflow(next={"*"}) 723 contextDeinitToClient(); 724 725 /** 726 * TODO: do we need to mark asynchronous operations in this interface 727 * definition? 728 * 729 * Waits for any pending asynchronous operations (such as copies to a RS 730 * allocation or RS script executions) to complete. 731 */ 732 @callflow(next={"*"}) 733 contextFinish(); 734 735 /** 736 * Prints the currently available debugging information about the state of 737 * the RS context to the logcat. 738 */ 739 @callflow(next={"*"}) 740 contextLog(); 741 742 /** 743 * TODO: full path? relative path? Investigate further. 744 * 745 * Sets the cache directory of the context. 746 * 747 * @param cacheDir Name of the application's cache directory 748 */ 749 @callflow(next={"*"}) 750 contextSetCacheDir(string cacheDir); 751 752 /** 753 * TODO: does this apply to the GPU as well? 754 * 755 * Changes the priority of the cpu worker threads for this context. 756 * 757 * @param priority Priority of the thread 758 */ 759 @callflow(next={"*"}) 760 contextSetPriority(ThreadPriorities priority); 761 762 /** 763 * TODO: does this need to be part of the HAL? What if the object already 764 * has a name? 765 * 766 * Assigns a name to a base object. 767 * 768 * @param obj Object to be named 769 * @param name Assigned name 770 */ 771 @callflow(next={"*"}) 772 assignName(ObjectBase obj, string name); 773 774 /** 775 * TODO: what if the object has no name? 776 * 777 * Returns the name of an object. 778 * 779 * @param obj Object to be read 780 * @return name Name of the object 781 */ 782 @callflow(next={"*"}) 783 getName(ObjectBase obj) generates (string name); 784 785 /** 786 * TODO: starting here we have a set of interfaces for use with 787 * ScriptGroups. At the very least we should indicate for each one that's 788 * what it's for. Should we include ScriptGroup in the interface names? 789 * TODO: sweep whole file and remove prefix "v" from all parameter names 790 * TODO: there are some places where we use Size for size, and others where 791 * we use int32_t. Is there a reason it's int32_t? In some cases, it 792 * requires a negative value. 793 * 794 * Creates a Closure which represents a function call to a ForEach Kernel 795 * combined with arguments and values for global variables. 796 * 797 * @param kernelID Kernel identifier 798 * @param returnValue Allocation used in output of Closure 799 * @param fieldIDS Collection of Script's Field identifiers 800 * @param values Collection of Script's data values 801 * @param sizes Collection of Script's data sizes 802 * @param depClosures Collection of Closures 803 * @param depFieldIDS Collection of Script's dependent Field identifiers 804 * @return closure Created Closure 805 */ 806 @callflow(next={"*"}) 807 closureCreate(ScriptKernelID kernelID, Allocation returnValue, 808 vec<ScriptFieldID> fieldIDS, vec<int64_t> values, 809 vec<int32_t> sizes, vec<Closure> depClosures, 810 vec<ScriptFieldID> depFieldIDS) 811 generates (Closure closure); 812 813 /** 814 * Creates a Closure which represents a function call to a invocable 815 * function, combined with arguments and values for global variables. 816 * 817 * @param invokeID Invokable function identifier 818 * @param params Collection of Invoke script parameters 819 * @param fieldIDS Collection of Script Field identifiers 820 * @param values Collection of values 821 * @param sizes Collection of sizes 822 * @return closure Created Closure 823 */ 824 @callflow(next={"*"}) 825 invokeClosureCreate(ScriptInvokeID invokeID, vec<uint8_t> params, 826 vec<ScriptFieldID> fieldIDS, vec<int64_t> values, 827 vec<int32_t> sizes) 828 generates (Closure closure); 829 830 /** 831 * Sets the argument of a Closure at specified index and size to provided 832 * value. 833 * 834 * @param closure Closure to be modified 835 * @param index Index 836 * @param value Value 837 * @param size Size 838 */ 839 @callflow(next={"*"}) 840 closureSetArg(Closure closure, uint32_t index, Ptr value, int32_t size); 841 842 /** 843 * Sets a global variable in a Closure. 844 * 845 * @param closure Closure 846 * @param fieldID Global's Field identifier 847 * @param value Value 848 * @param size Size 849 */ 850 @callflow(next={"*"}) 851 closureSetGlobal(Closure closure, ScriptFieldID fieldID, int64_t value, 852 int32_t size); 853 854 /** 855 * TODO: should slot be unsigned? (applies to other two ID interfaces, too) 856 * 857 * Creates a Script Kernel ID. 858 * 859 * @param script Script 860 * @param slot Slot 861 * @param sig Bitfield describing Kernel signature and operation 862 * @return scriptKernelID Script's Kernel identifier 863 */ 864 @callflow(next={"*"}) 865 scriptKernelIDCreate(Script script, int32_t slot, 866 bitfield<MetadataSignatureBitval> sig) 867 generates (ScriptKernelID scriptKernelID); 868 869 /** 870 * Creates a Script Invoke ID. 871 * 872 * @param script Script 873 * @param slot Slot 874 * @return scriptInvokeID Invoke Script's identifier 875 */ 876 @callflow(next={"*"}) 877 scriptInvokeIDCreate(Script script, int32_t slot) 878 generates (ScriptInvokeID scriptInvokeID); 879 880 /** 881 * TODO: describe the return value better. What is it? 882 * 883 * Creates a Script Field ID. 884 * 885 * @param script Script 886 * @param slot Slot 887 * @return scriptFieldID Script's Field identifier 888 */ 889 @callflow(next={"*"}) 890 scriptFieldIDCreate(Script script, int32_t slot) 891 generates (ScriptFieldID scriptFieldID); 892 893 /** 894 * TODO: add more description 895 * 896 * Creates a Script Group. 897 * 898 * @param kernels Collection of Scripts' Kernel identifiers 899 * @param srcK Source Kernel identifiers 900 * @param dstK Destination Kernel identifiers 901 * @param dstF Destination Script Field identifiers 902 * @param types Collection of Types describing data layout 903 * @return scriptGroup Created Script Group 904 */ 905 @callflow(next={"*"}) 906 scriptGroupCreate(vec<ScriptKernelID> kernels, vec<ScriptKernelID> srcK, 907 vec<ScriptKernelID> dstK, vec<ScriptFieldID> dstF, 908 vec<Type> types) 909 generates (ScriptGroup scriptGroup); 910 911 /** 912 * Creates a Script Group. 913 * 914 * @param name Name 915 * @param cacheDir Cache directory 916 * @param closures Collection of Closures 917 * @return scriptGroup2 Created Script Group 918 */ 919 @callflow(next={"*"}) 920 scriptGroup2Create(string name, string cacheDir, vec<Closure> closures) 921 generates (ScriptGroup2 scriptGroup2); 922 923 /** 924 * TODO: if SetInput/Output corresponds to the Java API setInput() and 925 * setOutput(), which are documented as deprecated in API 23, do we need to 926 * support them? Or can we fallback to the CPU when they're used? Or can't 927 * we tell whether they're used early enough to do fallback? 928 * 929 * Sets an output of the ScriptGroup. This specifies an Allocation to be 930 * used for the kernels that require an output Allocation visible after the 931 * ScriptGroup is executed. 932 * 933 * @param sg Script Group 934 * @param kid Script's Kernel identifier to be changed 935 * @param alloc Allocation to be filled by output 936 */ 937 @callflow(next={"*"}) 938 scriptGroupSetOutput(ScriptGroup sg, ScriptKernelID kid, Allocation alloc); 939 940 /** 941 * Sets an input of the Script Group. This specifies an Allocation to be 942 * used for kernels that require an input Allocation provided from outside 943 * of the Script Group. 944 * 945 * @param sg Script Group 946 * @param kid Script's Kernel identifier to be changed 947 * @param alloc Allocation to be read as input 948 */ 949 @callflow(next={"*"}) 950 scriptGroupSetInput(ScriptGroup sg, ScriptKernelID kid, Allocation alloc); 951 952 /** 953 * Executes a Script Group. 954 * 955 * @param sg Script Group to be executed. 956 */ 957 @callflow(next={"*"}) 958 scriptGroupExecute( ScriptGroup sg); 959 960 /** 961 * Frees any native resources associated with this object. The primary use 962 * is to force immediate cleanup of resources when it is believed the GC 963 * may not respond quickly enough. 964 * 965 * @param handle Opaque handle to the server-side object to be destroyed 966 */ 967 @callflow(next={"*"}) 968 objDestroy(ObjectBase obj); 969 970 /** 971 * Creates a Sampler. 972 * 973 * @param magFilter Magnification value for the filter 974 * @param minFilter Minification value for the filter 975 * @param wrapS S wrapping mode for the sampler 976 * @param wrapT T wrapping mode for the sampler 977 * @param wrapR R wrapping mode for the sampler 978 * @param aniso Anisotropy setting for the sampler 979 * @return sampler Created Sampler 980 */ 981 @callflow(next={"*"}) 982 samplerCreate(SamplerValue magFilter, SamplerValue minFilter, 983 SamplerValue wrapS, SamplerValue wrapT, SamplerValue wrapR, 984 float aniso) 985 generates (Sampler sampler); 986 987 /** 988 * Binds an Allocation to a global pointer in the Script. 989 * 990 * @param script Script to be bound to 991 * @param allocation Allocation to be bound 992 * @param slot Slot of a global variable 993 */ 994 @callflow(next={"*"}) 995 scriptBindAllocation(Script script, Allocation allocation, uint32_t slot); 996 997 /** 998 * TODO: is this necessary? 999 * 1000 * Sets the timezone of a Script. 1001 * 1002 * @param script Script to be altered 1003 * @param timeZone Time Zone value as text 1004 */ 1005 @callflow(next={"*"}) 1006 scriptSetTimeZone(Script script, string timeZone); 1007 1008 /** 1009 * TODO: can scriptInvoke be combined with scriptInvokeV? 1010 * 1011 * Launches an invokable function. 1012 * 1013 * @param vs Script to be invoked 1014 * @param slot Slot of invokable function 1015 */ 1016 @callflow(next={"*"}) 1017 scriptInvoke(Script vs, uint32_t slot); 1018 1019 /** 1020 * Invokes a Script with values. 1021 * 1022 * @param vs Script to be invoked 1023 * @param slot Slot 1024 * @param data Data buffer of packed arguments 1025 */ 1026 @callflow(next={"*"}) 1027 scriptInvokeV(Script vs, uint32_t slot, vec<uint8_t> data); 1028 1029 /** 1030 * TODO: add documentation for params 1031 * TODO: Should we rename "ScriptCall" to "LaunchOptions"? 1032 * 1033 * Launches a ForEach kernel. 1034 * 1035 * @param vs Script 1036 * @param slot Slot of ForEach Kernel 1037 * @param vains Collection of input Allocations or null 1038 * @param vaout Output Allocation or null 1039 * @param params Collection of parameters 1040 * @param sc Pointer to a ScriptCall, nullptr if unused 1041 */ 1042 @callflow(next={"*"}) 1043 scriptForEach(Script vs, uint32_t slot, vec<Allocation> vains, 1044 Allocation vaout, vec<uint8_t> params, Ptr sc); 1045 1046 /** 1047 * Launches a Reduction kernel. 1048 * 1049 * @param vs Script 1050 * @param slot Slot of Reduction Kernel 1051 * @param vains Collection of input Allocations 1052 * @param vaout Output Allocation 1053 * @param sc Pointer to a ScriptCall, nullptr if unused 1054 */ 1055 @callflow(next={"*"}) 1056 scriptReduce(Script vs, uint32_t slot, vec<Allocation> vains, 1057 Allocation vaout, Ptr sc); 1058 1059 /** 1060 * Sets a Script's integer variable to a value. 1061 * 1062 * @param vs RenderScript Script 1063 * @param slot Slot number of variable to be updated 1064 * @param value Value to be pushed to variable 1065 */ 1066 @callflow(next={"*"}) 1067 scriptSetVarI(Script vs, uint32_t slot, int32_t value); 1068 1069 /** 1070 * Sets a Script's Object variable to a value 1071 * 1072 * @param vs RenderScript Script 1073 * @param slot Slot number of variable to be updated 1074 * @param obj ObjectBase 1075 */ 1076 @callflow(next={"*"}) 1077 scriptSetVarObj( Script vs, uint32_t slot, ObjectBase obj); 1078 1079 /** 1080 * Sets a Script's long variable to a value. 1081 * 1082 * @param vs RenderScript Script 1083 * @param slot Slot number of variable to be updated 1084 * @param value Value to be pushed to variable 1085 */ 1086 @callflow(next={"*"}) 1087 scriptSetVarJ(Script vs, uint32_t slot, int64_t value); 1088 1089 /** 1090 * Sets a Script's float variable to a value. 1091 * 1092 * @param vs RenderScript Script 1093 * @param slot Slot number of variable to be updated 1094 * @param value Value to be pushed to variable 1095 */ 1096 @callflow(next={"*"}) 1097 scriptSetVarF(Script vs, uint32_t slot, float value); 1098 1099 /** 1100 * Sets a Script's double variable to a value. 1101 * 1102 * @param vs RenderScript Script 1103 * @param slot Slot number of variable to be updated 1104 * @param value Value to be pushed to variable 1105 */ 1106 @callflow(next={"*"}) 1107 scriptSetVarD(Script vs, uint32_t slot, double value); 1108 1109 /** 1110 * Sets a Script's struct variable to a value. 1111 * 1112 * @param vs RenderScript Script 1113 * @param slot Slot number of variable to be updated 1114 * @param data Data to be pushed to variable 1115 */ 1116 @callflow(next={"*"}) 1117 scriptSetVarV(Script vs, uint32_t slot, vec<uint8_t> data); 1118 1119 /** 1120 * TODO: Why do we have typed setters but only untyped getter? 1121 * 1122 * Retrieves the value from a global variable in a script. 1123 * 1124 * @param vs RenderScript Script 1125 * @param slot Slot number of variable to be read 1126 * @param len Size of data to be filled 1127 * @return data Data to be updated 1128 */ 1129 @callflow(next={"*"}) 1130 scriptGetVarV(Script vs, uint32_t slot, Size len) 1131 generates (vec<uint8_t> data); 1132 1133 /** 1134 * TODO: Is this a value to be replicated for each member of the array? Or 1135 * is there a representation for each separate member? 1136 * 1137 * Sets the value of a global array of structs, given the Element and 1138 * dimension. 1139 * 1140 * @param vs RenderScript Script 1141 * @param slot Slot number of variable to be updated 1142 * @param data Data 1143 * @param ve Element 1144 * @param dims Collection of dimensions 1145 */ 1146 @callflow(next={"*"}) 1147 scriptSetVarVE(Script vs, uint32_t slot, vec<uint8_t> data, Element ve, 1148 vec<uint32_t> dims); 1149 1150 /** 1151 * TODO: is cacheDir redundant with createCache() function? Can we remove 1152 * it? 1153 * TODO: define resName more clearly 1154 * 1155 * Creates a RenderScript C99 kernel script. 1156 * 1157 * @param resName Resource name of the bitcode 1158 * @param cacheDir Cache directory name 1159 * @param text The kernel's bitcode as a uint8_t vector 1160 * @return script Created Script 1161 */ 1162 @callflow(next={"*"}) 1163 scriptCCreate(string resName, string cacheDir, vec<uint8_t> text) 1164 generates (Script script); 1165 1166 /** 1167 * Creates a RenderScript Intrinsic script. 1168 * 1169 * @param id Intrinsic Script identifier 1170 * @param elem Element 1171 * @return script Created Script 1172 */ 1173 @callflow(next={"*"}) 1174 scriptIntrinsicCreate(ScriptIntrinsicID id, Element elem) 1175 generates (Script script); 1176 1177}; 1178