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

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

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

Для этого я сначала подумал о загрузке буфера рендеринга с помощью 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 между независимыми процессами?

Спасибо !


person maddouri    schedule 19.06.2014    source источник


Ответы (1)


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

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

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

person doron    schedule 19.06.2014
comment
Спасибо за Ваш ответ. Однако ОС представляет собой 32-разрядный ARM Linux без X. Не Андроид. - person maddouri; 19.06.2014
comment
К сожалению, вы обнаружите, что такие детали очень зависят от платформы. Лучше всего посмотреть, есть ли у вас какая-либо документация по реализации EGL. Или еще лучше, взгляните на исходный код. - person doron; 19.06.2014
comment
Так как у меня нет доступа к такой документации (и уж тем более к исходникам). Я хотел бы знать, можно ли создать EGLImage из необработанного массива C? например вот так: const size_t bufferSize = width * height * bpp / 8; uint8_t rawBuffer[bufferSize]; EGLImage img = magicImageCreationFunction(rawBuffer, bufferSize); - person maddouri; 19.06.2014
comment
Нет. Чтобы получить доступ к памяти, память должна быть доступна для графического процессора. Это означает, что вы должны использовать специальный распределитель при выделении памяти. Память, выделенная процессором, не будет работать, поскольку графический процессор не может получить к ней доступ. Кроме того, выделенная процессором память видна только одному процессу. - person doron; 19.06.2014
comment
По крайней мере, возможно ли memcpy() (или другую эффективную функцию копирования) пиксельные данные EGLImage? (я не хочу использовать glReadPixels() ) - person maddouri; 20.06.2014
comment
Если у вас нет доступа к распределителю графики, вы не можете создать EGLImage, поэтому я думаю, что ответ отрицательный. Кроме того, glReadPixels будет работать так же быстро, как memcpy. Причина, по которой это происходит медленно, заключается в том, что glReadPixels копирует из некэшированной памяти, которая может даже не существовать в оперативной памяти системы (хотя на встроенном устройстве это, вероятно, существует). - person doron; 20.06.2014
comment
Я имел в виду: имея уже созданный EGLImage, есть ли альтернатива glReadPixels() для копирования пиксельных данных этого EGLImage, например, в массив C? Другими словами: как я могу получить указатель на пиксельные данные EGLImage? - person maddouri; 20.06.2014