障碍的标准用法相对简单,但我想知道两个(或更多)重叠图像障碍的行为是什么(特别是关于它们的副作用 - 布局转换)。例如。 (伪代码):
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 );
答案 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;。
它是一个"读 - 写 - 读依赖。"中间部分需要等到第一次读取完成,但第二次读取不会发生,直到中间部分完成。您需要具有相关图像内存屏障和布局转换的执行依赖项。