什么是 SPIR-V

请阅读 SPIRV-Guide 获取有关 SPIR-V 的更详细信息

SPIR-V 是图形着色器阶段和计算内核的二进制中间表示。使用 Vulkan,应用程序仍然可以使用高级着色语言(如 GLSL 或 HLSL)编写着色器,但在使用 vkCreateShaderModule 时需要 SPIR-V 二进制文件。Khronos 有一篇非常好的关于 SPIR-V 及其优点的 白皮书,以及对该表示形式的高级描述。在 Vulkan DevDay 2016 上,Khronos 还有两个精彩的演示文稿,此处此处两个演示的视频)。

SPIR-V 接口和功能

Vulkan 有一个完整的章节定义了 Vulkan 如何与 SPIR-V 着色器进行交互。大多数与 SPIR-V 交互的有效用法发生在着色器编译在一起的管线创建过程中。

SPIR-V 有许多功能,因为它还有 Vulkan 以外的其他目标。要查看 Vulkan 需要支持的功能,可以参考 附录。Vulkan 中的某些扩展和功能只是为了检查是否支持某些 SPIR-V 功能。

编译器

glslang

glslang 是 Khronos 用于 GLSL、HLSL 和 ESSL 的参考前端,也是示例 SPIR-V 生成器。包含一个独立的 glslangValidator 工具,可用于从 GLSL、HLSL 和 ESSL 创建 SPIR-V。

Shaderc

Google 托管的 Vulkan 着色器编译的工具、库和测试集合。它包含 glslc,它包装了 glslangSPIRV-Tools 中的核心功能。Shaderc 还包含 spvc,它包装了 SPIRV-CrossSPIRV-Tools 中的核心功能。

Shaderc 将这两个工具构建为独立的命令行工具 (glslc) 以及要链接的库 (libshaderc)。

Clspv

Clspv 是一个原型编译器,用于将 OpenCL C 的子集编译为 SPIR-V,以用作 Vulkan 计算着色器。

工具和生态系统

有一个丰富的工具生态系统可以利用 SPIR-V。Vulkan SDK 概述了为开发人员构建和打包的所有 SPIR-V 工具。

SPIRV-Tools

Khronos SPIRV-Tools 项目提供 C 和 C++ API 以及命令行界面来处理 SPIR-V 模块。有关更多信息,请参阅 SPIRV-Guide

SPIRV-Cross

Khronos SPIRV-Cross 项目是一个实用的工具和库,用于对 SPIR-V 执行反射并将 SPIR-V 反汇编回所需的高级着色语言。有关更多详细信息,Hans Kristian,SPIR-V Cross 的主要开发人员,就创建 SPIR-V Cross 等工具所需的工作,在 2018 Vulkanised (视频) 和 2019 Vulkanised (视频) 上做了两个精彩的演讲。

what_is_spirv_spriv_cross.png

SPIRV-LLVM

Khronos SPIRV-LLVM 项目是一个具有 SPIR-V 支持的 LLVM 框架。它旨在包含 LLVM 和 SPIR-V 之间的双向转换器。它还用作基于 LLVM 的面向 SPIR-V 的前端编译器的基础。