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

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

По сути, я хочу разделить текстуры / рендер-буферы между независимыми приложениями — давайте назовем их приложением «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, чтобы его можно было отобразить как данные пикселей одной из собственных текстур GL приложения B, используя glEGLImageTargetTexture2DOES() ,

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

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

Спасибо !

0

Решение

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

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

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

0

Другие решения


По вопросам рекламы [email protected]