与防护同步

时间:2016-09-01 15:22:04

标签: opengl opengl-4

我使用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上写的:

  

在OpenGL 4.5中,这种刷新是特殊的。如果它是您第一次等待该特定同步对象,并且等待位于创建同步对象的同一上下文中,则刷新将表现得就像您在同步对象之后立即发出它一样。因此,如果在创建同步对象后发出了其他OpenGL命令,则不会刷新它们。

第二种情况:OpenGL 4.4或者劣等:我们确信两次绘制都是执行的,因为这个函数具有"全局"与glFlush函数相同的行为? 这样,如果刷新所有命令缓冲区,如何使用循环方式使用OpenGL 4.4进行持久映射?

1 个答案:

答案 0 :(得分:1)

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

4.4行为将刷新所有内容到glClientWaitSync命令。 4.5行为只会清除所有内容,包括glFenceSync调用。

但是在这两种情况下,如果glClientWaitSync返回时没有超时或错误,那么你知道GPU的状态唯一是{{1}之前的所有命令电话已经完成。

  

这样,如果刷新所有命令缓冲区,如何使用循环方式使用OpenGL 4.4进行持久映射?

如果您只是想要刷新围栅同步,那么您需要在4.4中执行此操作。也就是说,glFenceSync在创建围栏后立即生效,但在使用glFlush时不要冲洗。这将为您提供4.5行为的效果。