概述

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)的重要组成部分。