【问题标题】:Synchronization with fencing与围栏同步
【发布时间】:2016-09-01 15:22:03
【问题描述】:

我对使用 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 循环方式使用持久映射?

【问题讨论】:

    标签: opengl opengl-4


    【解决方案1】:

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

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

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

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

    如果您只是想刷新栅栏同步,那么这就是您在 4.4 中必须做的事情。也就是说,glFlush 在创建围栏后立即进行,但在使用 glClientWaitSync 时不要刷新。这将为您提供 4.5 行为的效果。

    【讨论】:

    • 所以如果我理解得很好,以 4.4 的方式进行刷新将确保围栏之前的所有命令都将完成,而之后的命令将开始? 4.5的方式,后面的不是强制启动的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多