Получение ANativeWindowBuffer из ANativeWindow_Buffer

110
18

Чтобы получить быстрый доступ к текстурным пикселям OpenGL ES 2.0 на Android NDK, я хочу использовать расширение eglCreateImageKHR().


В соответствии с EGL_NATIVE_BUFFER_ANDROID docs:


Это расширение позволяет использовать оконный буфер Android (struct      ANativeWindowBuffer) в качестве источника EGLImage.



ANativeWindowBuffer является внутренним struct, используемым встроенными классами инфраструктуры, такими как GraphicBuffer.
К сожалению, поскольку я нахожусь в NDK, у меня нет прямого доступа к этим классам.


Интерфейс NDK native_window позволяет передать объект Java Surface через NDK. Затем я могу использовать ANativeWindow_fromSurface() для получения непрозрачного дескриптора ANativeWindow*. С помощью этого указателя я могу вызвать ANativeWindow_lock(), чтобы заполнить структуру типа ANativeWindow_Buffer (Обратите внимание на _).


Если я пытаюсь использовать этот объект &ANativeWindow_Buffer с eglCreateImageKHR(), он терпит неудачу с EGL_BAD_NATIVE_WINDOW.


Мой вопрос: как я могу использовать ANativeWindow_Buffer с eglCreateImageKHR() или, альтернативно, как получить ANativeWindowBuffer из ANativeWindow_Buffer или из ANativeWindow*.

спросил(а) 2021-01-25T10:23:13+03:00 4 месяца, 2 недели назад
1
Решение
77

Из того, что я выяснил, идя по этой дороге, ANativeWindow_Buffer и ANativeWindowBuffer - совершенно разные типы. Ну, они несколько похожи, но определенно настолько различны, что их нельзя использовать взаимозаменяемо.


Если вы хотите сравнить, вот определения:


Вы заметите, что у них есть несколько общих полей (width, height, stride, format). Большая разница заключается в том, что ANativeWindow_Buffer содержит указатель на фактические данные, а ANativeWindowBuffer содержит непрозрачный дескриптор типа buffer_handle_t.


Итак, если вы узнали, как получить ANativeWindow_Buffer, и надеялись, что вы на пути к ANativeWindowBuffer, вы... вероятно, нет. По крайней мере, это был мой вывод. Я думаю, что очень похожие имена просто дразнят.


Я не нашел способ создать ANativeWindowBuffer из кода NDK. По крайней мере, используя только поддерживаемые API, я считаю, что это невозможно. Мои исследования были с KitKat.

ответил(а) 2021-01-25T10:23:13+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема