C++ 何时可以发布源PBO?
我使用PBOs在cpu和gpu之间异步移动数据 当从GPU移动时,我知道我可以在PBO上调用glMapBuffer后删除源纹理C++ 何时可以发布源PBO?,c++,opengl,gpgpu,pbo,C++,Opengl,Gpgpu,Pbo,我使用PBOs在cpu和gpu之间异步移动数据 当从GPU移动时,我知道我可以在PBO上调用glMapBuffer后删除源纹理 然而,反过来呢?我什么时候知道从PBO到纹理(glTexSubImage2D(…,NULL))的传输已经完成,并且我可以安全地释放或重新使用PBO?是在我绑定纹理还是其他东西之后?我认为在调用glTexImage后,您可以安全地删除或重新使用缓冲区,不会出现错误,因为驱动程序会为您处理所有事情,包括延迟销毁(这是缓冲区对象的优点)。但这意味着,对glMapBuffer的
然而,反过来呢?我什么时候知道从PBO到纹理(glTexSubImage2D(…,NULL))的传输已经完成,并且我可以安全地释放或重新使用PBO?是在我绑定纹理还是其他东西之后?我认为在调用
glTexImage
后,您可以安全地删除或重新使用缓冲区,不会出现错误,因为驱动程序会为您处理所有事情,包括延迟销毁(这是缓冲区对象的优点)。但这意味着,对glMapBuffer
的调用可能会阻塞,直到前面的glTexImage
复制完成。如果要重用缓冲区并覆盖其全部内容,通常的做法是在调用glMapBuffer
之前使用glBufferData
对其进行重新定位。通过这种方式,驱动程序知道您不再关心以前的内容,并且可以分配一个新的缓冲区,您可以立即使用(包含以前内容的内存在确实不再使用时由驱动程序释放)。请记住,缓冲区对象只是内存的句柄,驱动程序可以随意管理和复制
编辑:这意味着,在
glGetTexImage
返回后,您可以通过另一种方式(GPU-CPU)删除源纹理,因为驱动程序会在幕后管理一切。是否使用缓冲区对象的决定不应影响调用GL函数的顺序和时间。请记住,调用glDelete…
不会立即删除对象,它只是将此命令排入GL命令流,即使如此,当它真正释放内存时,还是由驱动程序决定。我不知道glGetTexImage,它与glReadPixels有何不同?@ronagglReadPixels
从帧缓冲区读取,glGetTexImage
仅此而已。这只是一个例子,同样适用于glReadPixels
。