gpt4 book ai didi

vulkan - 重叠图像障碍的行为是什么?

转载 作者:行者123 更新时间:2023-12-03 23:00:46 24 4
gpt4 key购买 nike

屏障的标准用法相对简单,但我想知道两个(或更多)重叠图像屏障的行为是什么(特别是关于它们的副作用——布局转换)。例如。 (伪代码):

begin( commandBuffer );
1: write( image );
2: imageBarrier(
image,
src=STAGE_FRAGMENT(from the write at 1:),
dst=STAGE_FRAGMENT(intended for read in FS of read at 4:),
appropriate src and dst access flags,
newLayout=A
);
3: imageBarrier(
image,
src=STAGE_FRAGMENT(from the write at 1:),
dst=STAGE_TRANSFER(intended for read by transfer of readT at 5:),
appropriate src and dst access flags,
newLayout=B
);
4: read( image ); // through vkCmdDraw -- expects layout A
5: readT( image ); // different kind of read through Transfer -- expects layout B
end( commandBuffer );
  1. 这合法吗? (你能用规范报价来支持它吗?)
  2. 程序每个点的图像布局是什么?
  3. 为了完整起见,什么是正确/最好的写法(一个生产者,两个消费者的情况)? (交换第 3 行和第 4 行并使其成为读-读依赖关系?)

最佳答案

一张图片不能同时采用多种布局。对于您在上面建议的代码,由于两个障碍彼此没有依赖关系,所以一个会先于另一个发生,但未指定顺序。所以之后图像的布局将是一个或另一个。这意味着两个读取操作之一将失败。

如果您有两个操作使用来自两个不同布局的图像,那么其中一个操作必须先于另一个执行,因为它们都无法读取所需布局中的图像。因此,它们之间必须存在执行依赖关系:

1: write( image );
2: imageBarrier( image, src=COLOR_ATTACHMENT_OUT, dst=FRAGMENT_SHADER, newLayout=A );
3: read( image ); // e.g. through vkCmdDraw -- expects layout A
4: imageBarrier( image, src=FRAGMENT_SHADER, dst=TRANSFER, newLayout=B );
5: readT( image ); // different kind of read e.g. Transfer -- expects layout B

#4 中的依赖项表明布局转换和后续的 TRANSFER 命令只有在所有先前的 FRAGMENT_SHADER 操作完成后才会发生。

make it Read-Read dependency

这不是“读-读依赖”。布局转换修改图像(理论上无论如何),就像您直接将值写入图像一样肯定。所以从逻辑上讲,你所拥有的是“我需要在 FS 中读取它。之后,我必须将它转换到一个新的布局。之后,我需要在传输操作中从它读取”。

这是一种“读-写-读依赖”。中间部分需要等到第一次读取完成,但是第二次读取要等到中间部分完成后才能进行。您需要具有关联图像内存屏障和布局转换的执行依赖项。

关于vulkan - 重叠图像障碍的行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38677988/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com