【发布时间】:2018-09-15 11:27:44
【问题描述】:
我想分享我对如何在多线程渲染中保持内存屏障同步的想法。如果我对 Vulkan 内存屏障的想法是错误的,或者我目前的计划是否有意义,请告诉我。我在工作中没有人可以讨论,所以我会在这里寻求帮助。
对于 Vulkan 中的资源,当我在 drawcalls 中为它们设置内存屏障时,我需要同时设置 srcAccessMask 和 dst AccessMask。这对于单线程渲染很简单。但是对于多线程渲染,它变得复杂。 dst AccessMask 不是问题,因为我们总是知道资源将用于什么。但是对于 srcAccessMask,当一个命令缓冲区尝试读取某个资源的当前访问掩码时,可能会有其他命令缓冲区将其更改为其他内容。所以我目前解决它的想法是:
每个资源都有自己的状态,我只会在将命令缓冲区提交到命令队列之前更新状态,我稍后会描述。每个命令缓冲区都维护着它内部资源状态如何变化的跟踪记录。这样做,在同一个命令缓冲区内,每个资源的访问状态是明确的,唯一的问题是每个命令缓冲区的资源的开始状态。
在提交多个命令缓冲区执行时,由于命令缓冲区的顺序现在是固定的,我检查所有命令缓冲区中每个资源的跟踪记录,根据每个命令缓冲区中资源的结束状态更新资源的状态,并使用它来更正每个命令缓冲区的跟踪记录中相同资源的开始状态。
然后我需要插入一个新的命令缓冲区以具有额外的内存屏障以将资源转换为第一个命令缓冲区的正确状态,或者将内存屏障插入到先前的命令缓冲区以用于其余命令缓冲区。当所有这些都完成后,我终于可以批量提交命令缓冲区了。
这些对你有意义吗?有没有更好的解决方案来解决它?还是我们甚至需要解决每个资源访问状态的“同步”问题?
感谢您的宝贵时间
【问题讨论】:
标签: multithreading 3d rendering vulkan