我什么时候可以发布源PBO

When can I release a source PBO?

本文关键字:布源 PBO 什么时候      更新时间:2023-10-16

我使用PBO在cpu和gpu之间异步移动数据。

当从GPU移动时,我知道我可以在PBO上调用glMapBuffer后删除源纹理。

然而,反过来呢?我什么时候知道从PBO到纹理(glTexSubImage2D(…,NULL))的传输已经完成,并且我可以安全地释放或重复使用PBO?是我刚绑定纹理还是其他什么?

我认为在调用glTexImage之后,您可以安全地删除或重用缓冲区而不会出错,因为驱动程序可以为您处理一切,包括延迟销毁(这是缓冲区对象的优势)。但这意味着,对glMapBuffer的调用可能会阻塞,直到前一个glTexImage拷贝完成。如果您想重用缓冲区并覆盖其全部内容,通常的做法是在调用glMapBuffer之前用glBufferData重新定位它。通过这种方式,驱动程序知道您不再关心以前的内容,并可以分配一个新的缓冲区,您可以立即使用该缓冲区(当确实不再使用时,驱动程序会释放包含以前内容的内存)。请记住,缓冲区对象只是内存的句柄,驱动程序可以随心所欲地管理和复制它。

编辑:这意味着通过另一种方式(GPU-CPU),您可以在glGetTexImage返回后删除源纹理,因为驱动程序在幕后管理一切。是否使用缓冲区对象的决定不应影响调用GL函数的顺序和时间。请记住,调用glDelete...不会立即删除对象,它只是将此命令排入GL命令流,即使这样,当它真正释放任何内存时,也取决于驱动程序。