覆盖图像障碍的行为是什么?

时间:2016-07-30 20:00:55

标签: vulkan

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

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 个答案:

答案 0 :(得分:2)

图像不能同时承担多个布局。对于上面建议的代码,由于两个障碍彼此没有依赖关系,一个会在另一个之前发生,但是没有指定顺序。因此,之后图像的布局将是一个或另一个。这意味着两个阅读操作中的一个将失败。

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

class users {
    public $pdo;

    public function __construct() {
        $this->pdo = connect::getInstance();
    }      



    public function insertComment($user_id, $comment_text, $time) {

        $sql = "INSERT INTO comments VALUES ('','$user_id', '$comment_text', '$time')";
        $this->query = $this->pdo->prepare($sql);
        $this->query->execute();

    }

}

$user = new users;
$user_id = 10;
$comment_text = 'hello everyone';
$time = date("y/m/d - h:i:s");
$user->insertComment($user_id, $comment_text, $time);

#4中的依赖关系表示在所有先前的FRAGMENT_SHADER操作完成之前,布局转换和后来的TRANSFER命令不会发生。

  

使其成为读读依赖

它不是" Read-Read依赖"。布局转换修改图像(理论上无论如何),就像您直接为图像写入值一样。所以逻辑上你所拥有的是"我需要在FS中读取它。之后,我必须将其转换为新的布局。在那之后,我需要在传输操作中读取它#34;。

它是一个"读 - 写 - 读依赖。"中间部分需要等到第一次读取完成,但第二次读取不会发生,直到中间部分完成。您需要具有相关图像内存屏障和布局转换的执行依赖项。