Kann man rsForEach von RenderScript auf einem Nicht-Root-Kernel verwenden?

Kann man einen Nicht-Root-RenderScript-Kernel mit aufrufenrsForEach? Es gibt viele AnwendungsbeispielersForEach So rufen Sie den Root-Kernel in einer aufrufbaren RenderScript-Funktion auf:

Dokumentation für Androids Renderscript erweitert den Aufruf rsForEachWie schreibe ich eine Faltungsmultiplikation in Android Renderscript?Übergabe des Arrays an rsForEach in Renderscript Compute

Diese binden das Skript selbst an eine Variable im RenderScript-Kontext und rufen dann den Root-Kernel in RenderScript auf. Zum Beispiel in derActivity Klasse:

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

Und ingradient.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, ...

Aber wenn ich einen anderen Kernel habegray könnte ich es später aufrufenroot, Innerhalbgradient?

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

Aberdie Dokumentation fürrsForEach scheint darauf hinzudeuten, dass es so etwas nicht unterstützt. Vielleicht kann dies erreicht werden, indem etwas in a gesetzt wirdrs_script_call_t, aberder Arzt ist ziemlich knapp über diesen Typ: (Abgerufen am 20. September 2013)

typedef struct rs_script_call rs_script_call_t**

Struktur zur Bereitstellung zusätzlicher Informationen für einen Aufruf von rsForEach. Wird hauptsächlich verwendet, um den Anruf auf eine Teilmenge der Zellen in der Zuordnung zu beschränken.

Diese Frage ist größtenteils aus Neugier - ich gehe davon aus, dass die bevorzugte Methode darin besteht, sie aus Java aufzurufen:

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

Diese scheinen synchronisiert zu sein. Wenn man definiertroot undgray wie folgt:

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

dann anrufenforEach_root dannforEach_gray bewirkt, dass "root, {0,0}" NxM-mal protokolliert wird, bevor die Protokollierung von "grey, {1,1}" beginnt. Ich habe jedoch keine Dokumentation gefunden, die dies garantiert. Weiß jemand wo das ist?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage