在简化的场景中,每个要渲染的对象都被转换为辅助命令缓冲区,并且每个命令缓冲区最初都绑定一个图形管道:是否可以保证无操作来绑定之前立即绑定的管道?或者辅助命令缓冲区的执行顺序根本无法保证?
是否可以保证无操作来绑定之前立即绑定的管道?
不。事实上,在您概述的情况下,您应该准确地假设opposite. Why?
由于每个 CB 都与其他 CB 隔离,因此vkCmdBindPipeline
函数无法知道事先绑定了什么。请记住:已开始记录的命令缓冲区的状态是不明确的。这意味着命令缓冲区构建代码无法对您未在此 CB 中设置的任何状态做出任何假设。
为了让驱动程序实现您正在谈论的优化,它必须在vkCmdExecuteCommands
时间,内省每个辅助命令缓冲区并开始删除跨 CB 边界重复的任何内容。
That might是可行的,如果vkCmdExecuteCommands
必须将辅助 CB 中的所有命令复制到主 CB 中。但这仅适用于硬件级别不存在辅助 CB 的系统,因此必须通过将其命令复制到主 CB 来实现。但即使在这种情况下,与简单地将一些令牌复制到主 CB 的存储中相比,实施此类剔除也会使命令执行时间更长。
处理低级 API 时,不要假设驱动程序将使用其直接权限之外的信息来优化代码。尤其当您拥有自己进行优化的工具时。
这是(又一个)为什么您不应该为每个单独的对象提供自己的 CB 的原因。
或者辅助命令缓冲区的执行顺序根本无法保证?
命令的执行顺序不会因为它们在 CB 中的存在而改变。然而,这些命令使用的状态的明确定义的性质is做作的。
在辅助 CB 继承的状态之外,每个辅助 CB 的状态一开始都是未定义的。那是why您必须为每个管道绑定一个管道。仅当先前发出的状态位于包含该命令的 CB 内(或者是继承的状态)时,依赖于先前发出的状态的命令才具有明确定义的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)