blob: 43a09e149b260bd1f267ff5155d0a0e00eec257a [file] [log] [blame]
/*
* 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);
};