DirectX Intermediate Language之引言
DirectX 中间语言 DXIL
本文介绍了 DirectX 中间语言(DXIL)的设计,用于支持将 HLSL 编程语言直接映射到 LLVM IR 中间表示形式,以便在 GPU 驱动程序中使用。这个版本的规范基于 LLVM 3.7,并使用元数据语法。
在转换为低级别的DXIL IR之前,代码生成器会生成一个更高级别的IR,然后通过优化器将其转换为DXIL。这将高级构造(如用户定义类型、多维数组、矩阵和向量)降低到更简单的抽象,以便于驱动程序编译器中的快速即时编译。DXIL源自LLVM IR。
LLVM正在迅速成为现代编译技术中的事实标准。LLVM框架提供了几个独特的功能,如充满活力的生态系统、完整的编译框架、模块化设计和合理的文档。我们可以利用这些功能来实现两个重要的目标: (1)首先,统一着色器编译工具链。DXIL是IR生成器(如HLSL和其他领域特定语言的编译器)与IR消费者(如IHV驱动程序即时编译器或离线XBOX着色器编译器)之间的约定。此外,该设计还提供了将当前HLSL IL(本文称为DXBC IL)转换为DXIL的功能。
(2)其次,利用LLVM生态系统。微软将公开文档化DXIL,以吸引领域语言实现者并促进创新。使用基于LLVM的IR可以降低小团队的入门成本,因为小团队很可能将LLVM和Clang作为其主要编译框架。我们将提供DXIL验证器,以检查生成的DXIL的一致性。
下面的图示展示了这些组件之间的联系:
图中的"dxbc2dxil"元素是一个将现有的DXBC着色器字节码转换为DXIL的组件。优化器元素是一个组件,它接收高级别的IR,验证其有效性,对其进行优化,并生成有效的DXIL形式。验证器元素是一个公共组件,用于验证和签名DXIL。链接器是一个组件,它将预编译的DXIL库与入口函数结合起来,生成有效的着色器。
DXIL不支持之前的实现中存在的以下HLSL特性。:
- 着色器模型9及以下。微软可以通过DXIL能力级别来实现10level9着色器模型。
- Effects
- HLSL 接口。
- 着色器压缩和解压缩。
- 部分精度(Partial precision)。应使用半精度(Half)数据类型。
- min10float 类型. Half data type should be used instead.
- HLSL统一参数限定符
- 当前的fxc遗留兼容模式适用于旧的着色器模型(例如,c寄存器绑定)。
- PDB. 使用调试信息注释代替。
- 计算着色器模型 cs_4_0
- DXBC label, call,fcall constructs.
以下原则用于简化与LLVM组件的重用并增强可扩展性。
-
DXIL使用LLVM IR的子集,该子集对于HLSL是有意义的
-
不对核心LLVM IR进行修改;即不添加新指令或基本类型
-
通过元数据、LLVM内部函数或外部函数传递附加信息。
-
命名前缀: 'llvm.dx','llvm.dxil','dx.',和'dxil.' 被保留。
LLVM IR有三种等效形式:可读的人类形式、二进制(位码)形式和内存中的形式。DXIL是一种二进制格式,基于LLVM IR位码格式的子集。该文档仅使用可读的人类形式来描述DXIL。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?