c++ - PBO 的竞争条件

标签 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 停滞周期吗?

最佳答案

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

What if glTexSubImage() (the pixel data of the second PBO should now be transfered) is reached before the first transfer has completed?

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

Will it result in CPU stall-cycles?

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

关于c++ - PBO 的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15191192/

相关文章:

c++ - OpenGL SOIL 未定义对 glBindTexture、glTexImage2d 等的引用

c++ - 不同的片段着色器颜色

c++ - 在opengl中移动相机时显示错误

Java:使代码块原子化

c++ - 生产者/消费者模式的 STL 容器线程安全

c# - 格式化需要通过 TCP/IP 发送的字符串的最佳实践

c++ - CreateFile dwDesiredAccess 和 dwShareMode 组合

c - 为什么 pthread 条件变量不起作用

c++ - 一起或单独编译多个 C++ 文件

c++ - 将 2D 图像坐标转换为 z = 0 的 3D 世界坐标