675ae49ab1
Bug: 36453077 Test: make Change-Id: Ic77394d4d2e1ccedba3a28230d870c5d6108bd40
1177 lines
44 KiB
Text
1177 lines
44 KiB
Text
/*
|
|
* 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);
|
|
|
|
};
|