glBufferData后需要glFlush吗?

时间:2017-11-09 17:39:49

标签: c++ opengl

我需要调用glFlush(); glFinish();在我调用glBufferData或以CPU缓冲区作为输入的类似函数之后,确保所有CPU数据都被GPU消耗 即这样的代码保证在没有崩溃的情况下工作:

GLfloat* buffer = malloc(1000*sizeof(GLfloat));
doSomeCalculation(buffer);    
glBindBuffer(GL_ARRAY_BUFFER, _someGlBuffer);
glBufferData(GL_ARRAY_BUFFER, 1000*sizeof(GLfloat), buffer, GL_DYNAMIC_DRAW);
// glFlush();
// glFinish();  //<<--- Is it required?
free(buffer);

1 个答案:

答案 0 :(得分:2)

如果需要将GL状态与主机数据或GL↔CLInterop调用同步,则需要调用

glFinish。交换缓冲区时将隐式调用此(或类似的调用),因此在大多数OpenGL的正常使用中,不需要调用它。

根据我的个人经验,我使用glFinish的一个场景是当我强迫GL绘制极其图形化的图像时,渲染整个图像的时间超过60秒 - 在最佳情况下导致操作系统重置图形驱动程序并导致程序崩溃,在最坏的情况下会导致蓝屏死机,而且我已经分享了这些!正常提交该任务会导致GL尝试将所有内容捆绑在一起,并且操作系统通常会假设图形驱动程序已经崩溃,如果它没有响应超过几秒钟。所以我重写了渲染循环,只是一次批处理图像的一小部分,一个(或多或少)的循环看起来像这样:

for(int x = 0; x < image_width; x += 32) {
    for(int y = 0; y < image_height; y += 32) {
        glViewport(x, y, 32, 32);
        glDrawArrays(GL_QUADS, 0, 4);
        glFinish();
    }
}

因此,如果您有一个用例,您担心个别绘制调用花费的时间太长,您可以将其拆分,并防止GL将后续绘制调用一起打包,将它们与使用分开glFinish

但我的情况非常独特。一般来说,你不应该期望这样做。

编辑:

glBufferData的特定情况下,驱动程序在将控制权返回给主机代码之前缓冲数据,因此无需担心与主机同步。