在Vulkan重新绑定图形管道是否有保证的无操作?

ale*_*bit 3 c++ vulkan

在简化的场景中,每个要渲染的对象都被转换为辅助命令缓冲区,并且每个命令缓冲区最初绑定一个图形管道:是否保证无操作绑定之前立即绑定的管道?或者根本不保证辅助命令缓冲区的执行顺序?

Nic*_*las 6

是否保证no-op绑定之前立即绑定的管道?

不.事实上,在你概述的情况下,你应该假设正好相反.为什么?

由于每个CB都与其他CB隔离,因此该vkCmdBindPipeline函数无法预先知道绑定的内容.请记住:已开始记录的命令缓冲区的状态未定义.这意味着命令缓冲区构建代码不能对您未在此CB中设置的任何状态做出任何假设.

为了让驱动程序实现您正在讨论的优化,它必须在vkCmdExecuteCommands内部反省每个辅助命令缓冲区并开始删除跨CB边界重复的任何内容.

如果必须将所有命令从辅助CB复制到主要CB中,那么这可能是可行vkCmdExecuteCommands的.但这只适用于辅助CB不存在于硬件级别的系统,因此必须通过将其命令复制到主CB来实现.但即使在这种情况下,与简单地将一些令牌复制到主CB的存储中相比,实现这样的剔除会使命令执行时间更长.

处理低级API时,不要假设驱动程序将使用其直接范围之外的信息来优化代码.特别是当你拥有自己进行优化的工具时.

这是(又一个)你不应该为每个单独的对象提供自己的CB的原因.

或者根本不保证辅助命令缓冲区的执行顺序?

命令的执行顺序由于它们在CB中的存在而没有改变.然而,良好定义的这些命令的使用状态的性质受影响的.

在辅助CB继承的状态之外,每个辅助CB的状态开始未定义.这就是为什么你必须为每个管道绑定一个管道.如果先前发出的状态在包含该命令的CB内(或者是继承状态),则依赖于先前发出的状态的命令仅具有明确定义的行为.

  • @Ekzuzy:“*命令缓冲区不继承任何状态。*”辅助命令缓冲区*可以*继承*某些*状态;因此是“VkCommandBufferInheritanceInfo”对象。例如,打算在渲染通道中使用的那些会继承当前渲染通道的状态。它们还可以继承查询状态(给定适当的功能)。 (2认同)