我还没有找到任何文档,但也许我可以给你一些关于我迄今为止调查的有用信息:
- 指针不可用
- 内核函数需要该属性,
__attribute__((kernel))
否则编译器会发疯并期望指针类型,这是非法的
- 可以使用Renderscript API(至少到目前为止我尝试的一切都有效)
- AndroidManifest.xml 中的属性“Min SDK version”必须设置为“17”->“Uses Sdk”
我在阅读llvm-rs-cc 编译器的源代码时发现了以下大部分信息。任何进一步的信息或 Filterscript 真实文档的链接将不胜感激!
产出分配
在 Filterscript 中,您没有用于输出分配的参数。相反,您返回要在当前位置写入的值(这是全局线程 idx
和y
):
uchar4 __attribute__((kernel)) root(uint32_t x, uint32_t y)
生成为:
public void forEach_root(Allocation aout)
输入分配
您可以选择将输入分配作为参数移交:
uchar4 __attribute__((kernel)) root(const uchar4 in, uint32_t x, uint32_t y)
生成为:
public void forEach_root(Allocation ain, Allocation aout)
这仅在极少数情况下有用(例如点运算符),因为您只能在当前位置访问输入分配。
全局分配
如果您想在输入分配中进行随机访问,那么您将需要全局分配。这是一个使用全局分配的窗口运算符的小例子,对我有用。
模糊.fs:
#pragma version(1)
#pragma rs java_package_name(com.example.myproject)
rs_allocation in;
uint32_t width;
uint32_t height;
uchar4 __attribute__((kernel)) root(uint32_t x, uint32_t y) {
uint4 sum = 0;
uint count = 0;
for (int yi = y-1; yi <= y+1; ++yi) {
for (int xi = x-1; xi <= x+1; ++xi) {
if (xi >= 0 && xi < width && yi >= 0 && yi < height) {
sum += convert_uint4(rsGetElementAt_uchar4(in, xi, yi));
++count;
}
}
}
return convert_uchar4(sum/count);
}
MainActivity.java:
...
mRS = RenderScript.create(this);
mInAllocation = Allocation.createFromBitmap(mRS, mBitmapIn,
Allocation.MipmapControl.MIPMAP_NONE,
Allocation.USAGE_SCRIPT);
mOutAllocation = Allocation.createTyped(mRS, mInAllocation.getType());
mScript = new ScriptC_blur(mRS, getResources(), R.raw.blur);
mScript.set_in(mInAllocation);
mScript.set_width(mBitmapIn.getWidth());
mScript.set_height(mBitmapIn.getHeight());
mScript.forEach_root(mOutAllocation);
mOutAllocation.copyTo(mBitmapOut);
...