传输写入命令之间的管道障碍
Pipeline barriers between transfer write commands
我们有两个传输命令,vkCmdFillBuffer()
后跟 vkCmdCopyQueryPoolResults()
。传输命令写入重叠的缓冲区范围。
为了避免写后写的危险,命令之间是否需要管道屏障?
Vulkan 是否为在同一管道阶段执行的命令提供任何保证?
当然,您几乎总是必须在 Vulkan 中进行同步。 Vulkan 做隐式同步的地方很少。
您对流水线阶段的直觉是错误的。独立地命令 "reach" 个流水线阶段。所有命令都从 VK_PIPELINE_STAGE_TOP_OF_PIPE
开始(它们按提交顺序 "reach" )。然后(没有同步)不确定哪个命令将进入管道的下一阶段。没有明确的同步原语就没有秩序。规范会说 "execution of queue operations may overlap or happen out of order".
所以没有同步 vkCmdCopyQueryPoolResults
甚至可能发生在 vkCmdFillBuffer
之前,我假设您不希望这样。如果两者同时发生,那就更糟了。然后,数据可能包含来自两个来源(或两者都没有)的一些混乱的写入。结果将是不确定的。
我们有两个传输命令,vkCmdFillBuffer()
后跟 vkCmdCopyQueryPoolResults()
。传输命令写入重叠的缓冲区范围。
为了避免写后写的危险,命令之间是否需要管道屏障?
Vulkan 是否为在同一管道阶段执行的命令提供任何保证?
当然,您几乎总是必须在 Vulkan 中进行同步。 Vulkan 做隐式同步的地方很少。
您对流水线阶段的直觉是错误的。独立地命令 "reach" 个流水线阶段。所有命令都从 VK_PIPELINE_STAGE_TOP_OF_PIPE
开始(它们按提交顺序 "reach" )。然后(没有同步)不确定哪个命令将进入管道的下一阶段。没有明确的同步原语就没有秩序。规范会说 "execution of queue operations may overlap or happen out of order".
所以没有同步 vkCmdCopyQueryPoolResults
甚至可能发生在 vkCmdFillBuffer
之前,我假设您不希望这样。如果两者同时发生,那就更糟了。然后,数据可能包含来自两个来源(或两者都没有)的一些混乱的写入。结果将是不确定的。