更新主要命令缓冲区中的推送常量但在次要缓冲区中使用?

Update push constant in primary command buffer but use in secondary?

我有多个辅助命令缓冲区,负责不同的几何渲染。但相机矩阵显然应该保持不变。我想通过推送常量更新相机矩阵,但我无法理解 - 我应该为每个辅助命令缓冲区执行此操作还是我只能在主命令缓冲区中执行一次?

一方面,推送常量是管道状态的一部分(在管道状态布局中指定),它不会被二级命令缓冲区继承。但是另一方面,有一个所谓的"Pipeline Layout Compatibility",我不太了解,但看起来它允许更新一次推送常量并在后续命令中使用更新的值。

通常(正如您所指出的)状态不会在命令缓冲区之间继承。这意味着您需要在每个命令缓冲区中分别设置状态(与绘图或计算操作相关)。此规则有一些例外,但它们与您在这里谈论的问题无关。

所以是的,您需要在每个命令缓冲区中分别设置推送常量的值

至于管道布局兼容性你指的是,这意味着当你为给定管道设置一些管道状态然后当你用[=16绑定另一个管道时=]compatible layout,不用再设置相同的状态。它保留在具有 兼容布局 的管道之间。再次重申,是的,您可以 "update push constant once and use the updated values in subsequent commands"但这必须发生在同一个命令缓冲区中。您可以在绑定到同一个命令缓冲区的管道中使用更新的值。但是如果你在另一个命令缓冲区,你需要重新设置相关状态。更重要的是 - 在您从主命令缓冲区执行辅助命令缓冲区后,您还需要再次在此主命令缓冲区中设置状态。换句话说,主命令缓冲区在执行辅助命令缓冲区后忘记了它的状态。