"VkImageMemoryBarrier::srcAccessMask = 0" 是什么意思?

What does "VkImageMemoryBarrier::srcAccessMask = 0" mean?

我刚读到 Images Vulkan tutorial, and I didn't understand about "VkImageMemoryBarrier::srcAccessMask = 0"。

代码:

    barrier.srcAccessMask = 0;
    barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;

本教程说:

Since the transitionImageLayout function executes a command buffer with only a single command, you could use this implicit synchronization and set srcAccessMask to 0 if you ever needed a VK_ACCESS_HOST_WRITE_BIT dependency in a layout transition.

Q1 : 如果函数有带多命令的commandbuffer,那么不能使用这个隐式同步?

Q2:根据manual page,VK_ACCESS_HOST_WRITE_BIT是0x00004000。但教程使用“0”。为什么?

它是“0”意味着隐含

它的“VK_ACCESS_HOST_WRITE_BIT”意思是露骨的?

我理解正确吗?

0 访问掩码表示“无”。与此一样,屏障没有引入内存依赖性。

隐式同步意味着 Vulkan 会为您完成。正如教程所说:

One thing to note is that command buffer submission results in implicit VK_ACCESS_HOST_WRITE_BIT synchronization

具体是Host Write Ordering Guarantee.

隐式意味着您无需执行任何操作。任何对映射内存的主机写入已经自动任何在映射内存写入后调用的任何vkQueueSubmit的设备访问可见。

在这种情况下显式意味着提交带有 VK_PIPELINE_STAGE_HOST_BITVK_ACCESS_HOST_*_BIT 的屏障。

注意同步保证只能以一种方式工作。所以 CPU → GPU 将是 automatic\implicit。但是 GPU → CPU 总是需要明确的(你需要一个带有 dst = VK_PIPELINE_STAGE_HOST_BIT 的屏障来执行内存域传输操作)。