我目前正在没有任何窗口系统的嵌入式 Linux/ARM 平台上用 C++ 设计一些 EGL 1.4/OpenGL ES 2.0 应用程序。
基本上,我想在独立的应用程序之间共享纹理/渲染缓冲区——我们称它们为应用程序“A”和应用程序“B”。
为此,我首先想到使用 glReadPixels()
(来自应用程序 A)在共享内存中的缓冲区中下载渲染缓冲区,然后从应用程序 B 打开此共享内存并上传使用 glTexImage2D()
或 glTexSubImage2D()
的缓冲区。
经过一些初步测试,事实证明这是一种非常低效/缓慢的方法。所以我决定使用该平台的 EGL/GLES 扩展(由 eglQueryString()
和 glGetString()
返回)包括:
我现在的目标是在应用程序 A 中创建一个 EGLImage
(例如,使用 EGLImageKHR sharedEglImage = eglCreateImageKHR(dpy, ctx, EGL_GL_TEXTURE_2D_KHR, textureId, imageAttributes)
) 然后与应用程序 B 共享这个非常 sharedEglImage
,这样它就可以使用 glEGLImageTargetTexture2DOES()
映射为应用程序 B 自己的 GL 纹理之一的像素数据。
然而,与大多数 EGL/GL 抽象一样,EGLImage
是一个不透明的结构(即只是一个 void*
),将它映射到共享内存,以便跨进程共享它。因此我的问题:
有没有办法跨独立进程共享 EGLImage?
谢谢!
最佳答案
在 Android 上,您需要使用 Gralloc . Gralloc 分配的内存可跨进程共享,因为这是 Surface Flinger 使用的内存。
这确实带有一个巨大的健康警告,即这些 API 是平台私有(private)的,可能无法在设备或版本之间移植。
编辑:链接指向一个实现,可能不会很有帮助。
关于c++ - 在嵌入式 Linux/ARM 上的不同应用程序/进程之间共享 EGLImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24304953/