c++ - 在嵌入式 Linux/ARM 上的不同应用程序/进程之间共享 EGLImage

标签 c++ opengl-es-2.0 embedded-linux egl

我目前正在没有任何窗口系统的嵌入式 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/

相关文章:

c++ - 将值添加到 std::multimap

c - 打开(): Device or resource busy (/dev/rtc(x))

linux - 构建 SDK 时出现冲突请求错误

linux - PCI 驱动程序(request_mem_region 失败)

c++ - 用于使用 g++ 编译的 .vimrc 脚本

c++ - 我在 SFML sf::RenderWindow 中只有黑屏

c++ - 如何使 Angular 落正确显示(看里面的图片)?

android - 我可以选择我的 Android 应用程序在运行时使用的 OpenGL 版本吗?

android - Nexus S 中的 glError 1282 但 Nexus One 中没有

c - glTexImage2D,以随机和偶然的方式,在执行中花费了 800 倍以上