在简化的场景中,每个要呈现的对象被转换成一个辅助命令缓冲区,并且每个命令缓冲区最初绑定一个图形管道:是否保证不绑定之前立即绑定的管道?或者二级命令缓冲区的执行顺序根本没有得到保证?
发布于 2018-04-23 17:15:36
有保证的不操作来绑定之前立即绑定的管道吗?
不是的。事实上,在你概述的情况下,你应该假设正好相反。为什么?
由于每个CBs都是与其他CBs隔离的,因此vkCmdBindPipeline函数无法事先知道绑定了什么。记住:已开始记录的命令缓冲区的状态未定义。这意味着命令缓冲区构建代码不能对在此CB中没有设置的任何状态进行任何假设。
为了使驱动程序实现您正在讨论的优化,它必须在vkCmdExecuteCommands时对每个辅助命令缓冲区进行内省,并开始删除任何跨CB边界重复的命令。
如果vkCmdExecuteCommands必须将辅助CBs中的所有命令复制到主命令中,这可能是可行的。但是,这对于不存在硬件级的辅助CBs的系统来说是合理的,因此必须通过将它们的命令复制到主CB中来实现。但是即使在这种情况下,实现这样的剔除也会使命令的执行时间比简单地将一些令牌复制到主CB的存储空间花费的时间更长。
在处理低级API时,不要假设驱动程序将使用超出其直接权限范围的信息来优化代码。特别是当你有工具自己进行优化时。
这是(又一个)原因,为什么你不应该给每个单独的对象它自己的CB。
或者二级命令缓冲区的执行顺序根本没有得到保证?
命令的执行顺序因它们在CBs中的存在而不变。但是,这些命令使用的状态的定义良好的性质会受到影响。
在二级CBs继承的状态之外,每个次级CB的状态开始时都没有定义。这就是为什么你必须为每个管道绑定一个管道。依赖于先前发出的状态的命令只有在先前发出的状态位于包含该命令的CB (或是继承状态)内时才具有定义良好的行为。
https://stackoverflow.com/questions/49985913
复制相似问题