为什么我在开始绘制获取的交换链图像时不需要内存屏障?

Why I don't need memory barriers when starting drawing on an acquired swapchain image?

我正在学习 Vulkan,在我不得不处理内存可见性之前,我在内存障碍方面的经验非常好。

我觉得每次我开始使用资源进行阅读时我都必须使用内存屏障,而我之前在上面写过,反之亦然。有点像如果内存上有一个状态表明它是用于写入还是用于读取。我知道这样做的理由与缓存管理有关,但在更高的层次上,我是这样看的。

当我没有看到内存障碍时,糟糕的事情就开始了,根据我(很可能是错误的)的理解,他们应该是。

例如,如果我想画一些东西并将其呈现在屏幕上,从用于呈现(因此用于阅读)的交换链图像到用于绘图的图像的转换没有内存障碍(从而用于写作)。而且当我画完的时候,倒序也没有障碍

我在将暂存主机可见缓冲区复制到设备本地缓冲区时看到了同样的事情。您在映射内存中写入一些内容,刷新它,然后开始在命令缓冲区中记录副本,而不会对从主机可写内存到传输读取内存的转换设置任何障碍。所以我想知道我误解了什么,或者是什么隐含的东西让一切都开箱即用。

演示文稿之间没有障碍是非法的。交换链图像必须在 VK_IMAGE_LAYOUT_PRESENT_SRC_KHR 中才能显示。当您的应用确实向图像写入内容时,它必须采用不同的布局。实现这一目标的唯一方法是使用 barrier-like 原语。

写入映射内存是一个罕见的例外。对映射内存的写入对任何后续 vkQueueSubmit 自动可见。请参阅规范的 Host Write Ordering Guarantees 章节。

为什么本教程没有障碍,因为它涵盖了 next chapter you assumably did not reach. They do so with Subpass Dependencies. The layout transitions that are part of that are shown in earlier chapter about render passes 中的同步。