| # | |
| # Copyright (C) 2015 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. | |
| # | |
| header: | |
| summary: Kernel Invocation Functions and Types | |
| description: | |
| The @rsForEach() function can be used to invoke the root kernel of a script. | |
| The other functions are used to get the characteristics of the invocation of | |
| an executing kernel, like dimensions and current indices. These functions take | |
| a @rs_kernel_context as argument. | |
| end: | |
| type: rs_for_each_strategy_t | |
| enum: rs_for_each_strategy | |
| value: RS_FOR_EACH_STRATEGY_SERIAL = 0, "Prefer contiguous memory regions." | |
| value: RS_FOR_EACH_STRATEGY_DONT_CARE = 1, "No prefrences." | |
| #TODO explain this better | |
| value: RS_FOR_EACH_STRATEGY_DST_LINEAR = 2, "Prefer DST." | |
| value: RS_FOR_EACH_STRATEGY_TILE_SMALL = 3, "Prefer processing small rectangular regions." | |
| value: RS_FOR_EACH_STRATEGY_TILE_MEDIUM = 4, "Prefer processing medium rectangular regions." | |
| value: RS_FOR_EACH_STRATEGY_TILE_LARGE = 5, "Prefer processing large rectangular regions." | |
| summary: Suggested cell processing order | |
| description: | |
| This type is used to suggest how the invoked kernel should iterate over the cells of the | |
| allocations. This is a hint only. Implementations may not follow the suggestion. | |
| This specification can help the caching behavior of the running kernel, e.g. the cache | |
| locality when the processing is distributed over multiple cores. | |
| end: | |
| type: rs_kernel_context | |
| version: 23 | |
| simple: const struct rs_kernel_context_t * | |
| summary: Handle to a kernel invocation context | |
| description: | |
| The kernel context contains common characteristics of the allocations being iterated | |
| over, like dimensions. It also contains rarely used indices of the currently processed | |
| cell, like the Array0 index or the current level of detail. | |
| You can access the kernel context by adding a special parameter named "context" of type | |
| rs_kernel_context to your kernel function. See @rsGetDimX() and @rsGetArray0() for examples. | |
| end: | |
| type: rs_script_call_t | |
| struct: rs_script_call | |
| field: rs_for_each_strategy_t strategy, "Currently ignored. In the future, will be suggested cell iteration strategy." | |
| field: uint32_t xStart, "Starting index in the X dimension." | |
| field: uint32_t xEnd, "Ending index (exclusive) in the X dimension." | |
| field: uint32_t yStart, "Starting index in the Y dimension." | |
| field: uint32_t yEnd, "Ending index (exclusive) in the Y dimension." | |
| field: uint32_t zStart, "Starting index in the Z dimension." | |
| field: uint32_t zEnd, "Ending index (exclusive) in the Z dimension." | |
| field: uint32_t arrayStart, "Starting index in the Array0 dimension." | |
| field: uint32_t arrayEnd, "Ending index (exclusive) in the Array0 dimension." | |
| field: uint32_t array1Start, "Starting index in the Array1 dimension." | |
| field: uint32_t array1End, "Ending index (exclusive) in the Array1 dimension." | |
| field: uint32_t array2Start, "Starting index in the Array2 dimension." | |
| field: uint32_t array2End, "Ending index (exclusive) in the Array2 dimension." | |
| field: uint32_t array3Start, "Starting index in the Array3 dimension." | |
| field: uint32_t array3End, "Ending index (exclusive) in the Array3 dimension." | |
| summary: Cell iteration information | |
| description: | |
| This structure is used to provide iteration information to a rsForEach call. | |
| It is currently used to restrict processing to a subset of cells. In future | |
| versions, it will also be used to provide hint on how to best iterate over | |
| the cells. | |
| The Start fields are inclusive and the End fields are exclusive. E.g. to iterate | |
| over cells 4, 5, 6, and 7 in the X dimension, set xStart to 4 and xEnd to 8. | |
| end: | |
| type: rs_kernel | |
| version: 24 | |
| simple: void* | |
| summary: Handle to a kernel function | |
| description: | |
| An opaque type for a function that is defined with the kernel attribute. A value | |
| of this type can be used in a @rsForEach call to launch a kernel. | |
| end: | |
| function: rsForEach | |
| version: 9 13 | |
| ret: void | |
| arg: rs_script script, "Script to call." | |
| arg: rs_allocation input, "Allocation to source data from." | |
| arg: rs_allocation output, "Allocation to write date into." | |
| arg: const void* usrData, "User defined data to pass to the script. May be NULL." | |
| arg: const rs_script_call_t* sc, "Extra control information used to select a sub-region of the allocation to be processed or suggest a walking strategy. May be NULL." | |
| summary: Launches a kernel | |
| description: | |
| Runs the kernel over zero or more input allocations. They are passed after the | |
| @rs_kernel argument. If the specified kernel returns a value, an output allocation | |
| must be specified as the last argument. All input allocations, | |
| and the output allocation if it exists, must have the same dimensions. | |
| This is a synchronous function. A call to this function only returns after all | |
| the work has completed for all cells of the input allocations. If the kernel | |
| function returns any value, the call waits until all results have been written | |
| to the output allocation. | |
| Up to API level 23, the kernel is implicitly specified as the kernel named | |
| "root" in the specified script, and only a single input allocation can be used. | |
| Starting in API level 24, an arbitrary kernel function can be used, | |
| as specified by the kernel argument. The script argument is removed. | |
| The kernel must be defined in the current script. In addition, more than one | |
| input can be used. | |
| E.g.<code><br/> | |
| float __attribute__((kernel)) square(float a) {<br/> | |
| return a * a;<br/> | |
| }<br/> | |
| <br/> | |
| void compute(rs_allocation ain, rs_allocation aout) {<br/> | |
| rsForEach(square, ain, aout);<br/> | |
| }<br/> | |
| <br/></code> | |
| test: none | |
| end: | |
| function: rsForEach | |
| version: 9 13 | |
| ret: void | |
| arg: rs_script script | |
| arg: rs_allocation input | |
| arg: rs_allocation output | |
| arg: const void* usrData | |
| test: none | |
| end: | |
| function: rsForEach | |
| version: 14 20 | |
| ret: void | |
| arg: rs_script script | |
| arg: rs_allocation input | |
| arg: rs_allocation output | |
| arg: const void* usrData | |
| arg: size_t usrDataLen, "Size of the userData structure. This will be used to perform a shallow copy of the data if necessary." | |
| arg: const rs_script_call_t* sc | |
| test: none | |
| end: | |
| function: rsForEach | |
| version: 14 20 | |
| ret: void | |
| arg: rs_script script | |
| arg: rs_allocation input | |
| arg: rs_allocation output | |
| arg: const void* usrData | |
| arg: size_t usrDataLen | |
| test: none | |
| end: | |
| function: rsForEach | |
| version: 14 23 | |
| ret: void | |
| arg: rs_script script | |
| arg: rs_allocation input | |
| arg: rs_allocation output | |
| test: none | |
| end: | |
| function: rsForEach | |
| version: 24 | |
| intrinsic: true | |
| # Not overloadable | |
| attrib: = | |
| ret: void | |
| arg: rs_kernel kernel, "Function designator to a function that is defined with the kernel attribute." | |
| arg: ..., "Input and output allocations" | |
| test: none | |
| end: | |
| function: rsForEachWithOptions | |
| version: 24 | |
| intrinsic: true | |
| # Not overloadable | |
| attrib: = | |
| ret: void | |
| arg: rs_kernel kernel, "Function designator to a function that is defined with the kernel attribute." | |
| arg: rs_script_call_t* options, "Launch options" | |
| arg: ..., "Input and output allocations" | |
| summary: Launches a kernel with options | |
| description: | |
| Launches kernel in a way similar to @rsForEach. However, instead of processing | |
| all cells in the input, this function only processes cells in the subspace of | |
| the index space specified in options. With the index space explicitly specified | |
| by options, no input or output allocation is required for a kernel launch using | |
| this API. If allocations are passed in, they must match the number of arguments | |
| and return value expected by the kernel function. The output allocation is | |
| present if and only if the kernel has a non-void return value. | |
| E.g.,<code><br/> | |
| rs_script_call_t opts = {0};<br/> | |
| opts.xStart = 0;<br/> | |
| opts.xEnd = dimX;<br/> | |
| opts.yStart = 0;<br/> | |
| opts.yEnd = dimY / 2;<br/> | |
| rsForEachWithOptions(foo, &opts, out, out);<br/> | |
| </code> | |
| test: none | |
| end: | |
| function: rsForEachInternal | |
| version: 24 | |
| internal: true | |
| ret: void | |
| arg: int slot | |
| arg: rs_script_call_t* options | |
| arg: int hasOutput, "Indicates whether the kernel generates output" | |
| arg: int numInputs, "Number of input allocations" | |
| arg: rs_allocation* allocs, "Input and output allocations" | |
| summary: (Internal API) Launch a kernel in the current Script (with the slot number) | |
| description: | |
| Internal API to launch a kernel. | |
| test: none | |
| end: | |
| function: rsGetArray0 | |
| version: 23 | |
| ret: uint32_t | |
| arg: rs_kernel_context context | |
| summary: Index in the Array0 dimension for the specified kernel context | |
| description: | |
| Returns the index in the Array0 dimension of the cell being processed, as specified | |
| by the supplied kernel context. | |
| The kernel context contains common characteristics of the allocations being iterated | |
| over and rarely used indices, like the Array0 index. | |
| You can access the kernel context by adding a special parameter named "context" of | |
| type rs_kernel_context to your kernel function. E.g.<br/> | |
| <code>short RS_KERNEL myKernel(short value, uint32_t x, rs_kernel_context context) {<br/> | |
| // The current index in the common x, y, z dimensions are accessed by<br/> | |
| // adding these variables as arguments. For the more rarely used indices<br/> | |
| // to the other dimensions, extract them from the kernel context:<br/> | |
| uint32_t index_a0 = rsGetArray0(context);<br/> | |
| //...<br/> | |
| }<br/></code> | |
| This function returns 0 if the Array0 dimension is not present. | |
| test: none | |
| end: | |
| function: rsGetArray1 | |
| version: 23 | |
| ret: uint32_t | |
| arg: rs_kernel_context context | |
| summary: Index in the Array1 dimension for the specified kernel context | |
| description: | |
| Returns the index in the Array1 dimension of the cell being processed, as specified | |
| by the supplied kernel context. See @rsGetArray0() for an explanation of the context. | |
| Returns 0 if the Array1 dimension is not present. | |
| test: none | |
| end: | |
| function: rsGetArray2 | |
| version: 23 | |
| ret: uint32_t | |
| arg: rs_kernel_context context | |
| summary: Index in the Array2 dimension for the specified kernel context | |
| description: | |
| Returns the index in the Array2 dimension of the cell being processed, | |
| as specified by the supplied kernel context. See @rsGetArray0() for an explanation | |
| of the context. | |
| Returns 0 if the Array2 dimension is not present. | |
| test: none | |
| end: | |
| function: rsGetArray3 | |
| version: 23 | |
| ret: uint32_t | |
| arg: rs_kernel_context context | |
| summary: Index in the Array3 dimension for the specified kernel context | |
| description: | |
| Returns the index in the Array3 dimension of the cell being processed, as specified | |
| by the supplied kernel context. See @rsGetArray0() for an explanation of the context. | |
| Returns 0 if the Array3 dimension is not present. | |
| test: none | |
| end: | |
| function: rsGetDimArray0 | |
| version: 23 | |
| ret: uint32_t | |
| arg: rs_kernel_context context | |
| summary: Size of the Array0 dimension for the specified kernel context | |
| description: | |
| Returns the size of the Array0 dimension for the specified kernel context. | |
| See @rsGetDimX() for an explanation of the context. | |
| Returns 0 if the Array0 dimension is not present. | |
| #TODO Add an hyperlink to something that explains Array0/1/2/3 | |
| # for the relevant functions. | |
| test: none | |
| end: | |
| function: rsGetDimArray1 | |
| version: 23 | |
| ret: uint32_t | |
| arg: rs_kernel_context context | |
| summary: Size of the Array1 dimension for the specified kernel context | |
| description: | |
| Returns the size of the Array1 dimension for the specified kernel context. | |
| See @rsGetDimX() for an explanation of the context. | |
| Returns 0 if the Array1 dimension is not present. | |
| test: none | |
| end: | |
| function: rsGetDimArray2 | |
| version: 23 | |
| ret: uint32_t | |
| arg: rs_kernel_context context | |
| summary: Size of the Array2 dimension for the specified kernel context | |
| description: | |
| Returns the size of the Array2 dimension for the specified kernel context. | |
| See @rsGetDimX() for an explanation of the context. | |
| Returns 0 if the Array2 dimension is not present. | |
| test: none | |
| end: | |
| function: rsGetDimArray3 | |
| version: 23 | |
| ret: uint32_t | |
| arg: rs_kernel_context context | |
| summary: Size of the Array3 dimension for the specified kernel context | |
| description: | |
| Returns the size of the Array3 dimension for the specified kernel context. | |
| See @rsGetDimX() for an explanation of the context. | |
| Returns 0 if the Array3 dimension is not present. | |
| test: none | |
| end: | |
| function: rsGetDimHasFaces | |
| version: 23 | |
| ret: bool, "Returns true if more than one face is present, false otherwise." | |
| arg: rs_kernel_context context | |
| summary: Presence of more than one face for the specified kernel context | |
| description: | |
| If the kernel is iterating over a cubemap, this function returns true if there's more | |
| than one face present. In all other cases, it returns false. See @rsGetDimX() for an | |
| explanation of the context. | |
| @rsAllocationGetDimFaces() is similar but returns 0 or 1 instead of a bool. | |
| test: none | |
| end: | |
| function: rsGetDimLod | |
| version: 23 | |
| ret: uint32_t | |
| arg: rs_kernel_context context | |
| summary: Number of levels of detail for the specified kernel context | |
| description: | |
| Returns the number of levels of detail for the specified kernel context. This is useful | |
| for mipmaps. See @rsGetDimX() for an explanation of the context. | |
| Returns 0 if Level of Detail is not used. | |
| @rsAllocationGetDimLOD() is similar but returns 0 or 1 instead the actual | |
| number of levels. | |
| test: none | |
| end: | |
| function: rsGetDimX | |
| version: 23 | |
| ret: uint32_t | |
| arg: rs_kernel_context context | |
| summary: Size of the X dimension for the specified kernel context | |
| description: | |
| Returns the size of the X dimension for the specified kernel context. | |
| The kernel context contains common characteristics of the allocations being iterated | |
| over and rarely used indices, like the Array0 index. | |
| You can access it by adding a special parameter named "context" of | |
| type rs_kernel_context to your kernel function. E.g.<br/> | |
| <code>int4 RS_KERNEL myKernel(int4 value, rs_kernel_context context) {<br/> | |
| uint32_t size = rsGetDimX(context); //...<br/></code> | |
| To get the dimension of specific allocation, use @rsAllocationGetDimX(). | |
| test: none | |
| end: | |
| function: rsGetDimY | |
| version: 23 | |
| ret: uint32_t | |
| arg: rs_kernel_context context | |
| summary: Size of the Y dimension for the specified kernel context | |
| description: | |
| Returns the size of the X dimension for the specified kernel context. | |
| See @rsGetDimX() for an explanation of the context. | |
| Returns 0 if the Y dimension is not present. | |
| To get the dimension of specific allocation, use @rsAllocationGetDimY(). | |
| test: none | |
| end: | |
| function: rsGetDimZ | |
| version: 23 | |
| ret: uint32_t | |
| arg: rs_kernel_context context | |
| summary: Size of the Z dimension for the specified kernel context | |
| description: | |
| Returns the size of the Z dimension for the specified kernel context. | |
| See @rsGetDimX() for an explanation of the context. | |
| Returns 0 if the Z dimension is not present. | |
| To get the dimension of specific allocation, use @rsAllocationGetDimZ(). | |
| test: none | |
| end: | |
| function: rsGetFace | |
| version: 23 | |
| ret: rs_allocation_cubemap_face | |
| arg: rs_kernel_context context | |
| summary: Coordinate of the Face for the specified kernel context | |
| description: | |
| Returns the face on which the cell being processed is found, as specified by the | |
| supplied kernel context. See @rsGetArray0() for an explanation of the context. | |
| Returns RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X if the face dimension is not | |
| present. | |
| test: none | |
| end: | |
| function: rsGetLod | |
| version: 23 | |
| ret: uint32_t | |
| arg: rs_kernel_context context | |
| summary: Index in the Levels of Detail dimension for the specified kernel context | |
| description: | |
| Returns the index in the Levels of Detail dimension of the cell being processed, | |
| as specified by the supplied kernel context. See @rsGetArray0() for an explanation of | |
| the context. | |
| Returns 0 if the Levels of Detail dimension is not present. | |
| test: none | |
| end: |