¿Se puede usar rsForEach de RenderScript en un kernel no root?
¿Se puede invocar un kernel RenderScript no root usandorsForEach
? Hay muchos ejemplos de usorsForEach
para llamar al núcleo desde una función de RenderScript invocable:
Estos enlazan el script a una variable en el contexto de RenderScript, luego invocan el núcleo raíz desde dentro de RenderScript. Por ejemplo, en elActivity
clase:
...
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();
...
Y engradient.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, ...
Pero si tengo otro núcleo.gray
podria invocarlo despuesroot
, dentrogradient
?
// 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);
}
Perola documentación pararsForEach
Parece indicar que no soporta nada como esto. Tal vez se pueda lograr poniendo algo en unars_script_call_t
, peroEl documento es bastante conciso acerca de ese tipo: (Consultado el 20 de septiembre de 2013)
typedef struct rs_script_call rs_script_call_t**
Estructura para proporcionar información adicional a una llamada rsForEach. Se utiliza principalmente para restringir la llamada a un subconjunto de celdas en la asignación.
Esta pregunta es en su mayoría por curiosidad, espero que el método preferido sea llamarlos desde 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);
...
Estos parecen estar sincronizados. Si se defineroot
ygray
como sigue:
void root(...) { rsDebug("root", 0,0); }
void gray(...) { rsDebug("gray", 1,1); }
entonces llamandoforEach_root
entoncesforEach_gray
hace que "raíz, {0,0}" se registre NxM veces antes de que comience a registrarse "gris, {1,1}". Sin embargo, no he encontrado documentación que garantice eso. ¿Alguien sabe dónde está?