Synchronization with fencing



我对glClientWaitSync函数有一个误解。

承认我正在使用这样的东西:

glDraw(...);
sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
glDraw(...);
glClientWaitSync(sync, GL_SYNC_FLUSH_COMMANDS_BIT, 1000000000);
glDeleteSync(sync);

如果我很好地理解了OpenGL Wiki,我们有两种情况

第一种情况:OpenGL 4.5:在这种情况下,在glClientWaitSync之后,我们确信只有第一次绘制被执行,因为它是在wiki上写的:

在opengl4.5中,这种刷新是特殊的。如果这是您第一次等待特定的同步对象,并且等待是在创建同步对象的同一上下文中,则刷新将表现为您在同步对象之后立即发出它。因此,如果你在同步对象创建后发出了其他OpenGL命令,它们将不会被刷新。

第二种情况:OpenGL 4.4或更低:我们确信这两个绘制都被执行,因为这个函数有"全局"相同的行为比glFlush函数?按照这种方式,如果所有的命令缓冲区都被刷新,如何真正使用OpenGL 4.4使用轮询方式的持久映射?

"Flush"不代表"已完成"。它仅仅意味着"最终将由GPU执行,而无需进一步调用OpenGL。"

4.4行为将刷新到glClientWaitSync命令的所有内容。4.5的行为将只刷新直到并包括glFenceSync调用的所有内容。

但是在这两种情况下,如果glClientWaitSync返回没有超时或错误,唯一的事情你知道GPU的状态是glFenceSync调用之前的所有命令已经完成。

这样,如果所有的命令缓冲区都被刷新,如何真正使用OpenGL 4.4使用轮询方式的持久映射?

如果你只是想冲洗栅栏同步,那么这是你必须在4.4中做的。也就是说,在创建栅栏后立即使用glFlush,但在使用glClientWaitSync时不要冲洗。这将给你4.5行为的效果。

相关内容

  • 没有找到相关文章