我在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停顿吗?
最佳答案
OpenGL将引入一个同步点,并确保进一步的异步操作不会影响以前使用修改后的OpenGL对象的调用安排的任何操作。
如果在第一次传输完成之前达到glTexSubImage()(现在应该传输第二个PBO的像素数据)怎么办?
没什么意外的。调用glTexSubImage之后安排的所有调用都将使用修改后的数据。在它之前调度的所有呼叫都使用未修改的数据。 OpenGL规范对此进行了规定。
会导致CPU停顿吗?
可能会或可能不会。 OpenGL没有指定这个。