我正在学习Vulkan,在处理内存可视性之前,我对内存屏障的经验非常好。
我感觉每次我以前在它上面书写时,每次开始使用资源进行读取时,我都必须使用内存屏障,反之亦然。有点像存储器上是否有一个状态,指出该状态是用于写入还是读取。我知道这样做的原因与缓存管理有关,但是从更高的 Angular 来看,这就是我的看法。
当我看不到内存障碍时,就开始发生坏事,根据我(很可能是错误的)理解,内存障碍应该是。
例如,如果我要绘制某些东西并将其显示在屏幕上,则没有内存障碍可以从用于演示(因此用于读取)的交换链图像过渡到用于绘画(因此用于书写)的图像。 。当我完成绘图时,也没有相反顺序的障碍。
将分段主机可见缓冲区复制到设备本地缓冲区时,我已经看到了同样的事情。您可以在映射的内存中写入某些内容,将其刷新,然后开始在命令缓冲区中记录副本,而不会从主机可写内存过渡到传输读内存的任何障碍。因此,我想知道我的误解或隐含的事物使一切立即可用。
最佳答案
演示之间没有障碍是非法的。交换链图像必须在VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
中才能显示。当您的应用确实向图像写入内容时,它必须采用不同的布局。实现此目的的唯一方法是使用类似障碍的图元。
写入映射的内存是一种罕见的异常(exception)。任何后续的vkQueueSubmit
都会自动看到对映射内存的写入。请参见规范的Host Write Ordering Guarantees章。
为什么本教程没有障碍,是因为它涵盖了您可能未达到的next chapter中的同步。他们通过Subpass Dependencies来做到这一点。布局转换的一部分显示在earlier chapter about render passes中。
关于c++ - 为什么在开始在已获取的交换链镜像上绘图时不需要内存障碍?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57086285/