这里是SunshineBooming,GPU公司一枚小小的Driver工程师,主要工作是写DirectX12 Driver,我会持续更新这个DX12 Spec系列,可能比较冷门,但是都是干货和工作中的心得体会,有任何GPU相关的问题都可以在评论区互动,知无不言:
目录
1. directX12是什么?
- directx 12(简称dx12)是微软开发的图形应用程序接口(api)的最新版本,于2014年发布,专为windows 10及以上系统设计。它通过更底层的硬件控制和多线程优化,显著提升了图形渲染效率和硬件资源利用率。
- 与directx 9/10/11相比,directx 12提供底层api(类似AMD Mantle),允许开发者直接管理gpu资源和命令列表,减少驱动干预。完美支持多核cpu,任务可线性分配到多个核心,四核性能可达单核的4倍,尤其适合现代多核处理器。加入异步计算(允许gpu同时处理图形和计算任务)、光线追踪(需硬件支持)及显式多gpu协作(如同时调用独立显卡和集成显卡)。
- 因为更贴近硬件特性,使用directx12来进行图形开发,也对应用开发者提出了更高的要求,dx12需要开发者深入理解硬件架构(如显存分配、管线同步),而dx9/10/11则更容易上手。
2. directx12架构
2.1 总体架构
- 参考官方文档:https://learn.microsoft.com/zh-cn/windows-hardware/drivers/display/windows-vista-and-later-display-driver-model-architecture
- 我根据工作经验,拓展总结了一下:
2.2 架构理解
2.2.1 directx runtime
- 上图红色部分都是windows系统实现的系统层,这也是directx架构和vulkan等同级别图形驱动框架主要的差异点:微软帮你作了中间系统层,而vulkan等则是app直接call到driver内。
- 优点是,能预防app和driver的低级错误,提升开发效率。如果说app开发者水平不高,代码有明显错误,directx12 runtime是会直接报错的。相应的微软也提供了一套完整的directx12 debug layer,app开发调试过程中,可以选择打开debug layer,开发过程中可以看到完整的debug信息,能规避常见的错误,提升开发效率。
- 缺点是,中间runtime层不透明,对于driver开发者不友好。系统往往会在app和driver之间作各类转译,遇到复杂的问题,基本就麻爪了。
2.2.2 umd & kmd
- umd和kmd都是gpu驱动层,需要gpu硬件厂商去实现的部分。
- 在架构上,这样区切分的意图也是很明显的:增强系统稳定性。
- driver会将主要的功能实现部分:包括各种特性实现,resource allocation,gpu硬件指令生成,shader编译(HLSL),放在umd层。umd层即使挂掉,也只会影响当前调用driver的app,而不会影响整个windows系统。
- 而kmd层,则只会实现与gpu硬件直接相关的:gpu硬件指令传输,resource allocation,硬件状态监测。kmd层如果挂掉,windows系统大概率也会挂掉,直接表现就是系统蓝屏。
2.2.3 gpu硬件
- driver层,通过umd-kmd-kernel runtime这样一套流程,生成具体的gpu指令后,directx kernel runtime会通过pcie总线(一般都是通过pcie总线),将存放硬件指令的dma buffer地址,写到gpu硬件寄存器中,然后trigger gpu硬件执行指令,生成最后的渲染结果。
3. 参考资料
- a trip through the grapics pipeline(这个网上很多链接,就不贴pdf了)
- https://learn.microsoft.com/zh-cn/windows-hardware/drivers/display/windows-vista-and-later-display-driver-model-architecture