Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 何时可以发布源PBO?_C++_Opengl_Gpgpu_Pbo - Fatal编程技术网

C++ 何时可以发布源PBO?

C++ 何时可以发布源PBO?,c++,opengl,gpgpu,pbo,C++,Opengl,Gpgpu,Pbo,我使用PBOs在cpu和gpu之间异步移动数据 当从GPU移动时,我知道我可以在PBO上调用glMapBuffer后删除源纹理 然而,反过来呢?我什么时候知道从PBO到纹理(glTexSubImage2D(…,NULL))的传输已经完成,并且我可以安全地释放或重新使用PBO?是在我绑定纹理还是其他东西之后?我认为在调用glTexImage后,您可以安全地删除或重新使用缓冲区,不会出现错误,因为驱动程序会为您处理所有事情,包括延迟销毁(这是缓冲区对象的优点)。但这意味着,对glMapBuffer的

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

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


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

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


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

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