Подтвердить что ты не робот

Где документация filtercript (и как я могу ее использовать)?

Когда Jelly Bean 4.2 был анонсирован месяц назад, также был анонсирован Filterscript. Это, по-видимому, язык, который является индексом Renderscript с другим расширением файла. И это обо всем, что я знаю о языке.

Я прочитал два общих абзаца, которые существуют о Filterscript во всем Интернете, и создал небольшой файл .fs с pragma rs_fp_relaxed, но он не получает сборщиков ADT, как обычный файл .rs. в том же месте.

My ADT - это последняя общедоступная версия (21.0.0), которая кажется слишком низкой для Filterscript. tools.android.com, похоже, имеет 21.0.1 Preview, но в примечаниях к выпуску нет упоминания о Filterscript (на самом деле это просто релиз исправления), Там просто нет документации!

Как я могу использовать Filterscript? Где его документация?

Что я пробовал:

https://www.google.com/search?q=filterscript+site:android.com&tbs=li:1

http://developer.android.com/about/versions/android-4.2.html#Renderscript

http://developer.android.com/tools/sdk/eclipse-adt.html#notes

http://tools.android.com/recent/2101preview1

4b9b3361

Ответ 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);
...

Ответ 2

Пара здесь:

  • Да, мы отстаем от документов. Мы знаем, мы были заняты. Это в моей повестке дня относительно относительно будущего.

  • FS предназначен как более ограничительный вариант RS, который обеспечивает дополнительные возможности оптимизации для компилятора. Сегодня у нас нет каких-либо из наших базовых ресурсов процессора, которые недоступны из эквивалентных файлов RS, но возможно, что OEM может повысить производительность своих SoC с файлами FS по сравнению с типичными RS файлами. В общем случае для этого требуется __attribute__((kernel)), никаких указателей и никаких объединений, а fp_relaxed подразумевается типом файла.

  • API-интерфейс хоста полностью идентичен; единственная разница в том, что мы фактически передаем как двоичные файлы ядра.

Некоторые незначительные исправления top ответ:

  • Вы должны использовать rsGetElementAt_ (тип). Это значительно чище, чем rsGetElementAt, потому что вам не нужны кастинг или дополнительные разыменование или что-то в этом роде.
  • #pragma fp_relaxed подразумевается из расширения .fs и не требуется в файлах FS.
  • Вам не нужно включать rs_allocation.rsh(это подразумевается также для всех файлов RS/FS).