我在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;
}
}
但是我得到一个错误:
面向SDK级别11-22的计算内核copyPreviousZ()可能不使用特殊参数'z'。
还有其他方法可以解决此问题。我希望将此代码保留在renderscript层中(使用一些rsForEach*
替代方法);并避免重复整个3dAllocation
,因为这是非常繁重的分配,并且我只需要一个Z范围即可进行计算。