Alguém pode usar o rsForEach do RenderScript em um kernel não-root?
Alguém pode invocar um kernel RenderScript não-root usandorsForEach
? Existem muitos exemplos de usorsForEach
para chamar o kernel raiz de dentro de uma função RenderScript invokable:
Estes ligam o próprio script a uma variável no contexto RenderScript, depois invocam o kernel raiz a partir do RenderScript. Por exemplo, noActivity
classe:
...
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();
...
E emgradient.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, ...
Mas se eu tiver outro kernelgray
poderia invocá-lo depoisroot
, 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);
}
Masa documentação pararsForEach
parece indicar que não suporta nada como isto. Talvez isso possa ser feito colocando algo em umrs_script_call_t
, maso doc é bastante conciso sobre esse tipo: (Retirado 20 de setembro de 2013)
typedef struct rs_script_call rs_script_call_t**
Estrutura para fornecer informações extras para uma chamada rsForEach. Usado principalmente para restringir a chamada a um subconjunto de células na alocação.
Esta questão é principalmente por curiosidade, espero que o método preferido é chamá-los de 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);
...
Estes parecem estar sincronizados. Se alguém defineroot
egray
do seguinte modo:
void root(...) { rsDebug("root", 0,0); }
void gray(...) { rsDebug("gray", 1,1); }
então chamandoforEach_root
entãoforEach_gray
faz com que "root, {0,0}" seja registrado NxM vezes antes de iniciar o registro "gray, {1,1}" - Eu não encontrei documentação que garanta isso, no entanto. Alguém sabe onde é isso?