知识卡片

特化常量:把编译期决定推迟到管线创建时刻

专业/工作 · 113.a

内容

如果两个着色器只有几处常量取值不同(比如某个开关是否打开、循环次数是多少),最直接的做法是维护两份几乎相同的源码,各自独立编译。Vulkan提供了”特化常量”:着色器编译成SPIR-V时先给这些常量赋一个默认值,真正生成可执行代码的时刻推迟到创建管线的那一步,届时可以传入新值覆盖默认值,编译器再据此做分支消除、循环展开、常量折叠等优化——同一份SPIR-V模板就能生成出多个针对不同常量值单独优化过的最终版本,不再需要维护和分别编译多份源码。这体现了一种”延迟绑定+编译期特化”的通用模式:把决定推迟到信息最全的那一刻再做,同时不放弃编译期优化的收益,在C++模板、JIT编译器的特化机制里也能看到同样的思路。

参考来源

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