可以使用rsForEach
调用非root RenderScript内核吗?
有许多使用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
我可以在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);
}
但是the documentation for rsForEach
似乎表明它不支持这样的事情。也许可以通过设置rs_script_call_t
中的内容来完成,但the doc对此类型的描述相当简洁:( 2013年9月20日检索)
typedef struct rs_script_call rs_script_call_t**
为rsForEach调用提供额外信息的结构。 Primarly用于限制对分配中的一部分单元格的调用。
这个问题主要是出于好奇 - 我希望首选方法是从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
和gray
如下:
void root(...) { rsDebug("root", 0,0); }
void gray(...) { rsDebug("gray", 1,1); }
然后调用forEach_root
然后forEach_gray
会导致“root,{0,0}”在开始记录“灰色,{1,1}”之前被记录NxM次 - 我还没找到但是,保证这一点的文件。谁知道那是哪里?
答案 0 :(得分:4)
不幸的是,我们没有办法从脚本中使用rsForEach()来调用非根RenderScript内核。您将不得不直接从Java调用它。您还可以将第二个内核放在另一个脚本中作为root(),然后绑定该rs_script(例如,您可以使用gScriptGradient和gScriptGray并从主脚本中的单个调用中按顺序执行它们。)
我最初错过了关于并行内核之间同步的第二个问题。他们确实是有序的。虽然内核是异步启动的,但第二个内核在第一个内核完成之前不会运行。