Когда я смогу выпустить исходный PBO? - PullRequest
4 голосов
/ 26 мая 2011

Я использую PBO для асинхронного перемещения данных между моим процессором и процессором.

При переходе с графического процессора я знаю, что могу удалить исходную текстуру после того, как вызвал glMapBuffer на PBO.

Впрочем, а как же наоборот? Когда я узнаю, что передача из PBO в текстуру (glTexSubImage2D (..., NULL)) завершена, и я могу безопасно разблокировать или повторно использовать PBO? Это как только я связываю текстуру или что-то еще?

1 Ответ

4 голосов
/ 26 мая 2011

Я думаю, что после вызова glTexImage вы можете безопасно удалить или повторно использовать буфер без ошибок, поскольку драйвер обрабатывает все для вас, включая отложенное уничтожение (это преимущество буферных объектов).Но это означает, что вызовы glMapBuffer могут блокироваться до завершения предыдущей копии glTexImage.Если вы хотите повторно использовать буфер и просто перезаписать весь его контент, обычной практикой является переопределение его с помощью glBufferData перед вызовом glMapBuffer.Таким образом, драйвер узнает, что вы больше не заботитесь о предыдущем контенте, и может выделить новый буфер, который вы можете использовать немедленно (память, содержащая предыдущее содержимое, освобождается драйвером, когда он больше не используется).Просто имейте в виду, что ваш буферный объект - это всего лишь дескриптор памяти, драйвер может управлять им и копировать по своему усмотрению.

РЕДАКТИРОВАТЬ: Это означает иначе (GPU-CPU)) вы можете удалить исходную текстуру после возврата glGetTexImage, так как драйвер управляет всем за кадром.Решение об использовании буферных объектов или нет, не должно иметь никаких последствий для порядка и времени, в которое вы вызываете функции GL.Имейте в виду, что вызов glDelete... не приводит к немедленному удалению объекта, он просто помещает эту команду в поток команд GL и даже в этом случае это зависит от драйвера, когда он действительно освобождает любую память.

...