微软方面提出了一项提案,希望为上游 LLVM/Clang 编译器贡献 HLSL、DirectX 和 Vulkan 图形支持。
原因在于,其现有的 HLSL 编译器 DirectX Shader Compiler (DXC) 基于旧的 LLVM/Clang 3.7 分支。而微软计划将其编译器更新到最新的 LLVM,以便为 HLSL 带来新的 C++ 语言功能和工具改进。微软于 2017 年宣布了开源 DirectX 着色器编译器。
“虽然我们可以在自己的分叉中做到这一点,但我们相信将我们的编译器和社区与 LLVM 社区集成将使我们能够扩展这两个社区,并为我们的用户提供更好的编译器。”
微软方面表示,他们有兴趣支持三个主要的 CodeGen targets。首要任务是支持 DXC 目前支持的 code generation targets:DirectX 中间语言 (DXIL) 和 SPIR-V;将来可能会添加对 DirectX 9 到 DirectX 11 使用的 DirectX Bytecode (DXBC) 的支持。
“LLVM 社区中已经有很多关于 SPIR-V 的讨论。SPIR-V 是用于 GPU 编程的虚拟 ISA。由于编写 HLSL 的开发人员广泛使用 SPIR-V code generation,这对我们来说也是一个至关重要的特性。我们可以通过多种方式支持 SPIR-V,我们期待与社区积极合作来解决这个问题。”
鉴于 LLVM/Clang 3.7 已经有 7 年的历史,微软不打算将现有的编译器合并到现代 LLVM 中,而是计划在 LLVM/main 中逐步重新实现编译器功能。这意味着将特定于 HLSL 的语言选项添加到 Clang 前端以及对 Clang 和 LLVM 的 DirectX target 支持。
“Clang DirectX target 实现类似于 CUDA 或 OpenCL targets,在 LLVM 中,我们将添加一个 DirectX target 以包含我们的 codegen passes 并 emit DXIL。通过将尽可能多的 DXIL 特定代码隔离到目标中,我们希望最大限度地降低社区维护我们遗留的 bitcode 编写支持的成本。
我们打算采用与当前编译器不同的方法在 Clang 中实现 HLSL 支持,所以虽然我们可以将当前的实现作为语言特性的参考和测试文件的源,但我们不会将其作为实现细节的模型。
假设这个提议是可以接受的,那么前几个补丁就可以立即开始发布以供审查。随着我们的前进,我们希望建立一个 HLSL 工作组,该工作组将定期召开会议,讨论和跟踪进度并协调贡献者之间的工作。Microsoft 承诺将 Clang 的功能与 DXC 看齐,但 HLSL 社区正在支持这项工作,我们希望在 HLSL 支持功能完成后将开发完全转移到 LLVM/main。”