我在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的数据传输到图形处理器。如果在第一次传输完成之前到达glTexSubImage() (现在应该传输第二个PBO的像素数据),该怎么办?它会导致CPU停滞周期吗?
发布于 2013-03-04 06:08:08
OpenGL将引入同步点,并确保进一步的异步操作不会影响以前的调用利用修改后的OpenGL对象安排的任何操作。
如果在第一次传输完成之前到达glTexSubImage() (现在应该传输第二个PBO的像素数据),该怎么办?
没什么出乎意料的。在调用glTexSubImage之后调度的所有调用都将使用修改后的数据。在此之前调度的所有呼叫都使用未修改的数据。OpenGL规范要求这样做。
是否会导致CPU停顿周期?
它可能会,也可能不会。OpenGL没有指定这一点。
https://stackoverflow.com/questions/15191192
复制相似问题