Android — Использование GraphicBuffers для быстрого чтения из текстуры

Я работаю над кодом, который выполняет код GPGPU на Android с помощью шейдеров. Обычно Framebuffer используется таким образом, что результат вычисления сохраняется в текстуре. Также входными данными обычно является текстура. Чтобы улучшить производительность, было бы здорово избавиться от glTexImage2D а также glReadPixels загружать и загружать изображения в и из памяти GPU. Весь код, связанный с OpenGL, является нативным.

На андроид GraphicBuffer может быть использован на Android для этой цели, потому что в мобильных устройствах память GPU является просто оперативной памятью хоста. Эта структура позволяет использовать memcpy передавать данные с помощью графического процессора. Это должно быть быстрее, чем использование функций OpenGL.

Я использовал эти очень цитируемые статьи [1] [2] [3] для успешной загрузки текстур в пространство памяти графического процессора Android с помощью GraphicBuffer,

Позже я попытался использовать тот же метод для перемещения данных текстуры обратно в пространство процессора, но у меня все еще есть некоторые проблемы с этим. Согласно ответу [7] это не должно быть возможно. Но дальнейшее чтение некоторых других ответов в StackOverflow, похоже, говорит об обратном. Некоторые случаи успешной замены glReadPixels по memcpy из GraphicBuffer сообщается в [4] [5] [6]. Большинство, кажется, говорят, что размещение glFinish незадолго до блокировки и чтения GraphicBuffer обновляет содержимое, как ожидается, к моменту его прочтения.

По моему опыту это не сработало из коробки, но на самом деле, похоже, проблема с синхронизацией. Просто звоню glFinish кажется недостаточно, но если я подожду несколько миллисекунд перед чтением буфера (т.е. sleep) тогда содержание кажется правильным. Это действительно не решение, так как оно оказывается медленнее, чем оригинал. glReadPixels решение (и в любом случае это не будет очень надежное решение), но показывает, что контент действительно обновляется в какой-то момент.

Мои вопросы будут:

  • Это правда, что GraphicBuffer не может быть прочитано напрямую, как сказано в [7] или с тех пор что-то изменилось?

  • Это просто совпадение, что это похоже на работу для других людей?

  • Есть ли лучший способ заставить память обновляться (например, более сильный glFinish вызов)?

3

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]