Vulkan
1. Vulkan简介
Vulkan是Khronos组织制定的“下一代”开放的图形显示API,是与DirectX12能够匹敌的GPU API标准。
这里我们仅仅讨论Vulkan着色器相关内容,与OpenGL的着色器需要使用GLSL语言编写不同的是,Vulkan着色器必须以二进制字节码的格式使用,而不是像GLSL这样具有比较好的可读性的语法。此字节格式称为SPIR-V,它可以与Vulkan和OpenCL一同使用。这是一种可以编写图形和计算着色器的格式。
使用二进制字节码格式的优点之一是使得GPU厂商编写将着色器代码转换为本地代码的编译器复杂度减少了很多。经验表明使用可读性比较强的语法,比如GLSL,一些GPU厂商能相当灵活地理解这个标准。这会导致一种情况发生,比如编写好,并在一个厂商的GPU运行的不错的着色器程序,可能在其他的GPU厂商的GPU驱动程序上运行异常,可能是语法的问题,或者更糟的是不同GPU厂商编写的编译器差异,导致着色器运行错误。如果直接使用编译好的二进制字节码格式,可以避免这种情况。
但是,并不意味着我们要手写字节码。Khronos发布了与厂商无关的编译器,它将GLSL编译成SPIR-V。该编译器用于验证着色器代码是否符合标准,并生成与Vulkan功能运行的SPRIR-V二进制文件。除此之外还可以将此编译器作为库在运行时编译生成SPRI-V,安卓平台就是如此使用。
2. Vulkan中编译框架
由于Vulkan规范中规定了Vulkan接口只能使用SPIR-V IR,所以Vulkan驱动省去了从GLSL语言编译成SPIR-V IR这一编译前端的工作,而只需要实现SPIR-V IR的优化和SPIR-V IR转换成具体的GPU硬件指令这两步骤,如下所示:
下面这张图能更详细的展示这种关系:
在实际的Vulkan驱动中,可能会将SPIR-V IR进一步转换成其他IR来进行优化,比如在Mesa的AMD GPU的Vulkan驱动中就将SPIR-V转换成LLVM IR进行优化,如下所示:
- 首先将SPIR-V IR转换成LLPC IR
- 接着将LLPC IR转换成LLVM IR
- 最后将LLVM IR转换成GCN指令
评论