如何使用Z范围复制Android renderscript分配数据?

时间:2019-03-11 18:38:56

标签: android renderscript android-renderscript

我在renderscriptTargetApi 18上将renderscriptSupportModeEnabled trueminSdkVersion 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;
    }  
}

但是我得到一个错误:

  

面向SDK级别11-22的计算内核copyPreviousZ()可能不使用特殊参数'z'。

还有其他方法可以解决此问题。我希望将此代码保留在renderscript层中(使用一些rsForEach*替代方法);并避免重复整个3dAllocation,因为这是非常繁重的分配,并且我只需要一个Z范围即可进行计算。

0 个答案:

没有答案