我使用PBO在cpu和gpu之间异步移动数据。
当从图形处理器移动时,我知道我可以在PBO上调用glMapBuffer后删除源纹理。
然而,反过来呢?什么时候我知道从PBO到纹理的传输(glTexSubImage2D(...,NULL))已经完成,我可以安全地释放或重用PBO?是只要我绑定纹理还是别的什么?
发布于 2011-05-26 09:52:03
我认为在调用glTexImage之后,您可以安全地删除或重用缓冲区,而不会出现错误,因为驱动程序会为您处理所有事情,包括延迟销毁(这就是buffer对象的优点)。但这意味着,在前面的glTexImage复制完成之前,对glMapBuffer的调用可能会阻塞。如果您希望重用缓冲区并覆盖其整个内容,则通常做法是在调用glMapBuffer之前使用glBufferData重新定位它。这样,驱动程序知道您不再关心以前的内容,并可以分配一个新的缓冲区,您可以立即使用(包含以前的内容的内存将由驱动程序释放,当它确实不再使用时)。请记住,您的buffer对象只是一个内存句柄,驱动程序可以随心所欲地管理和复制。
编辑:这意味着在glGetTexImage返回后,你可以删除源纹理,因为驱动程序管理幕后的一切。是否使用buffer对象的决定不应对调用GL函数的顺序和时间有任何影响。请记住,调用glDelete...不会立即删除对象,它只是将此命令排入GL命令流中,即使这样,它也取决于驱动程序是否真正释放了任何内存。
https://stackoverflow.com/questions/6132510
复制相似问题