Работайте, а не ждите glMapBuffer

Я использую OpenGL для некоторой обработки GPGPU. Итак, у меня есть разные потоки, работающие с потоком обработки OpenGL.

После каждого «рабочего элемента» мне нужно вызвать glReadPixels и glMapBuffer, чтобы передать данные обратно на хост из PBO. Однако проблема заключается в том, что glMapBuffer блокирует поток, и никакая полезная работа не может быть выполнена до завершения передачи DMA, даже если GPU простаивает. Обычный способ решить эту проблему — создать конвейер с временной глубиной самой длинной передачи DMA. Однако, поскольку я работаю над системой с низкой задержкой, это неоптимально.

Есть ли способ, возможно, ждать glMapBuffer в отдельном потоке или, возможно, получить какое-то уведомление о завершении передачи DMA, чтобы максимально уменьшить задержку ?


person ronag    schedule 21.05.2011    source источник


Ответы (1)


Выполняете ли какую-то дополнительную работу в других потоках, кроме того, в котором блокируется glMapBuffer? У вас может быть несколько контекстов OpenGL, каждый из которых активен в своем собственном потоке; если они настроены на совместное использование объектов, они могут работать одновременно.

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

person datenwolf    schedule 22.05.2011