我在 Android 4.2 版上使用 RenderScript。我试图用“Allocation.USAGE_IO_INPUT”标志创建一个 RenderScript 分配。根据文档,如果设置了“Allocation.USAGE_IO_INPUT”,则Allocation将用作SurfaceTexture消费者,并且成员函数“getSurface()”也有效。但是,当我调用 getSurface() 函数时,总是会收到以下错误消息。
E/libEGL(31656): call to OpenGL ES API with no current context (logged once per thread)
我google了一下,发现大多数人都说这样的错误消息是由在GL线程之外调用OpenGL ES API引起的。所以我尝试使用我发现的以下两种方法。
- 从 GLSurfaceView 的 onSurfaceCreated() 调用 getSurface() 函数,因为它是在 GL 线程中调用的
- 使用 GLSurfaceView 的 queueEvent 让代码在 GL 线程中被调用(这里描述:OpenGL ES API error (no context))
然而,这两次尝试都失败了。
尽管该程序并未因此错误提示而崩溃并且确实返回了一些表面。在调用 Allocation.ioReceive() 函数时,我遇到了与使用相机预览填充的 SurfaceTexture 作为 Renderscript input Allocation in Jelly Bean相同的问题。调用 ioReceive() 时收到的错误消息是
E/SurfaceTexture(32208): [unnamed-32208-2] updateTexImage: invalid current EGLDisplay
所以,我想知道在 RenderScript 中使用 USAGE_IO_INPUT 分配的正确方法是什么?非常感谢您提前。