En Renderscript de Android, usar la estructura rs_script_call para restringir el rango de la asignación que se opera durante una llamada rsForEach

Utilizando el RenderScript de Android, estoy tratando de restringir el rango de la asignación que se opera durante una llamada rsForEach. De acuerdo con la documentación, puede lograr esto pasando una estructura rs_script_call, pero siempre que intento esto, la aplicación falla.

¿Cómo se configura correctamente la estructura rs_script_call y se pasa a la llamada rsForEach?

Estoy utilizando el ejemplo de HelloCompute RenderScript como base para el código. La versión mínima de Android sdk se establece en 15 y, por lo tanto, utiliza el rsForEach que toma 6 argumentos. Aquí está el mono.rs adaptado:

<code>#pragma version(1)
#pragma rs java_package_name(com.example.android.rs.hellocompute)

const static float3 gMonoMult = {0.299f, 0.587f, 0.114f};

void init() {
}

void root(const uchar4 *v_in, uchar4 *v_out) {
    float4 f4 = rsUnpackColor8888(*v_in);

    float3 mono = dot(f4.rgb, gMonoMult);
    *v_out = rsPackColorTo8888(mono);
}

void runRestricted(rs_script script, rs_allocation in_alloc, rs_allocation out_alloc) {
     struct rs_script_call restrict_for;
     restrict_for.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE;
     restrict_for.xStart = 0;
     restrict_for.xEnd = 16;
     restrict_for.yStart = 0;
     restrict_for.yEnd = 0;
     restrict_for.zStart = 0;
     restrict_for.zEnd = 0;
     restrict_for.arrayStart = 0;
     restrict_for.arrayEnd = 0;
     rsForEach(script, in_alloc, out_alloc, NULL, 0, &restrict_for);
     //rsForEach(script, in_alloc, out_alloc);
}
</code>

Llamado desde el siguiente Java:

<code>mRS = RenderScript.create(this);

mInAllocation = Allocation.createFromBitmap(mRS, mBitmapIn,
                                                Allocation.MipmapControl.MIPMAP_NONE,
                                                Allocation.USAGE_SCRIPT);
mOutAllocation = Allocation.createTyped(mRS, mInAllocation.getType());

mScript = new ScriptC_mono(mRS, getResources(), R.raw.mono);

//mScript.forEach_root(mInAllocation, mOutAllocation);
mScript.invoke_runRestricted(mScript, mInAllocation, mOutAllocation);
mOutAllocation.copyTo(mBitmapOut);
</code>

Aquí está parte del registro de la aplicación que se ejecuta en un Nexus S con Android 4.0.4:

<code>04-12 00:27:25.632: V/RenderScript(18747): rsContextCreate dev=0x18798c0
04-12 00:27:25.636: V/RenderScript(18747): 0x183b6a0 Launching thread(s), CPUs 1
04-12 00:27:25.656: V/ScriptC(18747): Create script for resource = mono
04-12 00:27:25.656: I/bcc(18747): LIBBCC build time: 2012/03/25 20:11:25
04-12 00:27:25.656: I/bcc(18747): LIBBCC build revision: 31e50d678d2a8aa28c6f38cccebfa3da2f78df4a (git)
04-12 00:27:25.675: D/StopWatch(18747): StopWatch calcFileSHA1 time (us): 17709 
04-12 00:27:25.679: D/StopWatch(18747): StopWatch calcFileSHA1 time (us): 2350 
04-12 00:27:25.679: D/bcc(18747): Read object file size 1020
04-12 00:27:25.679: E/RenderScript(18747): ScriptC sym lookup failed for _Z9rsForEach9rs_script13rs_allocationS0_PKvjPK14rs_script_call
04-12 00:27:25.679: E/bcc(18747): Unable to resolve symbol: _Z9rsForEach9rs_script13rs_allocationS0_PKvjPK14rs_script_call
04-12 00:27:25.679: D/StopWatch(18747): StopWatch bcc: PrepareExecutable time (us): 1284 
04-12 00:27:25.679: E/bcc(18747): Symbol not found: .rs.dtor
04-12 00:27:25.683: A/libc(18747): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)
</code>

Respuestas a la pregunta(0)

Su respuesta a la pregunta