При работе с 3D RenderScript Allocation атрибут z недоступен

Фон

Я пытаюсь использовать RenderScript для выполнения некоторых действий в 3D-распределении.

Здесь я создаю распределение:

 Type.Builder analyzer3DType = new Type.Builder(rsAnalyzer, Element.U8(rsAnalyzer))
      .setX(allocationSize.getWidth() - allocationPadding * 2)
      .setY(allocationSize.getHeight() - allocationPadding * 2)
      .setZ(framesNumber);

 analyzer3DAllocation = Allocation.createTyped(rsAnalyzer, analyzer3DType.create(), Allocation.USAGE_SCRIPT);

затем настройте сторону Java и запустите ядро:

ScriptC_analyze rsAnalyze = new ScriptC_analyze(rsAnalyzer);
rsAnalyze.forEach_root(analyzer3DAllocation);

и вот как выглядит ядро:

void RS_KERNEL root(uchar in, uint32_t x, uint32_t y, uint32_t z) {
   // Do something.
}

Обратите внимание, что мне нужны два разных контекста RenderScript для параллельного выполнения, поэтому я создаю объект RenderScript:

rsAnalyzer = RenderScript.createMultiContext(context, RenderScript.ContextType.NORMAL, RenderScript.CREATE_FLAG_NONE, 23);

проблема

Я получаю эту ошибку во время выполнения:

W / Adreno-RS: rsdSetupInputOutputAttributes:2051: неверное число входных аргументов, ожидаемое:2 фактических 1

W / Adreno-RS: rsdScriptInvokeForEach:2511: ошибка из rsdSetupInputOutputAttributes -30

Проблема исчезнет, ​​если я не вставлю атрибут z в корневое ядро. Кажется, что атрибут z не распознается как специальный атрибут.

Я нацеливаюсь на API 23, и этот специальный атрибут должен поддерживаться. Из документов:

Функция ядра отображения или функция накопления ядра восстановления может получить доступ к координатам текущего выполнения, используя специальные аргументы x, y и z, которые должны иметь тип int или uint32_t. Эти аргументы являются необязательными.

Какие доступные функции ядра вы можете создать в Renderscript? 7 октября 2015 года Стивен Хайнс пишет:

Единственными автоматически заполненными параметрами являются x, y (и, возможно, z в Android M).

Я не совсем уверен, что атрибут z поддерживается на уровне API 23, но по крайней мере Android Studio так считает.

Вопросы

  1. Я делаю что-то неправильно? Есть ли способ использовать атрибут z в ядре на уровне API 23?
  2. Если нет, что может быть лучшим способом реализовать это, если мне нужно перебирать элементы не только по осям x и y, но и вдоль z?

Спасибо заранее за вашу помощь.

Дополнительная информация

Это часть моего приложения build.gradle:

android {
compileSdkVersion 25
buildToolsVersion "25.0.2"

defaultConfig {
    minSdkVersion 23
    targetSdkVersion 23
    renderscriptTargetApi 23
}

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

1 ответ

Решение

Так как я получаю сообщение об ошибке:

Ошибка из rsdSetupInputOutputAttributes -30

Я считал само собой разумеющимся, что ядро ​​не работает, но работает правильно, специальный атрибут z доступен и правильно заполнен.

Кроме того, я попробовал одно и то же приложение на другом устройстве с той же версией ОС (Huawei P9), и оно не выдает никакой ошибки. Похоже, что это официальное обновление ОС для LG G4, выпущенное оператором TIM в конце 2016 года, имеет частично ошибочную реализацию RenderScript.

Другие вопросы по тегам