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

What's the behavior of overlaping Image Barriers?

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

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. 为了完整起见,proper/best 的写法是什么(一个生产者,两个消费者的情况)? (交换第 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

这不是 "Read-Read dependency"。布局转换 修改 图像(理论上无论如何),就像您直接将值写入图像一样确定。所以从逻辑上讲,你拥有的是 "I need to read from it in the FS. After that, I have to transition it to a new layout. After that, I need to read from it in a transfer operation".

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