我使用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进行持久映射?
答案 0 :(得分:1)
"Flush"并不代表"已完成"。它仅仅意味着最终将由GPU执行,无需进一步的OpenGL调用。"
4.4行为将刷新所有内容到glClientWaitSync
命令。 4.5行为只会清除所有内容,包括glFenceSync
调用。
但是在这两种情况下,如果glClientWaitSync
返回时没有超时或错误,那么你知道GPU的状态唯一是{{1}之前的所有命令电话已经完成。
这样,如果刷新所有命令缓冲区,如何使用循环方式使用OpenGL 4.4进行持久映射?
如果您只是想要刷新围栅同步,那么您需要在4.4中执行此操作。也就是说,glFenceSync
在创建围栏后立即生效,但在使用glFlush
时不要冲洗。这将为您提供4.5行为的效果。