Я работаю над кодом, который выполняет код 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
вызов)?
Задача ещё не решена.