0

我在 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 的数据传输到 GPU 时,我可以开始处理第二个 PBO。如果在第一次传输完成之前到达 glTexSubImage()(现在应该传输第二个 PBO 的像素数据)怎么办?它会导致 CPU 停顿周期吗?

4

1 回答 1

3

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

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

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

它会导致 CPU 停顿周期吗?

它可能会,也可能不会。OpenGL 没有指定这一点。

于 2013-03-03T22:08:07.900 回答