4

を使用して非ルート RenderScript カーネルを呼び出すことはできますrsForEachか? rsForEach呼び出し可能な RenderScript 関数内からルート カーネルを呼び出すために使用する多くの例があります。

これらはスクリプト自体を 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呼び出すことができますか?rootgradient

// 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);
...

これらは同期しているようです。rootandを次のように定義した場合gray:

void root(...) { rsDebug("root", 0,0);  }
void gray(...) { rsDebug("gray", 1,1);  }

forEach_root次に呼び出すと、 forEach_gray「root、{0,0}」がNxM回ログに記録されてから、「グレー、{1,1}」のログが開始されます-ただし、それを保証するドキュメントは見つかりませんでした。それがどこか知っている人はいますか?

4

1 に答える 1

4

残念ながら、スクリプトから rsForEach() を使用して非ルート RenderScript カーネルを呼び出す方法は現在ありません。Java から直接呼び出す必要があります。2 番目のカーネルを別のスクリプトに root() として配置し、その rs_script もバインドすることもできます (たとえば、gScriptGradient と gScriptGray を使用して、プライマリ スクリプトで 1 回の呼び出しから順番に実行できます)。

並列カーネル間の同期に関する 2 番目の質問を見逃していました。彼らは確かに注文されています。カーネルは非同期で起動されますが、2 番目のカーネルは最初のカーネルが完了するまで実行されません。

于 2013-09-20T21:16:02.490 に答える