【发布时间】:2019-03-12 00:28:12
【问题描述】:
我们有两个传输命令,vkCmdFillBuffer() 后跟 vkCmdCopyQueryPoolResults()。传输命令写入重叠的缓冲区范围。
为了避免写后写危险,是否需要在命令之间设置管道屏障?
Vulkan 是否为在同一管道阶段执行的命令提供任何保证?
【问题讨论】:
标签: vulkan
我们有两个传输命令,vkCmdFillBuffer() 后跟 vkCmdCopyQueryPoolResults()。传输命令写入重叠的缓冲区范围。
为了避免写后写危险,是否需要在命令之间设置管道屏障?
Vulkan 是否为在同一管道阶段执行的命令提供任何保证?
【问题讨论】:
标签: vulkan
当然,您几乎总是必须在 Vulkan 中进行同步。 Vulkan 进行隐式同步的地方很少。
您对流水线阶段有错误的直觉。命令独立地“到达”管道的各个阶段。所有命令都从VK_PIPELINE_STAGE_TOP_OF_PIPE 开始(它们按提交顺序“到达”它)。然后(没有同步)不确定哪些命令将进入流水线的下一阶段。如果没有明确的同步原语,它就没有顺序。规范会说“队列操作的执行可能重叠或无序发生”。
因此,如果没有同步 vkCmdCopyQueryPoolResults 甚至可能发生在 vkCmdFillBuffer 之前,我认为您不希望这样。如果两者同时发生,那就更糟了。然后数据可能包含来自两个来源(或两者都没有)的一些混乱的写入。结果只是未定义。
【讨论】: