Android:在单独的EGL上下文中共享GLSurfaceViews之间的纹理

时间:2016-04-06 02:51:15

标签: java android opengl-es glsurfaceview egl

每个GLSurfaceViews都使用自己的EGLContext构建。在多个GL_TEXTURE_EXTERNAL_OES中使用相同的上下文来访问相同的纹理似乎不适用于所有GPU(如图here所示)。

我的问题是,是否有办法在多个GLSurfaceViews上使用默认的单独上下文共享GL_TEXTURE_EXTERNAL_OES纹理。默认情况下,只有创建GLSurfaceViews的线程才能访问纹理,但我正在寻找一种方法让其他线程在单独的EGL上下文中从这个纹理中读取,然后渲染到它们各自的{{ 1}}。

任何指导都将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

您无法在多个GLSurfaceView之间共享上下文,因为API无法提供这样做的方法。你可以尝试克服它,但这可能会以不愉快的方式打破。处理此问题的最佳方法是使用普通的SurfaceView。

请记住,GLSurfaceView只是一个带有一些辅助代码的SurfaceView,它可以管理线程和EGL上下文。如果你不介意写这个部分(或者只是从Grafika批量提取它),那么使用SurfaceView会更方便。

对于问题的其他部分,可以在EGL上下文中共享外部纹理,但这样做有风险。 Grafika"展示+捕捉相机" Activity与GLCurfaceView上下文共享为MediaCodec创建的第二个上下文,并从两者访问纹理。不幸的是,这样做不正确,导致竞争条件。 A bug report解释了问题和建议的解决方案,并且链接到EGL / GLES文档,指定单独线程上的多个上下文共享纹理时的行为。

FWIW,我还没有看到GPU所涉及的活动根本没有用,所以我不认为这是分享的根本问题。你只需要正确地做障碍。但是,使用单一上下文工作要容易得多。