【问题标题】:Pipeline barriers between transfer write commands传输写入命令之间的管道屏障
【发布时间】:2019-03-12 00:28:12
【问题描述】:

我们有两个传输命令,vkCmdFillBuffer() 后跟 vkCmdCopyQueryPoolResults()。传输命令写入重叠的缓冲区范围。

为了避免写后写危险,是否需要在命令之间设置管道屏障?

Vulkan 是否为在同一管道阶段执行的命令提供任何保证?

【问题讨论】:

    标签: vulkan


    【解决方案1】:

    当然,您几乎总是必须在 Vulkan 中进行同步。 Vulkan 进行隐式同步的地方很少。

    您对流水线阶段有错误的直觉。命令独立地“到达”管道的各个阶段。所有命令都从VK_PIPELINE_STAGE_TOP_OF_PIPE 开始(它们按提交顺序“到达”它)。然后(没有同步)不确定哪些命令将进入流水线的下一阶段。如果没有明确的同步原语,它就没有顺序。规范会说“队列操作的执行可能重叠或无序发生”。

    因此,如果没有同步 vkCmdCopyQueryPoolResults 甚至可能发生在 vkCmdFillBuffer 之前,我认为您不希望这样。如果两者同时发生,那就更糟了。然后数据可能包含来自两个来源(或两者都没有)的一些混乱的写入。结果只是未定义。

    【讨论】:

    • 设备内存中的数据危害应该只导致未定义的值,而不是未定义的行为。如果规范中有其他建议,我认为这可能是一个错误。
    • @JesseHall 我认为在简单的情况下您可能是对的。但是请考虑如果您等待未发出信号的信号量,或者无法刷新非一致的主机内存,或者在布局转换之前没有使内存可用,或者在错误的布局中使用图像会发生什么。在这两种情况下,规范都说你“必须”做对。根据定义,违反“必须”是“未定义的行为”。无论如何,关键是开发人员不应该这样做,除非是偶然的。我会这样编辑答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 2010-11-28
    • 2015-12-07
    • 1970-01-01
    • 2019-08-17
    相关资源
    最近更新 更多