| /* | 
 |  * Copyright (C) 2017 The Android Open Source Project | 
 |  * | 
 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 |  * you may not use this file except in compliance with the License. | 
 |  * You may obtain a copy of the License at | 
 |  * | 
 |  *      http://www.apache.org/licenses/LICENSE-2.0 | 
 |  * | 
 |  * Unless required by applicable law or agreed to in writing, software | 
 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 |  * See the License for the specific language governing permissions and | 
 |  * limitations under the License. | 
 |  */ | 
 |  | 
 | package android.hardware.renderscript@1.0; | 
 |  | 
 | import android.hardware.renderscript@1.0::types; | 
 |  | 
 | // TODO: is there any way to keep this documentation in sync with the | 
 | // corresponding Java doc? | 
 | // | 
 | // TODO: Some of the documentation was taken from Java docs, whereas others were | 
 | // undocumented. Because of this, there's somewhat two different styles of | 
 | // comments. Look into having a consistent convention. | 
 | // | 
 | // TODO: There was some confusion as to why some paramters use vec<> and others | 
 | // use Ptr/Size. The convention is that vec<> is used whenever the paramter is | 
 | // only an input parameter. HIDL is not supposed to include any output | 
 | // parameters, so a more explicit Ptr/Size is used. | 
 |  | 
 | interface IContext { | 
 |  | 
 |     /** | 
 |      * TODO: Do we need to define "selectors"? It may be a property of the | 
 |      * "adapted allocation" that's returned. | 
 |      * | 
 |      * Creates an arbitrary window into the base allocation. The type describes | 
 |      * the shape of the window. Any dimensions present in the type must be | 
 |      * equal to or smaller than the dimensions in the source allocation. A | 
 |      * dimension present in the allocation that is not present in the type must | 
 |      * be constrained away with the selectors. If a dimension is present in | 
 |      * both the type and allocation, one of two things must happen. If the type | 
 |      * is smaller than the allocation, a window must be created, the selected | 
 |      * value in the adapter for that dimension must act as the base address, | 
 |      * and the type must describe the size of the view starting at that point. | 
 |      * If the type and allocation dimension are of the same size, then setting | 
 |      * the selector for the dimension must be an error. | 
 |      * | 
 |      * @param type Type describing data layout | 
 |      * @param baseAlloc Allocation | 
 |      * @return subAlloc AllocationAdapter | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocationAdapterCreate(Type type, Allocation baseAlloc) | 
 |                  generates (AllocationAdapter subAlloc); | 
 |  | 
 |     /** | 
 |      * TODO: Need to relate "offset" back to the terminology in | 
 |      * allocationAdapterCreate() -- the latter uses the terms "selector" and | 
 |      * "selected value". Can we use consistent terminology? Are "offset" and | 
 |      * "selector" actually two different things? | 
 |      * | 
 |      * TODO: Explain the flattened layout in the offsets vec | 
 |      * | 
 |      * Sets the offsets for an Allocation Adapter. | 
 |      * | 
 |      * @param alloc AllocationAdapter | 
 |      * @param offsets Collection of offsets | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocationAdapterOffset(AllocationAdapter alloc, vec<uint32_t> offsets); | 
 |  | 
 |     /** | 
 |      * TODO: add more explanation here. | 
 |      * | 
 |      * Returns the Type of the Allocation. | 
 |      * | 
 |      * @param allocation Allocation | 
 |      * @return type Allocation's Type | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocationGetType(Allocation allocation) generates (Type type); | 
 |  | 
 |     /** | 
 |      * TODO: more clarification needed describing if the pointer can be aliased | 
 |      * or if the data can outlive the allocation. | 
 |      * | 
 |      * Creates an Allocation for use by scripts with a given Type and a backing | 
 |      * pointer. For use with ALLOCATION_USAGE_SHARED. | 
 |      * | 
 |      * @param type Type describing data layout | 
 |      * @param mips AllocationMipmapControl specifies desired mipmap behavior for | 
 |      *             the allocation | 
 |      * @param usage Bit field specifying how the Allocation is utilized | 
 |      * @param ptr Pointer to client-side data | 
 |      * @return allocation Created Allocation | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocationCreateTyped(Type type, AllocationMipmapControl mips, | 
 |                           bitfield<AllocationUsageType> usage, Ptr ptr) | 
 |                generates (Allocation allocation); | 
 |  | 
 |     /** | 
 |      * Creates an Allocation from a Bitmap. | 
 |      * | 
 |      * @param type Type describing data layout | 
 |      * @param mips AllocationMipmapControl specifies desired mipmap behavior for | 
 |      *             the allocation | 
 |      * @param bitmap Bitmap source for the allocation data | 
 |      * @param usage Bit field specifying how the Allocation is utilized | 
 |      * @return allocation Created Allocation containing bitmap data | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocationCreateFromBitmap(Type type, AllocationMipmapControl mips, | 
 |                                vec<uint8_t> bitmap, | 
 |                                bitfield<AllocationUsageType> usage) | 
 |                     generates (Allocation allocation); | 
 |  | 
 |     /** | 
 |      * Creates a Cubemapped Allocation from a Bitmap. | 
 |      * | 
 |      * @param type Type describing data layout | 
 |      * @param mips AllocationMipmapControl specifies desired mipmap behavior | 
 |      *             for the allocation | 
 |      * @param bitmap Bitmap with cubemap faces layed out in the following | 
 |      *               format: right, left, top, bottom, front, back | 
 |      * @param usage Bit field specifying how the Allocation is used | 
 |      * @return allocation Created Allocation containing cubemap data | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocationCubeCreateFromBitmap(Type type, AllocationMipmapControl mips, | 
 |                                    vec<uint8_t> bitmap, | 
 |                                    bitfield<AllocationUsageType> usage) | 
 |                         generates (Allocation allocation); | 
 |  | 
 |     /** | 
 |      * Returns the handle to a raw buffer that is being managed by the screen | 
 |      * compositor. This operation is only valid for Allocations with | 
 |      * USAGE_IO_INPUT. | 
 |      * | 
 |      * @param allocation Allocation | 
 |      * @return nativeWindow NativeWindow object associated with allocation | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocationGetNativeWindow(Allocation allocation) | 
 |                    generates (NativeWindow nativeWindow); | 
 |  | 
 |     /** | 
 |      * TODO: more clarification needed | 
 |      * | 
 |      * Sets the NativeWindow of an Allocation. This operation is only valid | 
 |      * for Allocations with USAGE_IO_INPUT. | 
 |      * | 
 |      * @param allocation Allocation to be modified | 
 |      * @pram nativeWindow NativeWindow to associate with allocation | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocationSetNativeWindow(Allocation allocation, NativeWindow nativewindow); | 
 |  | 
 |     /** | 
 |      * Initialize BufferQueue with specified max number of buffers. | 
 |      * | 
 |      * @param alloc Allocation | 
 |      * @param numBuffer Maximum number of buffers | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocationSetupBufferQueue(Allocation alloc, uint32_t numBuffer); | 
 |  | 
 |     /** | 
 |      * TODO: clearly define baseAlloc vs subAlloc | 
 |      * | 
 |      * Shares the BufferQueue with another Allocation. Both must be | 
 |      * USAGE_IO_INPUT Allocations. | 
 |      * | 
 |      * @param baseAlloc Base Allocation | 
 |      * @param subAlloc Allocation to use the same buffer queue as the Base | 
 |      *                 Allocation | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocationShareBufferQueue(Allocation baseAlloc, Allocation subAlloc); | 
 |  | 
 |     /** | 
 |      * Copies from the Allocation into a Bitmap. The bitmap must match the | 
 |      * dimensions of the Allocation. | 
 |      * | 
 |      * HIDL is always running in Passthrough mode for RenderScript, so the | 
 |      * buffer is modified directly by the driver. | 
 |      * | 
 |      * @param allocation Allocation | 
 |      * @param data Buffer to be copied into | 
 |      * @param sizeBytes Size of the buffer pointed to by "data" | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocationCopyToBitmap(Allocation allocation, Ptr data, Size sizeBytes); | 
 |  | 
 |     /** | 
 |      * TODO: should we consolidate all [123]DWrite functions or [123]DRead | 
 |      * functions into the same API call? Our current plan is to be very similar | 
 |      * to the dispatch table API. How much should we deviate from the original | 
 |      * API? | 
 |      * TODO: better description on Vec3/Vec4 and padding. | 
 |      * | 
 |      * Copies data into a 1D region of this Allocation. | 
 |      * | 
 |      * When this HAL entry is executed, all Vec3 elements have been explicitly | 
 |      * padded as Vec4 elements. | 
 |      * | 
 |      * The size of the region is: count * Element's size. | 
 |      * | 
 |      * @param allocation Allocation to be modified | 
 |      * @param offset The offset of the first element to be copied | 
 |      * @param lod Selected mipmap level of detail | 
 |      * @param count Number of elements to be copied | 
 |      * @param data Source data to be copied to Allocation | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocation1DWrite(Allocation allocation, uint32_t offset, uint32_t lod, | 
 |                       uint32_t count, vec<uint8_t> data); | 
 |  | 
 |     /** | 
 |      * Copies a value into a single sub-Element of this Allocation. | 
 |      * | 
 |      * @param allocation Allocation to be updated | 
 |      * @param x X position of the first element in the Allocation to be updated | 
 |      * @param y Y position of the first element in the Allocation to be | 
 |      *          updated; for a 1D Allocation, this value must be 0 | 
 |      * @param z Z position of the first element in the Allocation to be | 
 |      *          updated; for a 1D or 2D Allocation, this value must be 0 | 
 |      * @param lod Selected mipmap level of detail | 
 |      * @param data Data to be copied from | 
 |      * @param compIdx Component number to identify which sub-Element is updated | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocationElementWrite(Allocation allocation, uint32_t x, uint32_t y, | 
 |                            uint32_t z, uint32_t lod, vec<uint8_t> data, | 
 |                            Size compIdx); | 
 |  | 
 |     /** | 
 |      * Copies from an array into a rectangular region in this Allocation. | 
 |      * | 
 |      * When this HAL entry is executed, all Vec3 elements have been explicitly | 
 |      * padded as Vec4 elements. | 
 |      * | 
 |      * The size of the region is: w * h * Element's size. | 
 |      * | 
 |      * @param allocation Allocation to be modified | 
 |      * @param xoff X offset of the region to update in this Allocation | 
 |      * @param yoff Y offset of the region to update in this Allocation | 
 |      * @param lod Selected mipmap level of detail | 
 |      * @param face AllocationCubemapFace | 
 |      * @param w Width of the region to update | 
 |      * @param h Height of the region to update | 
 |      * @param data Data to be placed into the Allocation | 
 |      * @param stride For 1D Allocation, the stride must be the number of bytes | 
 |      *               of this Allocation. For 2D and 3D Allocations, the stride | 
 |      *               must be the stride in X dimension measuring in bytes. | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocation2DWrite(Allocation allocation, uint32_t xoff, uint32_t yoff, | 
 |                       uint32_t lod, AllocationCubemapFace face, uint32_t w, | 
 |                       uint32_t h, vec<uint8_t> data, Size stride); | 
 |  | 
 |     /** | 
 |      * Copies from an array into a 3D region in this Allocation. | 
 |      * | 
 |      * When this HAL entry is executed, all Vec3 elements have been explicitly | 
 |      * padded as Vec4 elements. | 
 |      * | 
 |      * The size of the region is: w * h * d * Element's size. | 
 |      * | 
 |      * @param allocation Allocation to be modified | 
 |      * @param xoff X offset of the region to update in this Allocation | 
 |      * @param yoff Y offset of the region to update in this Allocation | 
 |      * @param zoff Z offset of the region to update in this Allocation | 
 |      * @param lod Selected mipmap level of detail | 
 |      * @param w Width of the region to update | 
 |      * @param h Height of the region to update | 
 |      * @param d Depth of the region to update | 
 |      * @param data Data to be placed in the Allocation | 
 |      * @param stride For 1D Allocation, the stride must be the number of bytes | 
 |      *               of this Allocation. For 2D and 3D Allocations, the stride | 
 |      *               must be the stride in X dimension measuring in bytes. | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocation3DWrite(Allocation allocation, uint32_t xoff, uint32_t yoff, | 
 |                       uint32_t zoff, uint32_t lod, uint32_t w, uint32_t h, | 
 |                       uint32_t d, vec<uint8_t> data, Size stride); | 
 |  | 
 |     /** | 
 |      * Generates a mipmap chain. This is only valid if the Type of the | 
 |      * Allocation includes mipmaps. | 
 |      * | 
 |      * This function generates a complete set of mipmaps from the top level | 
 |      * LOD. | 
 |      * | 
 |      * If the Allocation is also using other memory spaces, a call to | 
 |      * allocationSyncAll(context, allocation, usage) is required. | 
 |      * | 
 |      * @param allocation Allocation which has its top LOD read and lower LOD | 
 |      *                   written to | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocationGenerateMipmaps(Allocation allocation); | 
 |  | 
 |     /** | 
 |      * Copies all of an Allocation's data into an array. | 
 |      * | 
 |      * All Vec3 elements of an Allocation are padded to be Vec4, so the data | 
 |      * returned by this function automatically includes padding. | 
 |      * | 
 |      * HIDL is always running in Passthrough mode for RenderScript, so the | 
 |      * buffer is modified directly by the driver. | 
 |      * | 
 |      * @param allocation Allocation to be read | 
 |      * @param data Buffer to be copied into | 
 |      * @param sizeBytes Size of the buffer pointed to by "data" | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocationRead(Allocation allocation, Ptr data, Size sizeBytes); | 
 |  | 
 |     /** | 
 |      * Copies a 1D region of this Allocation into an array. | 
 |      * | 
 |      * All Vec3 elements of an Allocation are padded to be Vec4, so the data | 
 |      * returned by this function automatically includes padding. | 
 |      * | 
 |      * The size of the region is: count * Element's size. | 
 |      * | 
 |      * HIDL is always running in Passthrough mode for RenderScript, so the | 
 |      * buffer is modified directly by the driver. | 
 |      * | 
 |      * @param allocation Allocation to be read | 
 |      * @param xoff X offset of the first element to be copied | 
 |      * @param lod Mipmap level of detail | 
 |      * @param count The number of elements to be copied | 
 |      * @param data Buffer to be copied into | 
 |      * @param sizeBytes Size of the buffer pointed to by "data" | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocation1DRead(Allocation allocation, uint32_t xoff, uint32_t lod, | 
 |                      uint32_t count, Ptr data, Size sizeBytes); | 
 |  | 
 |     /** | 
 |      * Returns the value of a single sub-Element of this Allocation. | 
 |      * | 
 |      * HIDL is always running in Passthrough mode for RenderScript, so the | 
 |      * buffer is modified directly by the driver. | 
 |      * | 
 |      * @param allocation Allocation to be read | 
 |      * @param x X position of the first element in the Allocation to be read | 
 |      * @param y Y position of the first element in the Allocation to be read | 
 |      * @param z Z position of the first element in the Allocation to be read | 
 |      * @param lod Mipmap level of detail | 
 |      * @param data Buffer to be copied into | 
 |      * @param sizeBytes Size of the buffer pointed to by "data" | 
 |      * @param compIdx Component number to identify which sub-Element is updated | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocationElementRead(Allocation allocation, uint32_t x, uint32_t y, | 
 |                           uint32_t z, uint32_t lod, Ptr data, Size sizeBytes, | 
 |                           Size compIdx); | 
 |  | 
 |     /** | 
 |      * Copies from a rectangular region in this Allocation to an array. | 
 |      * | 
 |      * All Vec3 elements of an Allocation are padded to be Vec4, so the data | 
 |      * returned by this function automatically includes padding. | 
 |      * | 
 |      * The size of the region is: w * h * Element's size. | 
 |      * | 
 |      * HIDL is always running in Passthrough mode for RenderScript, so the | 
 |      * buffer is modified directly by the driver. | 
 |      * | 
 |      * @param allocation Allocation to be read | 
 |      * @param xoff X offset of the region to copy in this array | 
 |      * @param yoff Y offset of the region to copy in this array | 
 |      * @param lod Mipmap level of detail | 
 |      * @param face AllocationCubemapFace | 
 |      * @param w Width of the region to copy | 
 |      * @param h Height of the region to copy | 
 |      * @param data Buffer to be copied into | 
 |      * @param sizeBytes Size of the buffer pointed to by "data" | 
 |      * @param stride For 1D Allocation, the stride must be the number of bytes | 
 |      *               of this Allocation. For 2D and 3D Allocations, the stride | 
 |      *               must be the stride in X dimension measuring in bytes. | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocation2DRead(Allocation allocation, uint32_t xoff, uint32_t yoff, | 
 |                      uint32_t lod, AllocationCubemapFace face, uint32_t w, | 
 |                      uint32_t h, Ptr data, Size sizeBytes, Size stride); | 
 |  | 
 |     /** | 
 |      * Copies from a rectangular cuboid region in this Allocation to an array. | 
 |      * | 
 |      * All Vec3 elements of an Allocation are padded to be Vec4, so the data | 
 |      * returned by this function automatically includes padding. | 
 |      * | 
 |      * The size of the region is: w * h * d * Element's size. | 
 |      * | 
 |      * HIDL is always running in Passthrough mode for RenderScript, so the | 
 |      * buffer is modified directly by the driver. | 
 |      * | 
 |      * @param allocation Allocation to be read | 
 |      * @param xoff X offset of the region to copy in this array | 
 |      * @param yoff Y offset of the region to copy in this array | 
 |      * @param zoff Z offset of the region to copy in this array | 
 |      * @param lod Mipmap level of detail | 
 |      * @param w Width of the region to copy | 
 |      * @param h Height of the region to copy | 
 |      * @param d Depth of the region to copy | 
 |      * @param data Buffer to be copied into | 
 |      * @param sizeBytes Size of the buffer pointed to by "data" | 
 |      * @param stride For 1D Allocation, the stride must be the number of bytes | 
 |      *               of this Allocation. For 2D and 3D Allocations, the stride | 
 |      *               must be the stride in X dimension measuring in bytes. | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocation3DRead(Allocation allocation, uint32_t xoff, uint32_t yoff, | 
 |                      uint32_t zoff, uint32_t lod, uint32_t w, uint32_t h, | 
 |                      uint32_t d, Ptr data, Size sizeBytes, Size stride); | 
 |  | 
 |     /** | 
 |      * Propagates changes from one usage of the Allocation to the other usages | 
 |      * of the Allocation. | 
 |      * | 
 |      * @param allocation First usage of the Allocation | 
 |      * @param usageType Allocation usage type | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocationSyncAll(Allocation allocation, AllocationUsageType usageType); | 
 |  | 
 |     /** | 
 |      * TODO: describe the functionality of resize1D better | 
 |      * TODO: original Java Doc description seems to contradict itself ("with | 
 |      * null contents and the region is otherwise undefined") | 
 |      * TODO: should "new elements" be "new cells"? | 
 |      * TODO: what does "objects are created" mean? | 
 |      * TODO: what does "new dimension" mean? IS the type of the resized | 
 |      * allocation different than the type before resizing? | 
 |      * | 
 |      * Resizes a 1D allocation. The contents of the allocation are preserved. | 
 |      * If new elements are allocated, objects are created with null contents | 
 |      * and the new region is otherwise undefined. | 
 |      * | 
 |      * If the new region is smaller, the references of any object outside the | 
 |      * new region must be released. | 
 |      * | 
 |      * A new type must be created with the new dimension. | 
 |      * | 
 |      * @param allocation Allocation to be resized | 
 |      * @param dimX New size along the x dimension of the Allocation | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocationResize1D(Allocation allocation, uint32_t dimX); | 
 |  | 
 |     /** | 
 |      * TODO: There are allocationCopy2DRange and 3DRange, but no 1DRange. Should | 
 |      * the interface be cleaned up more? | 
 |      * | 
 |      * Copies a rectangular region from an Allocation into a rectangular region | 
 |      * in this Allocation. | 
 |      * | 
 |      * @param dstAlloc Allocation to be updated | 
 |      * @param dstXoff X offset of the region to update | 
 |      * @param dstYoff Y offset of the region to update | 
 |      * @param dstMip Selected mipmap level of the Allocation to update | 
 |      * @param dstFace Destination AllocationCubemapFace | 
 |      * @param width Width of the region to update | 
 |      * @param height Height of the region to update | 
 |      * @param srcAlloc Source Allocation, to be read | 
 |      * @param srcXoff X offset of the region in the source Allocation | 
 |      * @param srcYoff Y offset of the region in the source Allocation | 
 |      * @param srcMip Selected mipmap level of the source Allocation | 
 |      * @param srcFace Source AllocationCubemapFace | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocationCopy2DRange(Allocation dstAlloc, uint32_t dstXoff, | 
 |                           uint32_t dstYoff, uint32_t dstMip, | 
 |                           AllocationCubemapFace dstFace, uint32_t width, | 
 |                           uint32_t height, Allocation srcAlloc, | 
 |                           uint32_t srcXoff, uint32_t srcYoff, uint32_t srcMip, | 
 |                           AllocationCubemapFace srcFace); | 
 |  | 
 |     /** | 
 |      * Copies a rectangular cuboid region into the allocation from another | 
 |      * Allocation. | 
 |      * | 
 |      * @param dstAlloc Allocation to be updated | 
 |      * @param dstXoff X offset of the region to update | 
 |      * @param dstYoff Y offset of the region to update | 
 |      * @param dstZoff Z offset of the region to update | 
 |      * @param dstMip Selected mipmap level of the Allocation to update | 
 |      * @param width Width of the region to update | 
 |      * @param height Height of the region to update | 
 |      * @param depth Depth of the region to update | 
 |      * @param srcAlloc Source Allocation, to be read | 
 |      * @param srcXoff Source X offset of the region in the source Allocation | 
 |      * @param srcYoff Source Y offset of the region in the source Allocation | 
 |      * @param srcZoff Source Z offset of the region in the souce Allocation | 
 |      * @param srcMip Selected mipmap level of the Allocation to read | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocationCopy3DRange(Allocation dstAlloc, uint32_t dstXoff, | 
 |                           uint32_t dstYoff, uint32_t dstZoff, uint32_t dstMip, | 
 |                           uint32_t width, uint32_t height, uint32_t depth, | 
 |                           Allocation srcAlloc, uint32_t srcXoff, | 
 |                           uint32_t srcYoff, uint32_t srcZoff, uint32_t srcMip); | 
 |  | 
 |     /** | 
 |      * TODO: define buffer and output stream | 
 |      * | 
 |      * Sends a buffer to the output stream. The contents of the Allocation may | 
 |      * be undefined after this operation. This operation is only valid if | 
 |      * USAGE_IO_OUTPUT is set on the Allocation. | 
 |      * | 
 |      * @param allocation Allocation to be sent | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocationIoSend(Allocation allocation); | 
 |  | 
 |     /** | 
 |      * Receives the latest input into the Allocation. This operation is only | 
 |      * valid if USAGE_IO_INPUT is set on the Allocation, otherwise an error | 
 |      * must be reported and no operations may be executed. | 
 |      * | 
 |      * @param allocation Allocation to be updated | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocationIoReceive(Allocation allocation); | 
 |  | 
 |     /** | 
 |      * TODO: describe default values for lod, face, and z better. | 
 |      * TODO: what cases can invalidate the pointer? Resize? It should be | 
 |      * clarified that this method should always return a valid pointer, but the | 
 |      * returned pointer might become invalid later. | 
 |      * | 
 |      * Retrieves the pointer to the actual data an Allocation contains as well | 
 |      * as the data's stride. | 
 |      * | 
 |      * If Allocation lacks the corresponding dimension for lod, face, or z, an | 
 |      * error message must be sent to the message queue and nullptr must be | 
 |      * returned for dataPtr and 0 for stride. All missing values must be 0 or | 
 |      * NONE in the corresponding enum. | 
 |      * | 
 |      * @param allocation Allocation | 
 |      * @param lod Mipmap level of detail | 
 |      * @param face AllocationCubemapFace | 
 |      * @param z Z position | 
 |      * @return pointer Pointer to the server-side data; if this points to an | 
 |      *                 invalid location in memory (because the buffer was | 
 |      *                 freed), this may result in undefined behavior | 
 |      * @return stride For 1D Allocation, the stride must be the number of bytes | 
 |      *                of this Allocation. For 2D and 3D Allocations, the stride | 
 |      *                must be the stride in X dimension measuring in bytes. | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     allocationGetPointer(Allocation allocation, uint32_t lod, | 
 |                          AllocationCubemapFace face, uint32_t z) | 
 |               generates (Ptr dataPtr, Size stride); | 
 |  | 
 |     /** | 
 |      * Retrieves an Element's metadata from native code. | 
 |      * | 
 |      * @param element Element to be read | 
 |      * @return elemData Element data | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     elementGetNativeMetadata(Element element) | 
 |                   generates (vec<uint32_t> elemData); | 
 |  | 
 |     /** | 
 |      * TODO: define Sub-Element handles better. | 
 |      * | 
 |      * Retrieves an Element's sub Elements, specifically their identifiers, | 
 |      * names, and sizes. | 
 |      * | 
 |      * @param element Element to be read | 
 |      * @param numSubElem Number of sub-Elements | 
 |      * @return ids Sub-Element handles | 
 |      * @return names Sub-Element Names | 
 |      * @return arraySizes Sizes of sub-Element arrays | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     elementGetSubElements(Element element, Size numSubElem) | 
 |                generates (vec<Element> ids, vec<string> names, | 
 |                           vec<Size> arraySizes); | 
 |  | 
 |     /** | 
 |      * TODO: can normalization flag be removed? | 
 |      * | 
 |      * Creates an Element. | 
 |      * | 
 |      * @param dt Data type | 
 |      * @param dk Data kind | 
 |      * @param norm Flag for normalization | 
 |      * @param size Vector length, with scalar = 1 | 
 |      * @return element Created Element | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     elementCreate(DataType dt, DataKind dk, bool norm, uint32_t size) | 
 |        generates (Element element); | 
 |  | 
 |     /** | 
 |      * Creates a complex Element. | 
 |      * | 
 |      * @param einsPtr Container of input Elements | 
 |      * @param namesPtr Container of input names | 
 |      * @param arraySizesPtr Container of array sizes | 
 |      * @return element Created Element | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     elementComplexCreate(vec<Element> einsPtr, vec<string> names, | 
 |                          vec<Size> arraySizesPtr) | 
 |               generates (Element element); | 
 |  | 
 |     /** | 
 |      * Retrives a Type's metadata from native code. | 
 |      * | 
 |      * @param type Type describing data layout | 
 |      * @return metadata Type's native metadata | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     typeGetNativeMetadata(Type type) generates (vec<OpaqueHandle> metadata); | 
 |  | 
 |     /** | 
 |      * Creates a new Type. | 
 |      * | 
 |      * If Type is 1D, Y and Z must be 0. If Type is 2D, Z must be 0. | 
 |      * | 
 |      * @param element Element of the Type | 
 |      * @param dimX X dimension | 
 |      * @param dimY Y dimension | 
 |      * @param dimZ Z dimension | 
 |      * @param mipmaps Flag indicating whether Type has mipmaps | 
 |      * @param faces Flag indicating whether Type has faces | 
 |      * @param yuv Enumeration specifying which type of YUV format, if any, Type | 
 |      *            uses | 
 |      * @return type Created Type | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     typeCreate(Element element, uint32_t dimX, uint32_t dimY, uint32_t dimZ, | 
 |                bool mipmaps, bool faces, YuvFormat yuv) | 
 |     generates (Type type); | 
 |  | 
 |     /** | 
 |      * Destroys provided RenderScript context, including all objects created in | 
 |      * this context. | 
 |      */ | 
 |     @exit | 
 |     contextDestroy(); | 
 |  | 
 |     /** | 
 |      * TODO: provide overview of messaging model and figure out if this should | 
 |      * be part of HAL or not. | 
 |      * TODO: what is the "client" for purposes of this interface? | 
 |      * TODO: consider using send/receive to be more similar to other calls | 
 |      * TODO: define the purpose of size more | 
 |      * | 
 |      * Fills the provided buffer with message data. "size" should be at least | 
 |      * as large as the message size. Returns the MessageType and size of the | 
 |      * message are returned. | 
 |      * | 
 |      * @param data A pointer to a buffer to be filled with a message | 
 |      * @param size Size in bytes of the buffer pointed to by "data" | 
 |      * @return messageType Type of message sent to the client | 
 |      * @return receiveLen Length of the message in bytes | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     contextGetMessage(Ptr data, Size size) | 
 |            generates (MessageToClientType messageType, Size receiveLen); | 
 |  | 
 |     /** | 
 |      * TODO: define subID better. | 
 |      * | 
 |      * Gets the metadata of a message to ensure entire message can be properly | 
 |      * received. Can be used to determine size of data to allocate when calling | 
 |      * contextGetMessage. | 
 |      * | 
 |      * @return messageType Type of message sent to the client | 
 |      * @return receiveLen Length of message | 
 |      * @return subID Message sub identifier | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     contextPeekMessage() | 
 |             generates (MessageToClientType messageType, Size receiveLen, | 
 |                        uint32_t subID); | 
 |  | 
 |     /** | 
 |      * TODO: Define "previous commands" better | 
 |      * TODO: Is the message identifier the same as subID? | 
 |      * | 
 |      * Places a message into the message queue to be sent back to the message | 
 |      * handler once all previous commands have been executed. The message data | 
 |      * is copied into the queue and can be discarded by the client after this | 
 |      * call. | 
 |      * | 
 |      * @param id Message identifier | 
 |      * @param data Message data | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     contextSendMessage(uint32_t id, vec<uint8_t> data); | 
 |  | 
 |     /** | 
 |      * TODO: Can this be done automatically as part of context creation? What | 
 |      * happens if we perform message operations before doing this? | 
 |      * | 
 |      * Initializes the messaging thread, so that the front-end API can receive | 
 |      * messages from the driver. This call also waits for the messaging FIFO to | 
 |      * start up. | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     contextInitToClient(); | 
 |  | 
 |     /** | 
 |      * TODO: Why doesn't this happen automatically as part of context | 
 |      * destruction? What happens if the FIFO is not empty? | 
 |      * | 
 |      * Deinitializes a the messaging thread. Shuts down the FIFO. | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     contextDeinitToClient(); | 
 |  | 
 |     /** | 
 |      * TODO: do we need to mark asynchronous operations in this interface | 
 |      * definition? | 
 |      * | 
 |      * Waits for any pending asynchronous operations (such as copies to a RS | 
 |      * allocation or RS script executions) to complete. | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     contextFinish(); | 
 |  | 
 |     /** | 
 |      * Prints the currently available debugging information about the state of | 
 |      * the RS context to the logcat. | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     contextLog(); | 
 |  | 
 |     /** | 
 |      * TODO: full path? relative path? Investigate further. | 
 |      * | 
 |      * Sets the cache directory of the context. | 
 |      * | 
 |      * @param cacheDir Name of the application's cache directory | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     contextSetCacheDir(string cacheDir); | 
 |  | 
 |     /** | 
 |      * TODO: does this apply to the GPU as well? | 
 |      * | 
 |      * Changes the priority of the cpu worker threads for this context. | 
 |      * | 
 |      * @param priority Priority of the thread | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     contextSetPriority(ThreadPriorities priority); | 
 |  | 
 |     /** | 
 |      * TODO: does this need to be part of the HAL? What if the object already | 
 |      * has a name? | 
 |      * | 
 |      * Assigns a name to a base object. | 
 |      * | 
 |      * @param obj Object to be named | 
 |      * @param name Assigned name | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     assignName(ObjectBase obj, string name); | 
 |  | 
 |     /** | 
 |      * TODO: what if the object has no name? | 
 |      * | 
 |      * Returns the name of an object. | 
 |      * | 
 |      * @param obj Object to be read | 
 |      * @return name Name of the object | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     getName(ObjectBase obj) generates (string name); | 
 |  | 
 |     /** | 
 |      * TODO: starting here we have a set of interfaces for use with | 
 |      * ScriptGroups. At the very least we should indicate for each one that's | 
 |      * what it's for. Should we include ScriptGroup in the interface names? | 
 |      * TODO: sweep whole file and remove prefix "v" from all parameter names | 
 |      * TODO: there are some places where we use Size for size, and others where | 
 |      * we use int32_t. Is there a reason it's int32_t? In some cases, it | 
 |      * requires a negative value. | 
 |      * | 
 |      * Creates a Closure which represents a function call to a ForEach Kernel | 
 |      * combined with arguments and values for global variables. | 
 |      * | 
 |      * @param kernelID Kernel identifier | 
 |      * @param returnValue Allocation used in output of Closure | 
 |      * @param fieldIDS Collection of Script's Field identifiers | 
 |      * @param values Collection of Script's data values | 
 |      * @param sizes Collection of Script's data sizes | 
 |      * @param depClosures Collection of Closures | 
 |      * @param depFieldIDS Collection of Script's dependent Field identifiers | 
 |      * @return closure Created Closure | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     closureCreate(ScriptKernelID kernelID, Allocation returnValue, | 
 |                   vec<ScriptFieldID> fieldIDS, vec<int64_t> values, | 
 |                   vec<int32_t> sizes, vec<Closure> depClosures, | 
 |                   vec<ScriptFieldID> depFieldIDS) | 
 |        generates (Closure closure); | 
 |  | 
 |     /** | 
 |      * Creates a Closure which represents a function call to a invocable | 
 |      * function, combined with arguments and values for global variables. | 
 |      * | 
 |      * @param invokeID Invokable function identifier | 
 |      * @param params Collection of Invoke script parameters | 
 |      * @param fieldIDS Collection of Script Field identifiers | 
 |      * @param values Collection of values | 
 |      * @param sizes Collection of sizes | 
 |      * @return closure Created Closure | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     invokeClosureCreate(ScriptInvokeID invokeID, vec<uint8_t> params, | 
 |                         vec<ScriptFieldID> fieldIDS, vec<int64_t> values, | 
 |                         vec<int32_t> sizes) | 
 |              generates (Closure closure); | 
 |  | 
 |     /** | 
 |      * Sets the argument of a Closure at specified index and size to provided | 
 |      * value. | 
 |      * | 
 |      * @param closure Closure to be modified | 
 |      * @param index Index | 
 |      * @param value Value | 
 |      * @param size Size | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     closureSetArg(Closure closure, uint32_t index, Ptr value, int32_t size); | 
 |  | 
 |     /** | 
 |      * Sets a global variable in a Closure. | 
 |      * | 
 |      * @param closure Closure | 
 |      * @param fieldID Global's Field identifier | 
 |      * @param value Value | 
 |      * @param size Size | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     closureSetGlobal(Closure closure, ScriptFieldID fieldID, int64_t value, | 
 |                      int32_t size); | 
 |  | 
 |     /** | 
 |      * TODO: should slot be unsigned? (applies to other two ID interfaces, too) | 
 |      * | 
 |      * Creates a Script Kernel ID. | 
 |      * | 
 |      * @param script Script | 
 |      * @param slot Slot | 
 |      * @param sig Bitfield describing Kernel signature and operation | 
 |      * @return scriptKernelID Script's Kernel identifier | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptKernelIDCreate(Script script, int32_t slot, | 
 |                          bitfield<MetadataSignatureBitval> sig) | 
 |               generates (ScriptKernelID scriptKernelID); | 
 |  | 
 |     /** | 
 |      * Creates a Script Invoke ID. | 
 |      * | 
 |      * @param script Script | 
 |      * @param slot Slot | 
 |      * @return scriptInvokeID Invoke Script's identifier | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptInvokeIDCreate(Script script, int32_t slot) | 
 |               generates (ScriptInvokeID scriptInvokeID); | 
 |  | 
 |     /** | 
 |      * TODO: describe the return value better. What is it? | 
 |      * | 
 |      * Creates a Script Field ID. | 
 |      * | 
 |      * @param script Script | 
 |      * @param slot Slot | 
 |      * @return scriptFieldID Script's Field identifier | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptFieldIDCreate(Script script, int32_t slot) | 
 |              generates (ScriptFieldID scriptFieldID); | 
 |  | 
 |     /** | 
 |      * TODO: add more description | 
 |      * | 
 |      * Creates a Script Group. | 
 |      * | 
 |      * @param kernels Collection of Scripts' Kernel identifiers | 
 |      * @param srcK Source Kernel identifiers | 
 |      * @param dstK Destination Kernel identifiers | 
 |      * @param dstF Destination Script Field identifiers | 
 |      * @param types Collection of Types describing data layout | 
 |      * @return scriptGroup Created Script Group | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptGroupCreate(vec<ScriptKernelID> kernels, vec<ScriptKernelID> srcK, | 
 |                       vec<ScriptKernelID> dstK, vec<ScriptFieldID> dstF, | 
 |                       vec<Type> types) | 
 |            generates (ScriptGroup scriptGroup); | 
 |  | 
 |     /** | 
 |      * Creates a Script Group. | 
 |      * | 
 |      * @param name Name | 
 |      * @param cacheDir Cache directory | 
 |      * @param closures Collection of Closures | 
 |      * @return scriptGroup2 Created Script Group | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptGroup2Create(string name, string cacheDir, vec<Closure> closures) | 
 |             generates (ScriptGroup2 scriptGroup2); | 
 |  | 
 |     /** | 
 |      * TODO: if SetInput/Output corresponds to the Java API setInput() and | 
 |      * setOutput(), which are documented as deprecated in API 23, do we need to | 
 |      * support them? Or can we fallback to the CPU when they're used? Or can't | 
 |      * we tell whether they're used early enough to do fallback? | 
 |      * | 
 |      * Sets an output of the ScriptGroup. This specifies an Allocation to be | 
 |      * used for the kernels that require an output Allocation visible after the | 
 |      * ScriptGroup is executed. | 
 |      * | 
 |      * @param sg Script Group | 
 |      * @param kid Script's Kernel identifier to be changed | 
 |      * @param alloc Allocation to be filled by output | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptGroupSetOutput(ScriptGroup sg, ScriptKernelID kid, Allocation alloc); | 
 |  | 
 |     /** | 
 |      * Sets an input of the Script Group. This specifies an Allocation to be | 
 |      * used for kernels that require an input Allocation provided from outside | 
 |      * of the Script Group. | 
 |      * | 
 |      * @param sg Script Group | 
 |      * @param kid Script's Kernel identifier to be changed | 
 |      * @param alloc Allocation to be read as input | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptGroupSetInput(ScriptGroup sg, ScriptKernelID kid, Allocation alloc); | 
 |  | 
 |     /** | 
 |      * Executes a Script Group. | 
 |      * | 
 |      * @param sg Script Group to be executed. | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptGroupExecute( ScriptGroup sg); | 
 |  | 
 |     /** | 
 |      * Frees any native resources associated with this object. The primary use | 
 |      * is to force immediate cleanup of resources when it is believed the GC | 
 |      * may not respond quickly enough. | 
 |      * | 
 |      * @param handle Opaque handle to the server-side object to be destroyed | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     objDestroy(ObjectBase obj); | 
 |  | 
 |     /** | 
 |      * Creates a Sampler. | 
 |      * | 
 |      * @param magFilter Magnification value for the filter | 
 |      * @param minFilter Minification value for the filter | 
 |      * @param wrapS S wrapping mode for the sampler | 
 |      * @param wrapT T wrapping mode for the sampler | 
 |      * @param wrapR R wrapping mode for the sampler | 
 |      * @param aniso Anisotropy setting for the sampler | 
 |      * @return sampler Created Sampler | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     samplerCreate(SamplerValue magFilter, SamplerValue minFilter, | 
 |                   SamplerValue wrapS, SamplerValue wrapT, SamplerValue wrapR, | 
 |                   float aniso) | 
 |        generates (Sampler sampler); | 
 |  | 
 |     /** | 
 |      * Binds an Allocation to a global pointer in the Script. | 
 |      * | 
 |      * @param script Script to be bound to | 
 |      * @param allocation Allocation to be bound | 
 |      * @param slot Slot of a global variable | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptBindAllocation(Script script, Allocation allocation, uint32_t slot); | 
 |  | 
 |     /** | 
 |      * TODO: is this necessary? | 
 |      * | 
 |      * Sets the timezone of a Script. | 
 |      * | 
 |      * @param script Script to be altered | 
 |      * @param timeZone Time Zone value as text | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptSetTimeZone(Script script, string timeZone); | 
 |  | 
 |     /** | 
 |      * TODO: can scriptInvoke be combined with scriptInvokeV? | 
 |      * | 
 |      * Launches an invokable function. | 
 |      * | 
 |      * @param vs Script to be invoked | 
 |      * @param slot Slot of invokable function | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptInvoke(Script vs, uint32_t slot); | 
 |  | 
 |     /** | 
 |      * Invokes a Script with values. | 
 |      * | 
 |      * @param vs Script to be invoked | 
 |      * @param slot Slot | 
 |      * @param data Data buffer of packed arguments | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptInvokeV(Script vs, uint32_t slot, vec<uint8_t> data); | 
 |  | 
 |     /** | 
 |      * TODO: add documentation for params | 
 |      * TODO: Should we rename "ScriptCall" to "LaunchOptions"? | 
 |      * | 
 |      * Launches a ForEach kernel. | 
 |      * | 
 |      * @param vs Script | 
 |      * @param slot Slot of ForEach Kernel | 
 |      * @param vains Collection of input Allocations or null | 
 |      * @param vaout Output Allocation or null | 
 |      * @param params Collection of parameters | 
 |      * @param sc Pointer to a ScriptCall, nullptr if unused | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptForEach(Script vs, uint32_t slot, vec<Allocation> vains, | 
 |                   Allocation vaout, vec<uint8_t> params, Ptr sc); | 
 |  | 
 |     /** | 
 |      * Launches a Reduction kernel. | 
 |      * | 
 |      * @param vs Script | 
 |      * @param slot Slot of Reduction Kernel | 
 |      * @param vains Collection of input Allocations | 
 |      * @param vaout Output Allocation | 
 |      * @param sc Pointer to a ScriptCall, nullptr if unused | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptReduce(Script vs, uint32_t slot, vec<Allocation> vains, | 
 |                  Allocation vaout, Ptr sc); | 
 |  | 
 |     /** | 
 |      * Sets a Script's integer variable to a value. | 
 |      * | 
 |      * @param vs RenderScript Script | 
 |      * @param slot Slot number of variable to be updated | 
 |      * @param value Value to be pushed to variable | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptSetVarI(Script vs, uint32_t slot, int32_t value); | 
 |  | 
 |     /** | 
 |      * Sets a Script's Object variable to a value | 
 |      * | 
 |      * @param vs RenderScript Script | 
 |      * @param slot Slot number of variable to be updated | 
 |      * @param obj ObjectBase | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptSetVarObj( Script vs,  uint32_t slot, ObjectBase obj); | 
 |  | 
 |     /** | 
 |      * Sets a Script's long variable to a value. | 
 |      * | 
 |      * @param vs RenderScript Script | 
 |      * @param slot Slot number of variable to be updated | 
 |      * @param value Value to be pushed to variable | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptSetVarJ(Script vs, uint32_t slot, int64_t value); | 
 |  | 
 |     /** | 
 |      * Sets a Script's float variable to a value. | 
 |      * | 
 |      * @param vs RenderScript Script | 
 |      * @param slot Slot number of variable to be updated | 
 |      * @param value Value to be pushed to variable | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptSetVarF(Script vs, uint32_t slot, float value); | 
 |  | 
 |     /** | 
 |      * Sets a Script's double variable to a value. | 
 |      * | 
 |      * @param vs RenderScript Script | 
 |      * @param slot Slot number of variable to be updated | 
 |      * @param value Value to be pushed to variable | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptSetVarD(Script vs, uint32_t slot, double value); | 
 |  | 
 |     /** | 
 |      * Sets a Script's struct variable to a value. | 
 |      * | 
 |      * @param vs RenderScript Script | 
 |      * @param slot Slot number of variable to be updated | 
 |      * @param data Data to be pushed to variable | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptSetVarV(Script vs, uint32_t slot, vec<uint8_t> data); | 
 |  | 
 |     /** | 
 |      * TODO: Why do we have typed setters but only untyped getter? | 
 |      * | 
 |      * Retrieves the value from a global variable in a script. | 
 |      * | 
 |      * @param vs RenderScript Script | 
 |      * @param slot Slot number of variable to be read | 
 |      * @param len Size of data to be filled | 
 |      * @return data Data to be updated | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptGetVarV(Script vs, uint32_t slot, Size len) | 
 |        generates (vec<uint8_t> data); | 
 |  | 
 |     /** | 
 |      * TODO: Is this a value to be replicated for each member of the array? Or | 
 |      * is there a representation for each separate member? | 
 |      * | 
 |      * Sets the value of a global array of structs, given the Element and | 
 |      * dimension. | 
 |      * | 
 |      * @param vs RenderScript Script | 
 |      * @param slot Slot number of variable to be updated | 
 |      * @param data Data | 
 |      * @param ve Element | 
 |      * @param dims Collection of dimensions | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptSetVarVE(Script vs, uint32_t slot, vec<uint8_t> data, Element ve, | 
 |                    vec<uint32_t> dims); | 
 |  | 
 |     /** | 
 |      * TODO: is cacheDir redundant with createCache() function? Can we remove | 
 |      * it? | 
 |      * TODO: define resName more clearly | 
 |      * | 
 |      * Creates a RenderScript C99 kernel script. | 
 |      * | 
 |      * @param resName Resource name of the bitcode | 
 |      * @param cacheDir Cache directory name | 
 |      * @param text The kernel's bitcode as a uint8_t vector | 
 |      * @return script Created Script | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptCCreate(string resName, string cacheDir, vec<uint8_t> text) | 
 |        generates (Script script); | 
 |  | 
 |     /** | 
 |      * Creates a RenderScript Intrinsic script. | 
 |      * | 
 |      * @param id Intrinsic Script identifier | 
 |      * @param elem Element | 
 |      * @return script Created Script | 
 |      */ | 
 |     @callflow(next={"*"}) | 
 |     scriptIntrinsicCreate(ScriptIntrinsicID id, Element elem) | 
 |                generates (Script script); | 
 |  | 
 | }; |