Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Совместное использование EGLImage между различными приложениями/процессами в Embedded Linux/ARM

Автор вопроса: maddouriОтветов: 1

В настоящее время я разрабатываю некоторые приложения EGL 1.4/OpenGL ES 2.0 на C++ на платформе Embedded Linux/ARM, которая не имеет оконной системы.

По сути, я хочу поделиться текстурами/буферами рендеринга между независимыми приложениями - назовем их приложением "А" и приложением "Б".

Для этого я сначала подумал о загрузке буфера рендеринга с помощью glReadPixels() (из приложения A) в буфер, который находится в общей памяти, а затем открыть эту общую память из приложения B и загрузить буфер с помощью glTexImage2D() или glTexSubImage2D() .

После некоторого первоначального тестирования выяснилось, что это довольно неэффективный/медленный метод. Поэтому я решил использовать расширения платформы EGL/GLES, которые (как возвращаются eglQueryString() и glGetString()) включают:

  • EGL_KHR_image_base
  • EGL_KHR_image
  • EGL_KHR_gl_image
  • OES_EGL_image
  • OES_mapbuffer

Моя цель теперь состоит в том, чтобы создать EGLImage в приложении A (например, из текстуры GL, используя EGLImageKHR sharedEglImage = eglCreateImageKHR(dpy, ctx, EGL_GL_TEXTURE_2D_KHR, textureId, imageAttributes) ), а затем поделиться этим самым sharedEglImage с приложением B, чтобы его можно было отобразить как пиксельные данные одной из собственных текстур GL приложения B, используя glEGLImageTargetTexture2DOES() .

Однако, как и большинство абстракций EGL/GL, EGLImage является непрозрачной структурой (то есть просто void* ), не имеет смысла сопоставлять ее с разделяемой памятью, чтобы совместно использовать ее между процессами. Отсюда мой вопрос:

Есть ли способ поделиться EGLImage между независимыми процессами?

Спасибо !

c++embedded-linuxegl

Ответы

Ответ 1 · doron

На Android вам потребуется использовать Gralloc. . Память, выделенная Gralloc, может быть разделена между процессами, поскольку именно ее использует Surface Flinger.

Это связано с огромным предупреждением о здоровье, что эти API-интерфейсы являются частными для платформы и могут быть не переносимы между устройствами или версиями.

Изменить: ссылка на реализацию и, вероятно, не будет очень полезной.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы