openGL之API学习(七十八)SPIR-V
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相关推荐
- openGL之API学习(一八九)gl_Position gl_Vertex
gl_Position是顶点着色器(所有版本的顶点着色器)必须计算的值,是每个顶点的最终的位置信息.这里的顶点位置信息是通过glVertexAttribPointer上传的. #version 430 ...
- openGL之API学习(一八七)gl_Vertex
gl_Vertex表示传入进来的顶点 比如:三角形 正方体的顶点.从glsl 140开始就没有这个内置变量了. #version 430 uniform mat4 projMat; uniform m ...
- openGL之API学习(一八零)POINTS LINES TRIANGLES QUADS 绘图顺序规则
默认每一个图形的绘图方向是相同的,要么逆时针(默认方向)要么顺时针. 1.GL_TRIANGLES 是以每三个顶点绘制一个三角形.第一个三角形使用顶点v0,v1,v2,第二个使用v3,v4,v5,以此 ...
- JavaScript学习(七十八)—实现对数据的浅拷贝和深拷贝
JavaScript学习(七十八)-实现对数据的浅拷贝和深拷贝 一.浅拷贝 浅拷贝:对于引用类型的数据只拷贝该数据的地址,这种拷贝称为浅拷贝 注意:拷贝出来的数据和原有的数据指向同一个空间,即他们操作 ...
- 花书+吴恩达深度学习(十八)迁移学习和多任务学习
目录 0. 前言 1. 迁移学习 2. 多任务学习 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~ 花书+吴恩达深度学习(十八)迁移学习和多任务学习 花书+吴恩达深度学习(十 ...
- Java学习系列(十八)Java面向对象之基于UDP协议的网络通信
UDP协议:无需建立虚拟链路,协议是不可靠的. A节点以DatagramSocket发送数据包,数据报携带数据,数据报上还有目的目地地址,大部分情况下,数据报可以抵达:但有些情况下,数据报可能会丢失 ...
- 中文数字转换成阿拉伯数字(一千二百三十四万五千六百七十八-->12345678)
昨天老大问我又没有写过中文数字转换成阿拉伯数字,我说没有,我说那应该简单啊,就是将中文对应的数字换成阿拉伯数字就好了啊,比如一就换成1,二就换成2-十换成10.可是那么问题来了- 一十二呢-不能是11 ...
- python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置...
python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置 Download JetBrains Python IDE :: PyCharm http://ww ...
- windows内核开发学习笔记十八:IRP 处理的标准模式
windows内核开发学习笔记十八:IRP 处理的标准模式 在 Windows 内核中的请求基本上是通过 I/O Request Packet 完成的. I/O manager ---> Dis ...
- Polyworks脚本开发学习笔记(十八)-用SDK开发Polyworks插件
Polyworks脚本开发学习笔记(十八)-用SDK开发Polyworks插件 插件是由PolyWorks加载的动态链接库(DLL文件),然后查询Polyworks模块,以确定它们具有哪些功能,提供给 ...
最新文章
- 关于自定义控件设计时如何把属性写入aspx中的研究(上)
- 无悔入华夏怎么一直显示服务器,无悔入华夏完整版
- java删除表操作,JDBC删除表实例
- 小姐姐の福音!美图旗下美妆相机推出AI新功能“发型管家”
- Atitit 财政支出减少之道---------蹭银行与金融机构的补贴之道
- fences卸载_【设置方法】win10系统卸载fences的学习
- 小学生计算机画图熊猫,小学数学画图技能标准,小学数学示意图几种
- 2018 美团校招笔试题 K 的倍数
- 数据库应用之关系代数(relational algebra)
- sshd报错Privilege separation user sshd does not exist的解决办法
- 【日常】纪录一个愚蠢的问题
- 全志A10/A20 Bootloader加载过程分析
- 录像加文档,双管齐下!腾讯内部大热的Java知识宝典
- PyCharm激活记录
- C++查看变量类型办法(typeinfo)
- vue-router路由的安装、配置、具体用法和Vue-router学习笔记
- 新浪微博互粉php,新浪微博粉丝服务平台配置教程
- 计算机 右键 管理在哪,鼠标右键管理在哪?
- SOLO在windows 10环境下安装
- 毛不易被歌手淘汰?遗憾
热门文章
- 编程中经常遇到的调试没问题,运行却出错的一种原因
- Python实现常用的假设检验
- FastReport VCL如何在 Lazarus安装FastReport
- The eighth day
- 中兴2016校招软件在线笔试题
- 使用iTunes制作iPhone6s plus铃声
- UIUC计算机科学系博士,伊利诺伊大学香槟分校之计算机科学系
- Silverlig1.Silverlight读取外部XML加载配置-(使用WebClient读取XAP包同目录下的XML文件)...
- 我问我自己,你究竟想成为一个什么样的人?
- Android Studio Emulator 报错 detected adb