Ответ 1
Я не нашел никакой документации, но, возможно, я могу дать вам полезную информацию о том, что я исследовал до сих пор:
- Указатели недоступны
- Функции ядра нуждаются в атрибуте
__attribute__((kernel))
, иначе компилятор сходит с ума и ожидает типы указателей, которые являются незаконными - Renderscript API может использоваться (по крайней мере, все, что я пробовал до сих пор работало)
- Атрибут "Минимальная версия SDK" должен быть установлен в "17" в AndroidManifest.xml → "Uss Sdk"
Я обнаружил большую часть следующей информации при чтении источников компилятора llvm-rs-cc. Любая дополнительная информация или ссылка на настоящую документацию для Filterscript оценили бы!
Выделение вывода
В Filterscript у вас нет параметра для выделения вывода. Вместо этого вы возвращаете значение для записи в текущей позиции (это глобальный идентификатор потока x
и y
):
uchar4 __attribute__((kernel)) root(uint32_t x, uint32_t y)
генерируется в:
public void forEach_root(Allocation aout)
Распределение ввода
Вы можете по желанию передать распределение ввода в качестве параметра:
uchar4 __attribute__((kernel)) root(const uchar4 in, uint32_t x, uint32_t y)
генерируется в:
public void forEach_root(Allocation ain, Allocation aout)
Это полезно только в редких случаях (например, операторы точек), поскольку вы можете получить доступ к распределению ввода только в текущей позиции.
Глобальное распределение
Если вы хотите сделать произвольный доступ при распределении входных данных, то вам понадобятся глобальные распределения. Вот небольшой пример оператора окна, использующего глобальное распределение, которое работает для меня.
blur.fs:
#pragma version(1)
#pragma rs java_package_name(com.example.myproject)
rs_allocation in;
uint32_t width;
uint32_t height;
uchar4 __attribute__((kernel)) root(uint32_t x, uint32_t y) {
uint4 sum = 0;
uint count = 0;
for (int yi = y-1; yi <= y+1; ++yi) {
for (int xi = x-1; xi <= x+1; ++xi) {
if (xi >= 0 && xi < width && yi >= 0 && yi < height) {
sum += convert_uint4(rsGetElementAt_uchar4(in, xi, yi));
++count;
}
}
}
return convert_uchar4(sum/count);
}
MainActivity.java:
...
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_blur(mRS, getResources(), R.raw.blur);
mScript.set_in(mInAllocation);
mScript.set_width(mBitmapIn.getWidth());
mScript.set_height(mBitmapIn.getHeight());
mScript.forEach_root(mOutAllocation);
mOutAllocation.copyTo(mBitmapOut);
...