ドキュメントは見つかりませんでしたが、これまでに調査した内容について役立つ情報を提供できるかもしれません。
- ポインタは利用できません
- カーネル関数にはこの属性が必要
__attribute__((kernel))
です
- Renderscript APIを使用できます (少なくとも、これまでに試したことはすべて機能していました)
- AndroidManifest.xml で属性「Min SDK version」を「17」に設定する必要があります -> 「Uses Sdk」
llvm-rs-cc コンパイラのソースを読んでいるときに、次の情報のほとんどを発見しました。さらなる情報や Filterscript の実際のドキュメントへのリンクをいただければ幸いです。
出力割り当て
Filterscript には、出力割り当て用のパラメーターがありません。代わりに、現在の位置に書き込む値を返します (これはグローバル スレッド ID ですx
) 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);
...