处理3D RenderScript分配时,z属性不可用

时间:2017-02-01 17:57:08

标签: java android c99 renderscript android-renderscript

背景

我正在尝试使用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类型。这些参数是可选的。

2015年10月7日在What are the available kernel-functions that you can create on Renderscript?中,Stephen Hines写道:

  

唯一自动填充的参数是x,y,(在Android M中可能是z)。

我不完全确定API级别23支持z属性,但至少Android Studio是这样认为的。

问题

  1. 我做错了什么?有没有办法在API级别23的内核中使用z属性?
  2. 如果没有,如果我需要迭代不仅在x和y轴上的元素而且还在z上迭代元素,那么实现这个的最佳方法是什么?
  3. 提前感谢您的帮助。

    其他信息

    这是我的Application 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 个答案:

答案 0 :(得分:0)

因为我收到了错误消息:

  

rsdSetupInputOutputAttributes -30

的错误

我理所当然地认为内核无法正常工作,但是它可以正常工作,特殊属性z可用并正确填充。

最重要的是,我在具有相同操作系统版本(华为P9)的不同设备上尝试了相同的应用程序,并且它没有给出任何错误。似乎这个由LG运营商在2016年末推出的LG G4官方操作系统更新,有一个部分有缺陷的RenderScript实现。