这里是SunshineBooming,GPU公司一枚小小的Driver工程师,主要工作是写DirectX12 Driver,我会持续更新这个DX12 Spec系列,可能比较冷门,但是都是干货和工作中的心得体会,有任何GPU相关的问题都可以在评论区互动,知无不言:
DirectX12 Spec 总目录
1. Swap Chain
1.1 什么是Swap Chain?
- 我们都知道,DirectX12驱动的功能,仅仅是读取图形Resource数据,提交到Pipeline中各个Shader中,然后渲染出一帧帧的图像数据。最终的显示过程,还是要把帧数据给到Windows系统,交给DirectX10驱动来显示。
- 那么DirectX12把数据提交到什么地方呢?
这就是本文的主题:Swap Chain。在DX12 APP初始化的时候,必须要从DXGI库(一套统一的图形交互接口,由DirectX Runtime提供)调用CreateSwapChain()接口,创建一个或者多个Resource资源,并把这个资源通过RTV(Render Target View)的方式告诉DirectX12驱动:你渲染好的图像数据,全部按照一定的Format填充到我给你的Swap Chain Resource中,剩下的交给我显示。 - 从以上还能了解到一点,就是DirectX12驱动开发这边,必须要等DirectX10驱动Ready之后,才能实际开发。因为DirectX10驱动起来之后,Windows系统才能正常启动,DirectX12数据才能正常显示,所以也比较尴尬。
1.2 为什么叫Swap Chain?
- 我们知道GPU的渲染效率是很高的,相比之下,可能系统显示的速度跟不上GPU渲染的速度,为了把GPU的效率发挥到极致,我们可以这样做:
- DX12 APP初始化的时候,调用CreateSwapChain()创建2个RTV资源,2个RTV Resource大小格式全部一样,称之为Resource A&B。
- 在任意一个显示的时刻,GPU渲染好了Resource A,APP通过CPU&GPU之间的Fence机制(参考另一篇文章)得知Resouce A就绪,就把Resource A提交给系统显示,同时把Resource B提交给GPU渲染。这里Resource A称之为Front Buffer,Resource B称之为Back Buffer。
- 在渲染下一帧时,APP将Resource A&B交换角色,等GPU将Resource B渲染结束后,APP把Resource B提交给系统显示,同时把Resource A交给GPU渲染。
- 这里提交给系统显示时,给的都是指针而没有Resource Copy之类的动作,所以效率很高。
当然,如果GPU速度更快的话,我们也可以设置Triple Buffer,原理也是类似的。