Можно ли использовать rsForEach в RenderScript для ядра без полномочий root?
Можно ли вызвать ядро RenderScript без полномочий root, используяrsForEach
? Есть много примеров использованияrsForEach
для вызова корневого ядра из вызываемой функции RenderScript:
Они связывают сам скрипт с переменной в контексте RenderScript, а затем вызывают корневое ядро из RenderScript. Например, вActivity
класс:
...
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();
...
И вgradient.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, ...
Но если у меня есть другое ядроgray
Могу ли я вызвать его послеroot
внутриgradient
?
// 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);
}
Нодокументация дляrsForEach
кажется, указывает на то, что он не поддерживает ничего подобного. Возможно, это можно сделать, установив что-то вrs_script_call_t
, нодокумент довольно кратко об этом типе: (Получено 20 сентября 2013 г.)
typedef struct rs_script_call rs_script_call_t**
Структура для предоставления дополнительной информации для вызова rsForEach. В основном используется для ограничения вызова подмножеством ячеек в распределении.
Этот вопрос в основном из любопытства - я ожидаю, что предпочтительным методом является вызов их из 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);
...
Кажется, они синхронизированы. Если кто-то определяетroot
а такжеgray
следующее:
void root(...) { rsDebug("root", 0,0); }
void gray(...) { rsDebug("gray", 1,1); }
потом звонюforEach_root
тогдаforEach_gray
заставляет «root, {0,0}» регистрироваться NxM раз, прежде чем он начнет регистрировать «grey, {1,1}» - хотя я не нашел документации, которая бы это гарантировала. Кто-нибудь знает, где это?