2016-04-06 7 views
1

Каждый GLSurfaceView построен с собственным EGLContext. Использование одного и того же контекста для нескольких GLSurfaceViews, чтобы иметь доступ к тем же текстурам, похоже, не работает на всех графических процессорах (как показано на рисунке here).Android: Поделитесь текстурой между GLSurfaceViews в отдельных контекстах EGL

Мой вопрос заключается в том, есть ли способ разделить текстуру GL_TEXTURE_EXTERNAL_OES на несколько GLSurfaceViews с их раздельными контекстами. По умолчанию только поток, который создает GL_TEXTURE_EXTERNAL_OES, сможет получить доступ к текстуре, но я ищу способ разрешить другим потокам в отдельных контекстах EGL читать эту текстуру, а затем отображать их отдельные GLSurfaceViews.

Любое руководство будет оценено по достоинству. Спасибо.

ответ

1

Вы не можете обмениваться контекстами между несколькими GLSurfaceViews, потому что API не предоставляет способ сделать это. Вы можете попробовать это, но это, вероятно, будет неприятно. Лучший способ справиться с этим - использовать простой SurfaceView.

Имейте в виду, что GLSurfaceView представляет собой просто SurfaceView с некоторым вспомогательным кодом, который управляет потоками и контекстами EGL. Если вы не возражаете писать эту часть (или просто снимаете ее оптом из Grafika), ее можно будет гораздо удобнее работать с SurfaceView.

К другой части вашего вопроса можно поделиться внешней текстурой в контекстах EGL, но это рискованно. В программе «show + capture camera» Grafika используется контекст GLSurfaceView со вторым контекстом, созданным для MediaCodec, и обращается к текстуре из обоих. К сожалению, он делает это неправильно, что приводит к состоянию гонки. A bug report объясняет проблему и предлагаемое решение и имеет ссылки на документы EGL/GLES, которые определяют поведение, когда несколько контекстов на отдельных потоках совместно используют текстуру.

FWIW, я не видел GPU, где рассматриваемая деятельность просто не работала, поэтому я не думаю, что существует фундаментальная проблема с совместным использованием. Вы просто должны сделать барьеры правильно. Однако гораздо проще работать с одним контекстом.

+0

Удивительный, спасибо Fadden! Сначала я пытался использовать «GLSurfaceViews», но код был действительно запутанным, поскольку для этого нет встроенной поддержки API. Я продолжу обычный подход SurfaceView. Кстати, знаете ли вы о каких-либо проектах с открытым исходным кодом, которые делают что-то подобное (т. Е. Создают EGLContext с orindary SurfaceView)? Кажется, что наиболее похожая Grafika предлагает https://github.com/google/grafika/blob/master/src/com/android/grafika/HardwareScalerActivity.java – Michael

+0

У Grafika много действий, которые отображаются на SurfaceView с помощью GLES. Я бы рекомендовал просто снять весь пакет com.android.grafika.gles; если вы работаете с внешними текстурами, вам, вероятно, понадобятся и некоторые другие биты. Другие примеры - «текстура с камеры» и «запись приложения GL». – fadden