В настоящее время я разрабатываю некоторые приложения 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 между независимыми процессами?
Спасибо !
На Android вам нужно будет использовать Gralloc. Распределенная память Gralloc разделяется между процессами, так как именно это использует Surface Flinger.
Это сопровождается серьезным предупреждением о том, что эти API-интерфейсы являются частными для платформы и могут не переноситься между устройствами или версиями.
Изменить: ссылка на реализацию и, вероятно, не будет очень полезно.