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

0

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

В принципе, я хочу поделиться текстурами /renderbuffers между независимыми приложениями - позвоните им в приложение "A" и приложение "B".

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

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

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

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

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

Благодаря !

Теги:
embedded-linux
opengl-es-2.0
egl

1 ответ

0

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

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

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

  • 0
    Спасибо за Ваш ответ. Тем не менее, ОС представляет собой 32-битный ARM без X-Linux. Не Android.
  • 0
    К сожалению, вы обнаружите, что такие детали очень зависят от платформы. Лучше всего посмотреть, получите ли вы какую-либо документацию по реализации EGL. Или еще лучше, посмотрите на исходный код.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню