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