| # |
| # 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: |