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

标签 c++ opengl gpgpu pbo

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

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

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

最佳答案

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

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

关于c++ - 我什么时候可以发布源 PBO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6132510/

相关文章:

opengl - 什么时候应该调用 glGetError?

OpenCL AMD 与 NVIDIA 性能对比

OpenCL:防止内核缓存

cuda - OpenCL:NVIDIA GPU 上的 clAmdFft(来自 AMD 的 OpenCL FFT 库)

C++、oop、类列表(类类型)和创建它们的实例

C++/RapidXML : Edit node and write to a new XML file doesn't have the updated nodes

opengl - 在 Windows Mobile 上部署 OpenGL 应用程序

c++ - 代码块运行错误: Build failed

C++ 异常、GCC 和 "inline-functions"标志

opengl - GLSL 自动优化