を使用して非ルート RenderScript カーネルを呼び出すことはできますrsForEach
か? rsForEach
呼び出し可能な RenderScript 関数内からルート カーネルを呼び出すために使用する多くの例があります。
- Android Renderscript の高度な rsForEach 呼び出しに関するドキュメント
- Android Renderscriptで畳み込み乗算を作成するには?
- Renderscript Compute で rsForEach に配列を渡す
これらはスクリプト自体を RenderScript コンテキストの変数にバインドし、RenderScript 内からルート カーネルを呼び出します。たとえば、Activity
クラスでは次のようになります。
...
mScript = new ScriptC_gradient(mRS);
// bind Allocations and mScript to variables in the RenderScript context:
mScript.set_gIn(mImageAllocation);
mScript.set_gOut(mGradientAllocation);
mScript.set_gScript(mScript);
// invoke gradient function:
mScript.invoke_gradient();
...
そしてでgradient.rs
:
#pragma version(1)
#pragma rs java_package_name(com.example.android.rs.hellocompute)
rs_allocation gOut;
rs_allocation gIn;
rs_script gScript;
void gradient() {
rsForEach(gScript, gIn, gOut);
}
void root(const uchar4 *v_in, uchar4 *v_out, ...
しかし、別のカーネルがある場合、後で、内部でgray
呼び出すことができますか?root
gradient
// I thought it would look like this:
void gradient() {
rsForEach(gScript, gIn, gOut);
rsForEach(gScript, gIn, gOut, NULL, NULL, gExportForEachIdx_gray);
}
// Or:
void gradient() {
rsForEach(gScript, gIn, gOut);
rsSetMainKernel(&gScript, "gray");
rsForEach(gScript, gIn, gOut);
}
しかし、のドキュメントは、rsForEach
このようなものをサポートしていないことを示しているようです。おそらく、何かを ars_script_call_t
に設定することで実現できますが、ドキュメントはそのタイプについてかなり簡潔です: (2013 年 9 月 20 日に取得)
typedef struct rs_script_call rs_script_call_t**
追加情報を rsForEach 呼び出しに提供する構造。主に、割り当て内のセルのサブセットへの呼び出しを制限するために使用されます。
この質問はほとんど好奇心からです-推奨される方法はJavaからそれらを呼び出すことだと思います:
...
mScript = new ScriptC_gradient(mRS);
// bind Allocations and mScript to variables in the RenderScript context:
mScript.forEach_root(mImageAllocation, mGradientAllocation);
mScript.forEach_gray(mGradientAllocation, mGrayGradientAllocation);
...
これらは同期しているようです。root
andを次のように定義した場合gray
:
void root(...) { rsDebug("root", 0,0); }
void gray(...) { rsDebug("gray", 1,1); }
forEach_root
次に呼び出すと、 forEach_gray
「root、{0,0}」がNxM回ログに記録されてから、「グレー、{1,1}」のログが開始されます-ただし、それを保証するドキュメントは見つかりませんでした。それがどこか知っている人はいますか?