Как скопировать данные размещения Android-рендеринга с использованием диапазона Z - PullRequest
0 голосов
/ 11 марта 2019

Я использую renderscriptTargetApi 18 с renderscriptSupportModeEnabled true на minSdkVersion 21. Я создаю распределение с 3 измерениями:

import androidx.renderscript.RenderScript
val 3dAllocation = Allocation.createTyped(rs, Type.createXYZ(rs, Element.U16(rs), 1000, 1000, 100))

Я хочу скопировать данные из плоскости (x, y, z) в плоскость (x, y, z + 1), основываясь на некоторых условиях. Поскольку rsForEachWithOptions недоступен до API 24, я должен использовать Kotlin для запуска скрипта, который выполняется только в одном Z-индексе:

val opts = Script.LaunchOptions().apply {
            setX(0, 1000)
            setY(0, 1000)
            setZ(1, 1)
        }
script.forEach_copyPreviousZ(3dAllocation, 3dAllocation, opts)

Следующий скрипт - это то, что могло бы сделать то, что я хочу, но это не скомпилируется:

rs_allocation 3dAllocation;
ushort RS_KERNEL copyPreviousZ(ushort in, uint32_t x, uint32_t y, uint32_t z){
    if(someCondition){
        return rsGetElementAt_ushort(z-1);
    } else {
        return in;
    }  
}

Но я получаю ошибку:

вычисление ядра copyPreviousZ () для уровней SDK 11-22 может не использовать специальный параметр 'z'.

Есть ли другой способ решения этой проблемы? Я бы предпочел оставить этот код на уровне рендеринга (используя некоторую альтернативу rsForEach*); и избегайте повторения всего 3dAllocation, так как это очень тяжелое распределение, и мне нужен только один диапазон Z для вычисления.

...