PBO的竞争条件

时间:2013-03-03 21:35:16

标签: c++ opengl race-condition pbo

我在OpenGL中读到了关于PBO的一些内容,我得到了一个关于竞争条件的问题。

让我们看看下面的例子:我有两个PBO,我想将他们的像素数据轮流转移到一个纹理对象。因此,当我为一个PBO启动异步像素传输时,我可以立即对CPU执行其他操作,同时在后台传输像素数据。现在我在第二个PBO上进行一些像素操作,当它完成时我想将像素从第二个PBO传输到纹理对象。但是如果第一个PBO的转让尚未完成呢?就像在第一个例子中一样:http://www.songho.ca/opengl/gl_pbo.html

index = (index + 1) % 2;
nextIndex = (index + 1) % 2;

glBindTexture(GL_TEXTURE_2D, textureId);
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pboIds[index]);

glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, WIDTH, HEIGHT, GL_BGRA, GL_UNSIGNED_BYTE, 0);

glTextSubImage2D()将立即返回,我可以开始处理第二个PBO,同时将第一个PBO的数据传输到GPU。如果在第一次传输完成之前达到glTexSubImage()(现在应该传输第二个PBO的像素数据)怎么办?它会导致CPU停顿周期吗?

1 个答案:

答案 0 :(得分:3)

OpenGL将引入一个同步点,并确保进一步的异步操作不会影响使用修改后的OpenGL对象的前调用所调度的任何操作。

  

如果在第一次转移完成之前达到glTexSubImage()(现在应该转移第二个PBO的像素数据)怎么办?

没什么意外的。调用glTexSubImage后调用的所有调用都将使用修改后的数据。在使用未修改的数据之前安排的所有呼叫。 OpenGL规范要求这样做。

  

是否会导致CPU停顿?

可能会,也可能不会。 OpenGL没有指定这个。