При работе с 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 так считает.
Вопросы
- Я делаю что-то неправильно? Есть ли способ использовать атрибут z в ядре на уровне API 23?
- Если нет, что может быть лучшим способом реализовать это, если мне нужно перебирать элементы не только по осям 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.