是否可以在不知道目标将使用该映像的布局的情况下释放映像的队列所有权?

Is it possible to release queue ownership of an image without knowing the layout the destination will use the image in?

提问人:Tacodiva 提问时间:11/5/2023 最后编辑:Tacodiva 更新时间:11/5/2023 访问量:41

问:

我有两个队列,队列 A 和队列 B,它们来自不同的队列系列。队列 A 当前拥有独占共享模式下映像的所有权。我想提前将映像的所有权释放给队列 B,因为我知道这将是下一个使用它的人。但是,我不知道队列 B 需要图像所在的布局。

问题在于,释放屏障(在队列 A 上)和获取屏障(在队列 B 上)都需要指定源和目标映像布局。如何在事先不知道布局的情况下将映像发布到队列 B?

我认为最好的方法是在记录到队列 B 时使用两个图像内存屏障:第一个从队列 A 获取图像(不更改布局),第二个执行布局转换。问题是我不知道如何创建依赖项以确保在获取图像后发生布局转换。有没有办法在两个顺序图像内存屏障之间创建这种依赖关系?

武尔坎

评论

0赞 Nicol Bolas 11/5/2023
"但是,我不知道队列 B 需要图像的布局。为什么不呢?队列 B 在做什么,没人知道?
0赞 Tacodiva 11/5/2023
@NicolBolas(不知道为什么这很重要,但是...)这是因为我正在从渲染抽象前端转换为 Vulkan 后端。在这种抽象中,在帧中,可以指定一些命令(如复制一些数据)以并行运行以渲染主帧。由于抽象的工作方式,当这些并行命令在帧中提交时,我知道输出(如图像)将在该帧中使用。但是,由于帧的其余部分尚未录制,(可能需要一段时间才能完成录制),我还不知道如何使用图像。

答:

1赞 Nicol Bolas 11/5/2023 #1

队列 A 必须知道队列 B 想要什么布局,或者队列 B 必须知道队列 A 将图像保留在哪个布局中。也就是说,其中一个队列必须知道另一个队列正在使用什么布局;他们不可能都对彼此一无所知。

执行发布/获取对时,将忽略发布的目标访问掩码,并忽略目标的源访问掩码。从本质上讲,对的源访问掩码是发行版的源访问掩码,而对的目标访问掩码是获取的目标访问掩码。

因此,如果希望队列 B 在采集后执行布局转换,则该屏障需要与采集屏障的目标范围和访问掩码正确同步。

评论

0赞 Tacodiva 11/5/2023
感谢您的帮助:)我明白了这一切,好消息是,在录制队列 B 时,我可以知道图像留在什么布局中。我感到困惑的是,如果我想获取图像并执行 blit(例如),如何在 blit 之前在队列 B 上设置 src/dst 访问掩码和两个屏障的阶段,以确保布局转换发生在获取之后?
1赞 Nicol Bolas 11/5/2023
如果您知道队列 A 将图像保留在哪个布局中...则队列 B 完全控制它。第二个屏障的源访问掩码/阶段与队列 B 的获取屏障中的目标掩码/阶段相同。这就是同步的工作原理。
0赞 Tacodiva 11/5/2023
好吧,很酷,我在想我必须将第二个障碍上的源掩码设置为某些东西,以确保布局过渡在获取之后进行,但从你说的我可以将它们留空吗?(我怀疑我的困惑来自我对依赖链缺乏理解)。再次感谢您的帮助。
1赞 Nicol Bolas 11/5/2023
@Tacodiva:“我可以把它们留空吗?我不知道你是怎么从“和”那里得到的。这就像将其留空的反面
1赞 Nicol Bolas 11/5/2023
@Tacodiva:噢,我明白混乱是从哪里来的了。当我说“第二个障碍”时,我指的是队列 B 上的第二个障碍,而不是发布/获取对的获取部分。也就是说,实际上正在改变图像布局的障碍。