繁体   English   中英

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

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

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

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

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

例如,如果我想绘制一些东西并将其呈现在屏幕上,则没有内存障碍可以从用于呈现(因此用于阅读)的交换链图像转换为用于绘图(从而用于书写)的图像. 当我完成绘制时,反向顺序也没有障碍。

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

演示之间没有障碍是非法的。 交换链图像必须在VK_IMAGE_LAYOUT_PRESENT_SRC_KHR以进行展示。 当您的应用程序确实向图像写入内容时,它必须处于不同的布局。 实现这一点的唯一方法是使用类似屏障的原语。

写入映射内存是一种罕见的例外。 对映射内存的写入对任何后续vkQueueSubmit都是自动可见的。 请参阅规范的主机写入顺序保证章节。

为什么本教程没有障碍是因为它涵盖了您可能没有达到的下一章中的同步。 他们通过子通道依赖来实现。 作为其中一部分的布局转换在前面关于渲染通道的章节中有所展示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM