opengl - glBufferSubData什么时候返回?

标签 opengl dma buffer-objects

我想将非常大的内存块的内容传输到足够大的 GPU 缓冲区,然后立即更改 CPU 上的内存内容。伪代码如下:

glBindBuffer(/*very_large_buffer*/);
glBufferSubData(/*very_large_memory_chunk*/);
memset(/*zeros*/, /*very_large_memory_chunk*/);

在这段代码中, glBufferSubData 的作用是什么?实际上呢?它是否在返回之前将very_large_memory_chunk传输到某个地方,或者只是安排传输操作以便稍后执行?因此,如果我立即开始更改 CPU 缓冲区,是否可能会传输部分更改的内存,从而在 GPU 的very_large_buffer 中产生垃圾?

请注意,我不是在询问渲染调用。我知道如果缓冲区用于渲染,传输操作将等到渲染完成,反之亦然。我想知道 OpenGL 在 CPU 到 GPU 传输操作中的行为是否相似。

最佳答案

OpenGL 没有定义如何实现 glBufferSubData:它可以立即将数据复制到 GPU 内存,也可以将复制操作推迟到稍后的时间点。

OpenGL 保证(OpenGL 4.5 规范,第 5.3 节)是,可以假设在方法返回时完成对 glBufferSubData 的调用。这意味着每个推迟 CPU->GPU 复制操作的实现都必须确保在返回之前复制 CPU 内存。

结论:您可以在 glBufferSubData 返回后立即更改指针的内容,而无需修改/销毁缓冲区内容。

关于opengl - glBufferSubData什么时候返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44667194/

相关文章:

opengl - 未明确指定绑定(bind)点索引的多个 UBO

opengl - 在GLSL中使用OpenGL Toon Shader

c++ - 使用 GLM 正确旋转 Open GL 相机

c++ - 阴影贴图上的高斯模糊(FBO/纹理)

calloc 和非连续内存块以及 void 指针

c++ - 如何在 OpenGL 中从一个 VBO 绑定(bind)多个 IBO

c++ - 为什么 glGetSubroutineIndex 为不同的函数返回相同的值?

linux - DMA 缓存一致性管理

memory-management - DMA Controller 有自己的寄存器吗?

opengl - 动态长度数组作为着色器存储缓冲区对象