概览
rsForEach() 函数可用于调用脚本的根内核。
其他函数用于获取执行中内核调用的特性,例如维度和当前索引。这些函数接受一个 rs_kernel_context 作为参数。
摘要
类型 | |
---|---|
rs_for_each_strategy_t | 建议的单元处理顺序 |
rs_kernel | 内核函数的句柄 |
rs_kernel_context | 内核调用上下文的句柄 |
rs_script_call_t | 单元迭代信息 |
函数 | |
---|---|
rsForEach | 启动内核 |
rsForEachInternal | (内部 API)在当前脚本中启动内核(带槽位号) |
rsForEachWithOptions | 使用选项启动内核 |
rsGetArray0 | 指定内核上下文的 Array0 维度中的索引 |
rsGetArray1 | 指定内核上下文的 Array1 维度中的索引 |
rsGetArray2 | 指定内核上下文的 Array2 维度中的索引 |
rsGetArray3 | 指定内核上下文的 Array3 维度中的索引 |
rsGetDimArray0 | 指定内核上下文的 Array0 维度的尺寸 |
rsGetDimArray1 | 指定内核上下文的 Array1 维度的尺寸 |
rsGetDimArray2 | 指定内核上下文的 Array2 维度的尺寸 |
rsGetDimArray3 | 指定内核上下文的 Array3 维度的尺寸 |
rsGetDimHasFaces | 指定内核上下文是否存在多个面 |
rsGetDimLod | 指定内核上下文的详细级别数 |
rsGetDimX | 指定内核上下文的 X 维度的尺寸 |
rsGetDimY | 指定内核上下文的 Y 维度的尺寸 |
rsGetDimZ | 指定内核上下文的 Z 维度的尺寸 |
rsGetFace | 指定内核上下文的 Face 坐标 |
rsGetLod | 指定内核上下文的详细级别维度中的索引 |
类型
rs_for_each_strategy_t : 建议的单元处理顺序
具有以下值的枚举:
RS_FOR_EACH_STRATEGY_SERIAL = 0 | 首选连续内存区域。 |
---|---|
RS_FOR_EACH_STRATEGY_DONT_CARE = 1 | 无偏好。 |
RS_FOR_EACH_STRATEGY_DST_LINEAR = 2 | 首选 DST。 |
RS_FOR_EACH_STRATEGY_TILE_SMALL = 3 | 首选处理小型矩形区域。 |
RS_FOR_EACH_STRATEGY_TILE_MEDIUM = 4 | 首选处理中型矩形区域。 |
RS_FOR_EACH_STRATEGY_TILE_LARGE = 5 | 首选处理大型矩形区域。 |
此类型用于建议调用的内核应如何迭代 allocation 的单元。这仅是提示。实现可能不会遵循此建议。
此规范有助于运行内核的缓存行为,例如处理分布在多个核心时的缓存局部性。
rs_kernel : 内核函数的句柄
void* 的 typedef: 添加于 API level 24
具有 kernel 属性定义的函数的 不透明类型。此类型的值可在 rsForEach 调用中用于启动内核。
rs_kernel_context : 内核调用上下文的句柄
const struct rs_kernel_context_t * 的 typedef: 添加于 API level 23
内核上下文包含正在迭代的 allocation 的共同特性,如维度。它还包含当前处理的单元的很少使用的索引,如 Array0 索引或当前的详细级别。
您可以通过向内核函数添加一个名为 "context" 的特殊参数(类型为 rs_kernel_context)来访问内核上下文。请参阅 rsGetDimX() 和 rsGetArray0() 以获取示例。
rs_script_call_t : 单元迭代信息
具有以下字段的结构:
rs_for_each_strategy_t strategy | 当前忽略。将来将用作建议的单元迭代策略。 |
---|---|
uint32_t xStart | X 维度中的起始索引。 |
uint32_t xEnd | X 维度中的结束索引(不包含)。 |
uint32_t yStart | Y 维度中的起始索引。 |
uint32_t yEnd | Y 维度中的结束索引(不包含)。 |
uint32_t zStart | Z 维度中的起始索引。 |
uint32_t zEnd | Z 维度中的结束索引(不包含)。 |
uint32_t arrayStart | Array0 维度中的起始索引。 |
uint32_t arrayEnd | Array0 维度中的结束索引(不包含)。 |
uint32_t array1Start | Array1 维度中的起始索引。 |
uint32_t array1End | Array1 维度中的结束索引(不包含)。 |
uint32_t array2Start | Array2 维度中的起始索引。 |
uint32_t array2End | Array2 维度中的结束索引(不包含)。 |
uint32_t array3Start | Array3 维度中的起始索引。 |
uint32_t array3End | Array3 维度中的结束索引(不包含)。 |
此结构用于向 rsForEach 调用提供迭代信息。目前用于将处理限制在单元的子集。在未来的版本中,它还将用于提供如何最佳迭代单元的提示。
Start 字段包含,End 字段不包含。例如,要在 X 维度中迭代单元 4、5、6 和 7,将 xStart 设置为 4,将 xEnd 设置为 8。
函数
rsForEach : 启动内核
void rsForEach(rs_kernel kernel, ... ...); | 添加于 API level 24 |
void rsForEach(rs_script script, rs_allocation input, rs_allocation output); | API level 14 - 23 |
void rsForEach(rs_script script, rs_allocation input, rs_allocation output, const void* usrData); | 从 API level 14 及更高版本中移除 |
void rsForEach(rs_script script, rs_allocation input, rs_allocation output, const void* usrData, const rs_script_call_t* sc); | 从 API level 14 及更高版本中移除 |
void rsForEach(rs_script script, rs_allocation input, rs_allocation output, const void* usrData, size_t usrDataLen); | API level 14 - 20 |
void rsForEach(rs_script script, rs_allocation input, rs_allocation output, const void* usrData, size_t usrDataLen, const rs_script_call_t* sc); | API level 14 - 20 |
参数
script | 要调用的脚本。 |
---|---|
input | 数据来源的 Allocation。 |
output | 将数据写入的 Allocation。 |
usrData | 传递给脚本的用户定义数据。可以为 NULL。 |
sc | 用于选择要处理的 allocation 子区域或建议遍历策略的额外控制信息。可以为 NULL。 |
usrDataLen | userData 结构的大小。如有必要,将用于执行数据的浅层复制。 |
kernel | 带有 kernel 属性定义的函数的函数指示符。 |
... | 输入和输出 allocation |
在零个或多个输入 allocation 上运行内核。它们在 rs_kernel 参数之后传递。如果指定的内核返回值,则必须将输出 allocation 指定为最后一个参数。所有输入 allocation(如果存在输出 allocation,则包括输出 allocation)必须具有相同的维度。
这是一个同步函数。对此函数的调用只有在所有输入 allocation 的所有单元工作完成后才会返回。如果内核函数返回任何值,则调用会等待直到所有结果都已写入输出 allocation。
在 API level 23 及之前,内核隐式指定为指定脚本中名为 "root" 的内核,并且只能使用一个输入 allocation。从 API level 24 开始,可以使用任意内核函数,由 kernel 参数指定。script 参数被移除。内核必须在当前脚本中定义。此外,可以使用多个输入。
例如:
float __attribute__((kernel)) square(float a) {
return a * a;
}
void compute(rs_allocation ain, rs_allocation aout) {
rsForEach(square, ain, aout);
}
rsForEachInternal : (内部 API)在当前脚本中启动内核(带槽位号)
void rsForEachInternal(int slot, rs_script_call_t* options, int hasOutput, int numInputs, rs_allocation* allocs); | 添加于 API level 24 |
参数
slot | |
---|---|
options | |
hasOutput | 指示内核是否生成输出 |
numInputs | 输入 allocation 的数量 |
allocs | 输入和输出 allocation |
内部 API,用于启动内核。
rsForEachWithOptions : 使用选项启动内核
void rsForEachWithOptions(rs_kernel kernel, rs_script_call_t* options, ... ...); | 添加于 API level 24 |
参数
kernel | 带有 kernel 属性定义的函数的函数指示符。 |
---|---|
options | 启动选项 |
... | 输入和输出 allocation |
以类似于 rsForEach 的方式启动内核。但是,此函数不处理输入中的所有单元,而只处理 options 中指定的索引空间的子空间中的单元。由于索引空间由 options 显式指定,因此使用此 API 启动内核不需要输入或输出 allocation。如果传入了 allocation,它们必须与内核函数期望的参数数量和返回值匹配。仅当内核具有非 void 返回值时,输出 allocation 才存在。
例如:
rs_script_call_t opts = {0};
opts.xStart = 0;
opts.xEnd = dimX;
opts.yStart = 0;
opts.yEnd = dimY / 2;
rsForEachWithOptions(foo, &opts, out, out);
rsGetArray0 : 指定内核上下文的 Array0 维度中的索引
uint32_t rsGetArray0(rs_kernel_context context); | 添加于 API level 23 |
返回正在处理的单元的 Array0 维度中的索引,由提供的内核上下文指定。
内核上下文包含正在迭代的 allocation 的共同特性和很少使用的索引,如 Array0 索引。
您可以通过向内核函数添加一个名为 "context" 的特殊参数(类型为 rs_kernel_context)来访问内核上下文。例如:
short RS_KERNEL myKernel(short value, uint32_t x, rs_kernel_context context) {
// 通过添加这些变量作为参数来访问常见的 x, y, z 维度中的当前索引
// 。对于其他维度中很少使用的索引
// ,从内核上下文提取它们
uint32_t index_a0 = rsGetArray0(context);
//...
}
如果 Array0 维度不存在,此函数返回 0。
rsGetArray1 : 指定内核上下文的 Array1 维度中的索引
uint32_t rsGetArray1(rs_kernel_context context); | 添加于 API level 23 |
返回正在处理的单元的 Array1 维度中的索引,由提供的内核上下文指定。请参阅 rsGetArray0() 以获取上下文说明。
如果 Array1 维度不存在,返回 0。
rsGetArray2 : 指定内核上下文的 Array2 维度中的索引
uint32_t rsGetArray2(rs_kernel_context context); | 添加于 API level 23 |
返回正在处理的单元的 Array2 维度中的索引,由提供的内核上下文指定。请参阅 rsGetArray0() 以获取上下文说明。
如果 Array2 维度不存在,返回 0。
rsGetArray3 : 指定内核上下文的 Array3 维度中的索引
uint32_t rsGetArray3(rs_kernel_context context); | 添加于 API level 23 |
返回正在处理的单元的 Array3 维度中的索引,由提供的内核上下文指定。请参阅 rsGetArray0() 以获取上下文说明。
如果 Array3 维度不存在,返回 0。
rsGetDimArray0 : 指定内核上下文的 Array0 维度的尺寸
uint32_t rsGetDimArray0(rs_kernel_context context); | 添加于 API level 23 |
返回指定内核上下文的 Array0 维度的尺寸。请参阅 rsGetDimX() 以获取上下文说明。
如果 Array0 维度不存在,返回 0。
rsGetDimArray1 : 指定内核上下文的 Array1 维度的尺寸
uint32_t rsGetDimArray1(rs_kernel_context context); | 添加于 API level 23 |
返回指定内核上下文的 Array1 维度的尺寸。请参阅 rsGetDimX() 以获取上下文说明。
如果 Array1 维度不存在,返回 0。
rsGetDimArray2 : 指定内核上下文的 Array2 维度的尺寸
uint32_t rsGetDimArray2(rs_kernel_context context); | 添加于 API level 23 |
返回指定内核上下文的 Array2 维度的尺寸。请参阅 rsGetDimX() 以获取上下文说明。
如果 Array2 维度不存在,返回 0。
rsGetDimArray3 : 指定内核上下文的 Array3 维度的尺寸
uint32_t rsGetDimArray3(rs_kernel_context context); | 添加于 API level 23 |
返回指定内核上下文的 Array3 维度的尺寸。请参阅 rsGetDimX() 以获取上下文说明。
如果 Array3 维度不存在,返回 0。
rsGetDimHasFaces : 指定内核上下文是否存在多个面
bool rsGetDimHasFaces(rs_kernel_context context); | 添加于 API level 23 |
返回
如果存在多个面,则返回 true;否则返回 false。 |
如果内核正在迭代 cubemap,则此函数在存在多个面时返回 true。在所有其他情况下,返回 false。请参阅 rsGetDimX() 以获取上下文说明。
rsAllocationGetDimFaces() 类似,但返回 0 或 1,而不是 bool。
rsGetDimLod : 指定内核上下文的详细级别数
uint32_t rsGetDimLod(rs_kernel_context context); | 添加于 API level 23 |
返回指定内核上下文的详细级别数。这对于 mipmap 非常有用。请参阅 rsGetDimX() 以获取上下文说明。
如果未使用详细级别,返回 0。
rsAllocationGetDimLOD() 类似,但返回 0 或 1,而不是实际的级别数。
rsGetDimX : 指定内核上下文的 X 维度的尺寸
uint32_t rsGetDimX(rs_kernel_context context); | 添加于 API level 23 |
返回指定内核上下文的 X 维度的尺寸。
内核上下文包含正在迭代的 allocation 的共同特性和很少使用的索引,如 Array0 索引。
您可以通过向内核函数添加一个名为 "context" 的特殊参数(类型为 rs_kernel_context)来访问它。例如:
int4 RS_KERNEL myKernel(int4 value, rs_kernel_context context) {
uint32_t size = rsGetDimX(context); //...
要获取特定 allocation 的维度,请使用 rsAllocationGetDimX()。
rsGetDimY : 指定内核上下文的 Y 维度的尺寸
uint32_t rsGetDimY(rs_kernel_context context); | 添加于 API level 23 |
返回指定内核上下文的 X 维度的尺寸。请参阅 rsGetDimX() 以获取上下文说明。
如果 Y 维度不存在,返回 0。
要获取特定 allocation 的维度,请使用 rsAllocationGetDimY()。
rsGetDimZ : 指定内核上下文的 Z 维度的尺寸
uint32_t rsGetDimZ(rs_kernel_context context); | 添加于 API level 23 |
返回指定内核上下文的 Z 维度的尺寸。请参阅 rsGetDimX() 以获取上下文说明。
如果 Z 维度不存在,返回 0。
要获取特定 allocation 的维度,请使用 rsAllocationGetDimZ()。
rsGetFace : 指定内核上下文的 Face 坐标
rs_allocation_cubemap_face rsGetFace(rs_kernel_context context); | 添加于 API level 23 |
返回找到正在处理的单元的面,由提供的内核上下文指定。请参阅 rsGetArray0() 以获取上下文说明。
如果面维度不存在,返回 RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X。
rsGetLod : 指定内核上下文的详细级别维度中的索引
uint32_t rsGetLod(rs_kernel_context context); | 添加于 API level 23 |
返回正在处理的单元的详细级别维度中的索引,由提供的内核上下文指定。请参阅 rsGetArray0() 以获取上下文说明。
如果详细级别维度不存在,返回 0。