GLSL #define GL_SPIRV 100说明
版权
hankern
https://blog.csdn.net/hankern/article/details/90690297
Standard, Portable Intermediate Representation - V (SPIR-V)
OpenGL 4.6的最大变化就是 支持SPIR-V,一种用于GPU通用计算和图形学的中间语言,Khronos开发设计,最初是为OpenCL规范准备的,和下一代图形标准Vulkan差不多同时提出,也在不断发展完善。
SPIR-V是一种简单的二元中间语言,用于图形着色和计算内核。SPIR-V模块包含多个入口点,在入口点的调用树中具有潜在的共享函数。每个函数都包含基本块的控制流图(CFG),以及表示结构化控制流的可选指令。加载/存储指令用于访问声明的变量,其中包括所有输入/输出(IO)。绕过加载/存储的中间结果使用静态单一分配(SSA)表示。数据对象是用分层类型信息逻辑表示的:不存在聚合的扁平化或对物理寄存器组的分配等。可选的寻址模型确定是否可以使用常规指针操作,或者内存访问是纯逻辑的。
SPIR-V的目标是:
为出现在khronos shaders/kernels中的所有功能提供一种简单的二进制中间语言。
具有简洁、透明、独立的规范(章节规范和二进制形式)。
很容易映射到其他中间语言。
是API传递给驱动程序以设置着色器/内核的形式。
可以被新的高端语言的前端所瞄准。
允许脱机完成编译和反射的第一步。
足够低的级别,需要反向工程步骤来重新构造源代码。
通过启用共享工具来生成或操作它来提高可移植性。
允许将核心规范与特定于源语言的内置函数集分离。
减少应用程序运行时的编译时间。(在应用程序运行时消除大部分编译时间不是此中间语言的目标。目标特定的寄存器分配和调度仍然需要花费大量时间。)
允许脱机进行一些优化。
SPIR-V工作过程是这样的:
glsl代码是这样的
-
#version 450
-
in vec4 color1;
-
in vec4 multiplier;
-
noperspective in vec4 color2;
-
out vec4 color;
-
struct S {
-
bool b;
-
vec4 v[5];
-
int i;
-
};
-
uniform blockName {
-
S s;
-
bool cond;
-
};
-
void main()
-
{
-
vec4 scale = vec4(1.0, 1.0, 2.0, 1.0);
-
if (cond)
-
color = color1 + s.v[2];
-
else
-
color = sqrt(color2) * scale;
-
for (int i = 0; i < 4; ++i)
-
color *= multiplier;
-
}
翻译成SPIR-V是这样的
-
; Magic: 0x07230203 (SPIR-V)
-
; Version: 0x00010000 (Version: 1.0.0)
-
; Generator: 0x00080001 (Khronos Glslang Reference Front End; 1)
-
; Bound: 63
-
; Schema: 0
-
OpCapability Shader
-
%1 = OpExtInstImport "GLSL.std.450"
-
OpMemoryModel Logical GLSL450
-
OpEntryPoint Fragment %4 "main" %31 %33 %42 %57
-
OpExecutionMode %4 OriginLowerLeft
-
; Debug information
-
OpSource GLSL 450
-
OpName %4 "main"
-
OpName %9 "scale"
-
OpName %17 "S"
-
OpMemberName %17 0 "b"
-
OpMemberName %17 1 "v"
-
OpMemberName %17 2 "i"
-
OpName %18 "blockName"
-
OpMemberName %18 0 "s"
-
OpMemberName %18 1 "cond"
-
OpName %20 ""
-
OpName %31 "color"
-
OpName %33 "color1"
-
OpName %42 "color2"
-
OpName %48 "i"
-
OpName %57 "multiplier"
-
; Annotations (non-debug)
-
OpDecorate %15 ArrayStride 16
-
OpMemberDecorate %17 0 Offset 0
-
OpMemberDecorate %17 1 Offset 16
-
OpMemberDecorate %17 2 Offset 96
-
OpMemberDecorate %18 0 Offset 0
-
OpMemberDecorate %18 1 Offset 112
-
OpDecorate %18 Block
-
OpDecorate %20 DescriptorSet 0
-
OpDecorate %42 NoPerspective
-
; All types, variables, and constants
-
%2 = OpTypeVoid
-
%3 = OpTypeFunction %2 ; void ()
-
%6 = OpTypeFloat 32 ; 32-bit float
-
%7 = OpTypeVector %6 4 ; vec4
-
%8 = OpTypePointer Function %7 ; function-local vec4*
-
%10 = OpConstant %6 1
-
%11 = OpConstant %6 2
-
%12 = OpConstantComposite %7 %10 %10 %11 %10 ; vec4(1.0, 1.0, 2.0, 1.0)
-
%13 = OpTypeInt 32 0 ; 32-bit int, sign-less
-
%14 = OpConstant %13 5
-
%15 = OpTypeArray %7 %14
-
%16 = OpTypeInt 32 1
-
%17 = OpTypeStruct %13 %15 %16
-
%18 = OpTypeStruct %17 %13
-
%19 = OpTypePointer Uniform %18
-
%20 = OpVariable %19 Uniform
-
%21 = OpConstant %16 1
-
%22 = OpTypePointer Uniform %13
-
%25 = OpTypeBool
-
%26 = OpConstant %13 0
-
%30 = OpTypePointer Output %7
-
%31 = OpVariable %30 Output
-
%32 = OpTypePointer Input %7
-
%33 = OpVariable %32 Input
-
%35 = OpConstant %16 0
-
%36 = OpConstant %16 2
-
%37 = OpTypePointer Uniform %7
-
%42 = OpVariable %32 Input
-
%47 = OpTypePointer Function %16
-
%55 = OpConstant %16 4
-
%57 = OpVariable %32 Input
-
; All functions
-
%4 = OpFunction %2 None %3 ; main()
-
%5 = OpLabel
-
%9 = OpVariable %8 Function
-
%48 = OpVariable %47 Function
-
OpStore %9 %12
-
%23 = OpAccessChain %22 %20 %21 ; location of cond
-
%24 = OpLoad %13 %23 ; load 32-bit int from cond
-
%27 = OpINotEqual %25 %24 %26 ; convert to bool
-
OpSelectionMerge %29 None ; structured if
-
OpBranchConditional %27 %28 %41 ; if cond
-
%28 = OpLabel ; then
-
%34 = OpLoad %7 %33
-
%38 = OpAccessChain %37 %20 %35 %21 %36 ; s.v[2]
-
%39 = OpLoad %7 %38
-
%40 = OpFAdd %7 %34 %39
-
OpStore %31 %40
-
OpBranch %29
-
%41 = OpLabel ; else
-
%43 = OpLoad %7 %42
-
%44 = OpExtInst %7 %1 Sqrt %43 ; extended instruction sqrt
-
%45 = OpLoad %7 %9
-
%46 = OpFMul %7 %44 %45
-
OpStore %31 %46
-
OpBranch %29
-
%29 = OpLabel ; endif
-
OpStore %48 %35
-
OpBranch %49
-
%49 = OpLabel
-
OpLoopMerge %51 %52 None ; structured loop
-
OpBranch %53
-
%53 = OpLabel
-
%54 = OpLoad %16 %48
-
%56 = OpSLessThan %25 %54 %55 ; i < 4 ?
-
OpBranchConditional %56 %50 %51 ; body or break
-
%50 = OpLabel ; body
-
%58 = OpLoad %7 %57
-
%59 = OpLoad %7 %31
-
%60 = OpFMul %7 %59 %58
-
OpStore %31 %60
-
OpBranch %52
-
%52 = OpLabel ; continue target
-
%61 = OpLoad %16 %48
-
%62 = OpIAdd %16 %61 %21 ; ++i
-
OpStore %48 %62
-
OpBranch %49 ; loop back
-
%51 = OpLabel ; loop merge point
-
OpReturn
-
OpFunctionEnd