Czy można użyć rsForEach RenderScript na jądrze innym niż root?
Czy można wywołać jądro inne niż root RenderScript używającrsForEach
? Istnieje wiele przykładów użyciarsForEach
wywołać jądro root z wewnątrz wywołanej funkcji RenderScript:
Łączą one sam skrypt ze zmienną w kontekście RenderScript, a następnie wywołują jądro root z poziomu RenderScript. Na przykład wActivity
klasa:
...
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();
...
I wgradient.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, ...
Ale jeśli mam inne jądrogray
czy mogę to odwołać po tymroot
, wewnątrzgradient
?
// 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);
}
Aledokumentacja dlarsForEach
wydaje się wskazywać, że nie obsługuje niczego takiego. Być może można to osiągnąć, ustawiając coś wrs_script_call_t
, aledoc jest raczej zwięzły na temat tego typu: (Źródło: 20 września 2013 r.)
typedef struct rs_script_call rs_script_call_t**
Struktura zapewniająca dodatkowe informacje do wywołania rsForEach. Służy przede wszystkim do ograniczenia połączenia do podzbioru komórek w alokacji.
To pytanie jest głównie z ciekawości - oczekuję, że preferowaną metodą jest wywołanie ich z Javy:
...
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);
...
Te wydają się być zsynchronizowane. Jeśli się definiujeroot
igray
następująco:
void root(...) { rsDebug("root", 0,0); }
void gray(...) { rsDebug("gray", 1,1); }
potem dzwonięforEach_root
następnieforEach_gray
powoduje, że „root, {0,0}” jest rejestrowany razy NxM zanim zacznie rejestrować „szary, {1,1}” - nie znalazłem jednak dokumentacji, która to gwarantuje. Ktoś wie, gdzie to jest?