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 450in 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];elsecolor = 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:    0OpCapability Shader%1 = OpExtInstImport "GLSL.std.450"OpMemoryModel Logical GLSL450OpEntryPoint Fragment %4 "main" %31 %33 %42 %57OpExecutionMode %4 OriginLowerLeft; Debug informationOpSource GLSL 450OpName %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 16OpMemberDecorate %17 0 Offset 0OpMemberDecorate %17 1 Offset 16OpMemberDecorate %17 2 Offset 96OpMemberDecorate %18 0 Offset 0OpMemberDecorate %18 1 Offset 112OpDecorate %18 BlockOpDecorate %20 DescriptorSet 0OpDecorate %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 FunctionOpStore %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 boolOpSelectionMerge %29 None              ; structured ifOpBranchConditional %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 %39OpStore %31 %40OpBranch %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 %45OpStore %31 %46OpBranch %29%29 = OpLabel                                ; endifOpStore %48 %35OpBranch %49%49 = OpLabelOpLoopMerge %51 %52 None               ; structured loopOpBranch %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 %58OpStore %31 %60OpBranch %52%52 = OpLabel                                ; continue target%61 = OpLoad %16 %48%62 = OpIAdd %16 %61 %21                     ; ++iOpStore %48 %62OpBranch %49                           ; loop back%51 = OpLabel                                ; loop merge pointOpReturnOpFunctionEnd

openGL之API学习(七十八)SPIR-V相关推荐

  1. openGL之API学习(一八九)gl_Position gl_Vertex

    gl_Position是顶点着色器(所有版本的顶点着色器)必须计算的值,是每个顶点的最终的位置信息.这里的顶点位置信息是通过glVertexAttribPointer上传的. #version 430 ...

  2. openGL之API学习(一八七)gl_Vertex

    gl_Vertex表示传入进来的顶点 比如:三角形 正方体的顶点.从glsl 140开始就没有这个内置变量了. #version 430 uniform mat4 projMat; uniform m ...

  3. openGL之API学习(一八零)POINTS LINES TRIANGLES QUADS 绘图顺序规则

    默认每一个图形的绘图方向是相同的,要么逆时针(默认方向)要么顺时针. 1.GL_TRIANGLES 是以每三个顶点绘制一个三角形.第一个三角形使用顶点v0,v1,v2,第二个使用v3,v4,v5,以此 ...

  4. JavaScript学习(七十八)—实现对数据的浅拷贝和深拷贝

    JavaScript学习(七十八)-实现对数据的浅拷贝和深拷贝 一.浅拷贝 浅拷贝:对于引用类型的数据只拷贝该数据的地址,这种拷贝称为浅拷贝 注意:拷贝出来的数据和原有的数据指向同一个空间,即他们操作 ...

  5. 花书+吴恩达深度学习(十八)迁移学习和多任务学习

    目录 0. 前言 1. 迁移学习 2. 多任务学习 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~ 花书+吴恩达深度学习(十八)迁移学习和多任务学习 花书+吴恩达深度学习(十 ...

  6. Java学习系列(十八)Java面向对象之基于UDP协议的网络通信

    UDP协议:无需建立虚拟链路,协议是不可靠的. A节点以DatagramSocket发送数据包,数据报携带数据,数据报上还有目的目地地址,大部分情况下,数据报可以抵达:但有些情况下,数据报可能会丢失 ...

  7. 中文数字转换成阿拉伯数字(一千二百三十四万五千六百七十八-->12345678)

    昨天老大问我又没有写过中文数字转换成阿拉伯数字,我说没有,我说那应该简单啊,就是将中文对应的数字换成阿拉伯数字就好了啊,比如一就换成1,二就换成2-十换成10.可是那么问题来了- 一十二呢-不能是11 ...

  8. python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置...

    python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置 Download JetBrains Python IDE :: PyCharm http://ww ...

  9. windows内核开发学习笔记十八:IRP 处理的标准模式

    windows内核开发学习笔记十八:IRP 处理的标准模式 在 Windows 内核中的请求基本上是通过 I/O Request Packet 完成的. I/O manager ---> Dis ...

  10. Polyworks脚本开发学习笔记(十八)-用SDK开发Polyworks插件

    Polyworks脚本开发学习笔记(十八)-用SDK开发Polyworks插件 插件是由PolyWorks加载的动态链接库(DLL文件),然后查询Polyworks模块,以确定它们具有哪些功能,提供给 ...

最新文章

  1. 关于自定义控件设计时如何把属性写入aspx中的研究(上)
  2. 无悔入华夏怎么一直显示服务器,无悔入华夏完整版
  3. java删除表操作,JDBC删除表实例
  4. 小姐姐の福音!美图旗下美妆相机推出AI新功能“发型管家”
  5. Atitit 财政支出减少之道---------蹭银行与金融机构的补贴之道
  6. fences卸载_【设置方法】win10系统卸载fences的学习
  7. 小学生计算机画图熊猫,小学数学画图技能标准,小学数学示意图几种
  8. 2018 美团校招笔试题 K 的倍数
  9. 数据库应用之关系代数(relational algebra)
  10. sshd报错Privilege separation user sshd does not exist的解决办法
  11. 【日常】纪录一个愚蠢的问题
  12. 全志A10/A20 Bootloader加载过程分析
  13. 录像加文档,双管齐下!腾讯内部大热的Java知识宝典
  14. PyCharm激活记录
  15. C++查看变量类型办法(typeinfo)
  16. vue-router路由的安装、配置、具体用法和Vue-router学习笔记
  17. 新浪微博互粉php,新浪微博粉丝服务平台配置教程
  18. 计算机 右键 管理在哪,鼠标右键管理在哪?
  19. SOLO在windows 10环境下安装
  20. 毛不易被歌手淘汰?遗憾

热门文章

  1. 编程中经常遇到的调试没问题,运行却出错的一种原因
  2. Python实现常用的假设检验
  3. FastReport VCL如何在 Lazarus安装FastReport
  4. The eighth day
  5. 中兴2016校招软件在线笔试题
  6. 使用iTunes制作iPhone6s plus铃声
  7. UIUC计算机科学系博士,伊利诺伊大学香槟分校之计算机科学系
  8. Silverlig1.Silverlight读取外部XML加载配置-(使用WebClient读取XAP包同目录下的XML文件)...
  9. 我问我自己,你究竟想成为一个什么样的人?
  10. Android Studio Emulator 报错 detected adb