RenderScript 内核调用函数和类型

概览

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 xStartX 维度中的起始索引。
uint32_t xEndX 维度中的结束索引(不包含)。
uint32_t yStartY 维度中的起始索引。
uint32_t yEndY 维度中的结束索引(不包含)。
uint32_t zStartZ 维度中的起始索引。
uint32_t zEndZ 维度中的结束索引(不包含)。
uint32_t arrayStartArray0 维度中的起始索引。
uint32_t arrayEndArray0 维度中的结束索引(不包含)。
uint32_t array1StartArray1 维度中的起始索引。
uint32_t array1EndArray1 维度中的结束索引(不包含)。
uint32_t array2StartArray2 维度中的起始索引。
uint32_t array2EndArray2 维度中的结束索引(不包含)。
uint32_t array3StartArray3 维度中的起始索引。
uint32_t array3EndArray3 维度中的结束索引(不包含)。

此结构用于向 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。
usrDataLenuserData 结构的大小。如有必要,将用于执行数据的浅层复制。
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 坐标

返回找到正在处理的单元的面,由提供的内核上下文指定。请参阅 rsGetArray0() 以获取上下文说明。

如果面维度不存在,返回 RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X。

rsGetLod : 指定内核上下文的详细级别维度中的索引

uint32_t rsGetLod(rs_kernel_context context); 添加于 API level 23

返回正在处理的单元的详细级别维度中的索引,由提供的内核上下文指定。请参阅 rsGetArray0() 以获取上下文说明。

如果详细级别维度不存在,返回 0。