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

Android: Share a Texture Between GLSurfaceViews in Separate EGL Contexts

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

我的问题是是否有一种方法可以在多个 GLSurfaceViews 之间共享 GL_TEXTURE_EXTERNAL_OES 纹理及其默认的独立上下文。默认情况下,只有创建 GL_TEXTURE_EXTERNAL_OES 的线程才能访问纹理,但我正在寻找一种方法让单独的 EGL 上下文中的其他线程从此纹理读取,然后渲染到它们单独的 GLSurfaceViews.

如有任何指导,我们将不胜感激。谢谢。

您不能在多个 GLSurfaceView 之间共享上下文,因为 API 没有提供这样做的方法。您可以尝试 kluge 它,但这可能会以令人不快的方式中断。处理这个问题的最佳方法是使用普通的 SurfaceView。

请记住,GLSurfaceView 只是一个带有一些管理线程和 EGL 上下文的辅助代码的 SurfaceView。如果您不介意编写该部分(或者只是将其从 Grafika 中完全提取出来),那么使用 SurfaceView 会更加方便。

对于您问题的另一部分,可以跨 EGL 上下文共享外部纹理,但这有风险。 Grafika 的 "show + capture camera" Activity 与为 MediaCodec 创建的第二个上下文共享一个 GLSurfaceView 上下文,并从两者访问纹理。不幸的是,它做错了,导致了竞争条件。 A bug report 解释了问题和建议的解决方案,并提供了指向 EGL/GLES 文档的链接,这些文档指定了当不同线程上的多个上下文共享一个纹理时的行为。

FWIW,我还没有看到有问题的 Activity 根本不起作用的 GPU,所以我认为共享没有根本问题。您只需要正确设置障碍即可。不过,使用单个上下文要容易得多。