我正在使用PBO在我的cpu和gpu之间异步移动数据。
当我从GPU移动时,我知道在PBO上调用glMapBuffer后我可以删除源纹理。
然而,相反呢?我什么时候知道从PBO到纹理的转移(glTexSubImage2D(...,NULL))已经完成,我可以安全地释放或重新使用PBO?它是否只要我绑定纹理或其他东西?
答案 0 :(得分:4)
我认为在调用glTexImage
之后你可以安全地删除或重用缓冲区而不会出错,因为驱动程序会为你处理所有事情,包括延迟破坏(这是缓冲区对象的优点)。但这意味着,对glMapBuffer
的调用可能会阻塞,直到前一个glTexImage
副本完成。如果要重用缓冲区并仅覆盖其整个内容,通常的做法是在调用glBufferData
之前使用glMapBuffer
重新定位它。通过这种方式,驱动程序知道您不再关心以前的内容,并且可以分配一个可以立即使用的新缓冲区(当驱动程序实际上不再使用时,驱动程序将释放包含先前内容的内存)。请记住,缓冲区对象只是内存的句柄,驱动程序可以根据需要进行管理和复制。
编辑:这意味着在另一种方式(GPU-CPU)中,您可以在glGetTexImage
返回后删除源纹理,因为驱动程序管理幕后的所有内容。是否使用缓冲区对象的决定不应对调用GL函数的顺序和时间产生任何影响。请记住,调用glDelete...
不会立即删除对象,它只是将此命令排入GL命令流中,即使这样,它也可以在驱动程序确实释放任何内存时使用它。