驱动开发系列64 - glCompileShader实现之 GLSL normalize 精度优化
一:概述
glCompileShader 是将 GLSL 源码编译成GPU可以执行的中间表示或二进制代码, 在OpenGL实现中,GLSL的编译总共包含以下几个阶段:
1. 源码解析,将GLSL源码解析成抽象语法树。
2. 语义检查,检查变量类型,内建函数使用,向量/矩阵维度是否匹配等。
3. 中间表示,转换成GPU或驱动层可以理解的中间代码(LLVM IR)。
4. 优化,执行一系列pass,比如精度优化,常量折叠,死代码消除等。
5. 最终编译/链接,输出GPU可以执行的机器码
二:精度优化 pass 简介
前面说的比较笼统,只是有一个大致的步骤;下面介绍一个具体的实现细节,就是精度优化pass是怎么实现的,它做了什么。
先给出一个GLSL的示例, 精度优化 pass 的一个例子是优化 normalize的精度, 在 LLVM IR 中,normalize 会被展开成一系列指令: 计算平方和,开平方,逐分量除以长度。
#version 450l