概述
SPIR-V (Standard Portable Intermediate Representation - Vulkan) 是一种中间表示语言 (IR),主要用于 GPU 计算和图形领域。
基本定义
- 一种二进制中间码格式
- Vulkan和OpenCL的标准着色器格式
- 由Khronos Group开发和维护
主要用途
- 着色器程序的编译目标
- 高级着色器语言 (如 GLSL, HLSL) 的中间表示
- 跨平台的 shader 交换格式
- GPU 计算程序的标准格式
优势
- 二进制格式,加载更快
- 跨平台兼容性好
- 易于验证和优化
- 可以支持多种源语言
- 减少驱动程序的复杂性
编译流程
高级着色器语言(GLSL/HLSL)
↓
SPIR-V编译器
↓
SPIR-V二进制码
↓
GPU驱动程序编译器
↓
GPU原生代码
工具链
- glslangValidator - GLSL 到 SPIR-V 的编译器
- spirv-opt - SPIR-V 优化器
- spirv-cross - SPIR-V 的反编译器
- DXC - HLSL 到 SPIR-V 的编译器
示例:GLSL 到 SPIR-V 的转换
// 顶点着色器 shader.vert
#version 450
layout(location = 0) in vec3 pos;
void main() {
gl_Position = vec4(pos, 1.0);
}
// 编译命令
glslangValidator -V shader.vert -o shader.vert.spv在 Vulkan 中使用
// 加载SPIR-V代码
std::vector<uint32_t> code = loadSpirV("shader.spv");
// 创建着色器模块
VkShaderModuleCreateInfo createInfo{};
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
createInfo.codeSize = code.size() * sizeof(uint32_t);
createInfo.pCode = code.data();
VkShaderModule shaderModule;
vkCreateShaderModule(device, &createInfo, nullptr, &shaderModule);主要特点
- 类似汇编语言的格式
- 强类型系统
- 显式控制流
- 模块化设计
- 支持多种内存模型
使用 SPIR-V 的好处是可以统一不同 GPU 厂商的着色器编译流程,提高跨平台兼容性,同时也简化了驱动程序的实现。它是现代图形 API(特别是 Vulkan)的重要组成部分。