知识卡片

SPIR-V中间表示让驱动摆脱语言差异

专业/工作 · 113

内容

GLSL这类高级着色语言里有很多隐式规则(比如只支持一种内存模型,不需要显式声明),编译器和驱动要理解各家厂商、各种版本的高级语言差异,兼容性成本很高。Vulkan不直接接受高级着色语言,而是只认一种二进制中间表示SPIR-V:所有原本隐式的东西(内存模型、入口点、每个类型和函数的依赖关系)都变成显式的指令流,且采用SSA形式(每个虚拟寄存器只被赋值一次),机器解析和验证起来更简单、更少歧义。高级语言(GLSL或其他)到SPIR-V的编译在驱动之外完成,驱动只需要面对一种统一、显式、结构清晰的输入格式。这是编译器设计里”中间表示解耦前端语言与后端实现”的经典思路:前端语言可以百花齐放,只要都能编译到同一份IR,后端就不必关心它们的差异。

参考来源

《Vulkan 应用开发指南》第6章《着色器和管线》