带有PBO的竞态条件

Race Condition with PBO

本文关键字:条件 PBO 带有      更新时间:2023-10-16

我读了一些关于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停滞周期吗?

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

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

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

会导致CPU停滞周期吗?

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