我什么时候可以发布源PBO?

4

我正在使用PBO(像素缓存对象)来异步地在CPU和GPU之间传输数据。

当从GPU传输数据时,我知道可以在调用PBO的glMapBuffer后删除源纹理。

但是,反过来呢?我如何知道从PBO到纹理的传输(glTexSubImage2D(...,NULL))已完成,我可以安全地释放或重新使用PBO?是在绑定纹理后立即吗,还是其他什么时间点?

1个回答

4
我认为在调用glTexImage之后,您可以安全地删除或重用缓冲区而不会出现错误,因为驱动程序为您处理所有内容,包括延迟销毁(这是缓冲区对象的优点)。但是,这意味着调用glMapBuffer可能会阻塞,直到前面的glTexImage复制完成。如果您想重用缓冲区并只覆盖其全部内容,则常规做法是在调用glMapBuffer之前使用glBufferData重新分配它。这样,驱动程序就知道您不再关心以前的内容,并且可以分配新的缓冲区,以便您可以立即使用(当驱动程序确定不再使用该内容时,包含以前内容的内存将被释放)。请记住,您的缓冲区对象只是指向内存的句柄,驱动程序可以根据其喜欢的方式管理和复制。
编辑:这也意味着在GPU-CPU方向上,您可以在glGetTexImage返回后删除源纹理,因为驱动程序在幕后管理所有内容。使用缓冲区对象与否的决定不应影响您调用GL函数的顺序和时间。请记住,调用glDelete...不会立即删除对象,它只是将此命令排队到GL命令流中,即使是这样,真正释放任何内存还取决于驱动程序。

我不知道glGetTexImage,它与glReadPixels有什么区别? - ronag
@ronag glReadPixels 从帧缓冲区读取,glGetTexImage 从纹理读取,仅此而已。这只是一个例子,同样适用于 glReadPixels - Christian Rau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接