在简化的场景中,每个要渲染的对象都被转换为辅助命令缓冲区,并且每个命令缓冲区最初绑定一个图形管道:是否保证无操作绑定之前立即绑定的管道?或者根本不保证执行辅助命令缓冲区的顺序?
答案 0 :(得分:5)
是一个保证no-op来绑定之前立即绑定的管道吗?
没有。事实上,在你概述的情况下,你应该正好假设相反。为什么呢?
由于每个CB都与其他CB隔离,vkCmdBindPipeline
函数无法预先知道绑定的内容。请记住:已开始记录的命令缓冲区的状态为 undefined 。这意味着命令缓冲区构建代码不能对您未在此CB中设置的任何状态做出任何假设。
为了让驱动程序实现您正在讨论的优化,它必须在vkCmdExecuteCommands
时间内反省每个辅助命令缓冲区并开始删除跨CB边界重复的任何内容。 / p>
如果vkCmdExecuteCommands
必须将所有命令从辅助CB复制到主要CB中,那么可能可行。但这只适用于辅助CB不存在于硬件级别的系统,因此必须通过将其命令复制到主CB来实现。但即使在这种情况下,与简单地将一些令牌复制到主CB的存储中相比,实施这样的剔除会使命令执行时间更长。
在处理低级API时,不要假设驱动程序将使用其直接范围之外的信息来优化代码。 特别是当你拥有自己进行优化的工具时。
这是(又一个)你不应该为每个单独的对象提供自己的CB的原因。
或者根本不保证执行辅助命令缓冲区的顺序?
命令的执行顺序由于它们在CB中的存在而没有改变。但是,这些命令使用的状态定义明确,会受到影响。
在辅助CB继承的状态之外,每个辅助CB的状态开始未定义。那就是为什么你必须为每个管道绑定一个管道。如果先前发出的状态在包含该命令的CB内(或者是继承状态),则依赖于先前发出的状态的命令仅具有明确定义的行为。