其他分享
首页 > 其他分享> > android – 可以在非root内核上使用RenderScript的rsForEach吗?

android – 可以在非root内核上使用RenderScript的rsForEach吗?

作者:互联网

可以使用rsForEach调用非根RenderScript内核吗?
有许多使用rsForEach从可调用的RenderScript函数中调用根内核的示例:

> Documentation for Androids Renderscript advanced rsForEach call
> How to write a convolution multiplication in Android Renderscript?
> Passing Array to rsForEach in Renderscript Compute

这些将脚本本身绑定到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, ...

但如果我有另一个内核灰色我可以在root之后调用它,在渐变内吗?

// 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日)

06003

Structure to provide extra information to a rsForEach call. Primarly used to restrict the call to a subset of cells in the allocation.

这个问题主要是出于好奇 – 我希望首选方法是从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}”被记录NxM次,然后才开始记录“gray,{1,1}” – 我还没有找到保证这一点的文档.谁知道那是哪里?

解决方法:

不幸的是,我们没有办法使用脚本中的rsForEach()来调用非root的RenderScript内核.您将不得不直接从Java调用它.您还可以将第二个内核作为root()放在另一个脚本中,然后绑定该rs_script(例如,您可以使用gScriptGradient和gScriptGray并从主脚本中的单个调用中按顺序执行它们).

我最初错过了关于并行内核之间同步的第二个问题.他们确实是有序的.虽然内核是异步启动的,但第二个内核在第一个内核完成之前不会运行.

标签:android,renderscript
来源: https://codeday.me/bug/20190624/1282258.html