Image Layout 和 Layout Transition

发布时间 2023-12-09 14:47:31作者: 经纬视界

Image Layout 和 Layout Transition

在RenderPass创建参数中需要指定RenderPass开始时和RenderPass结束时的ImageLayout也就是initLayout和finalLayout。因为不同的ImageLayout会影响到像素在内存中的组织方式。由于图形硬件的工作方式,对于Image来说线性布局往往不是性能最优的(Buffer一般都是选择线性布局,无需选择各种Layout)。选择正确的ImageLayout对于性能很重要。当这个Image使用于不同的用途是往往要切换到最优的ImageLayout,这样可以获得最佳的性能并且可以让驱动程序更好的管理和优化内存,比如要给Shader使用时则需要转换为Shader只读最优的ImageLayout。但是这些不同的ImageLayout对于开发者来说是一个黑盒,对于不同的GPU会有不同的实现。

但是在不同的时刻Image会有着不一样的用途,也就是需要Layout Transition操作将其过渡正确的ImageLayout才能够使用。如果在内存依赖中指定了Layout Transition。它必须发生在内存依赖中的内存可用之后(也就是所有的L1 Cache已经把最新的数据更新到了L2 Cache中),并且发生在内存可见操作之前。因为Layout Transition是一个会对内存进行读写访问,所以必须保证在Layout Transition之前所有内存可用,并且会自动对Layout Transition内存可见,并且Layout Transition执行的写入会自动完成内存可用。从Layout Transition的执行过程也可以看出都是在L2 Cache完成操作并且立即完成。对于Layout Transition也需要合理使用,不然会明显明显的额外开销拉低GPU的性能。