GLSL #define GL_SPIRV 100说明

news/2024/11/24 4:21:32/

                              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代码是这样的

 
  1. #version 450

  2.  
  3. in vec4 color1;

  4. in vec4 multiplier;

  5. noperspective in vec4 color2;

  6. out vec4 color;

  7.  
  8. struct S {

  9. bool b;

  10. vec4 v[5];

  11. int i;

  12. };

  13.  
  14. uniform blockName {

  15. S s;

  16. bool cond;

  17. };

  18.  
  19. void main()

  20. {

  21. vec4 scale = vec4(1.0, 1.0, 2.0, 1.0);

  22.  
  23. if (cond)

  24. color = color1 + s.v[2];

  25. else

  26. color = sqrt(color2) * scale;

  27.  
  28. for (int i = 0; i < 4; ++i)

  29. color *= multiplier;

  30. }

翻译成SPIR-V是这样的

 
  1. ; Magic: 0x07230203 (SPIR-V)

  2. ; Version: 0x00010000 (Version: 1.0.0)

  3. ; Generator: 0x00080001 (Khronos Glslang Reference Front End; 1)

  4. ; Bound: 63

  5. ; Schema: 0

  6.  
  7. OpCapability Shader

  8. %1 = OpExtInstImport "GLSL.std.450"

  9. OpMemoryModel Logical GLSL450

  10. OpEntryPoint Fragment %4 "main" %31 %33 %42 %57

  11. OpExecutionMode %4 OriginLowerLeft

  12.  
  13. ; Debug information

  14. OpSource GLSL 450

  15. OpName %4 "main"

  16. OpName %9 "scale"

  17. OpName %17 "S"

  18. OpMemberName %17 0 "b"

  19. OpMemberName %17 1 "v"

  20. OpMemberName %17 2 "i"

  21. OpName %18 "blockName"

  22. OpMemberName %18 0 "s"

  23. OpMemberName %18 1 "cond"

  24. OpName %20 ""

  25. OpName %31 "color"

  26. OpName %33 "color1"

  27. OpName %42 "color2"

  28. OpName %48 "i"

  29. OpName %57 "multiplier"

  30.  
  31. ; Annotations (non-debug)

  32. OpDecorate %15 ArrayStride 16

  33. OpMemberDecorate %17 0 Offset 0

  34. OpMemberDecorate %17 1 Offset 16

  35. OpMemberDecorate %17 2 Offset 96

  36. OpMemberDecorate %18 0 Offset 0

  37. OpMemberDecorate %18 1 Offset 112

  38. OpDecorate %18 Block

  39. OpDecorate %20 DescriptorSet 0

  40. OpDecorate %42 NoPerspective

  41.  
  42. ; All types, variables, and constants

  43. %2 = OpTypeVoid

  44. %3 = OpTypeFunction %2 ; void ()

  45. %6 = OpTypeFloat 32 ; 32-bit float

  46. %7 = OpTypeVector %6 4 ; vec4

  47. %8 = OpTypePointer Function %7 ; function-local vec4*

  48. %10 = OpConstant %6 1

  49. %11 = OpConstant %6 2

  50. %12 = OpConstantComposite %7 %10 %10 %11 %10 ; vec4(1.0, 1.0, 2.0, 1.0)

  51. %13 = OpTypeInt 32 0 ; 32-bit int, sign-less

  52. %14 = OpConstant %13 5

  53. %15 = OpTypeArray %7 %14

  54. %16 = OpTypeInt 32 1

  55. %17 = OpTypeStruct %13 %15 %16

  56. %18 = OpTypeStruct %17 %13

  57. %19 = OpTypePointer Uniform %18

  58. %20 = OpVariable %19 Uniform

  59. %21 = OpConstant %16 1

  60. %22 = OpTypePointer Uniform %13

  61. %25 = OpTypeBool

  62. %26 = OpConstant %13 0

  63. %30 = OpTypePointer Output %7

  64. %31 = OpVariable %30 Output

  65. %32 = OpTypePointer Input %7

  66. %33 = OpVariable %32 Input

  67. %35 = OpConstant %16 0

  68. %36 = OpConstant %16 2

  69. %37 = OpTypePointer Uniform %7

  70. %42 = OpVariable %32 Input

  71. %47 = OpTypePointer Function %16

  72. %55 = OpConstant %16 4

  73. %57 = OpVariable %32 Input

  74.  
  75. ; All functions

  76. %4 = OpFunction %2 None %3 ; main()

  77. %5 = OpLabel

  78. %9 = OpVariable %8 Function

  79. %48 = OpVariable %47 Function

  80. OpStore %9 %12

  81. %23 = OpAccessChain %22 %20 %21 ; location of cond

  82. %24 = OpLoad %13 %23 ; load 32-bit int from cond

  83. %27 = OpINotEqual %25 %24 %26 ; convert to bool

  84. OpSelectionMerge %29 None ; structured if

  85. OpBranchConditional %27 %28 %41 ; if cond

  86. %28 = OpLabel ; then

  87. %34 = OpLoad %7 %33

  88. %38 = OpAccessChain %37 %20 %35 %21 %36 ; s.v[2]

  89. %39 = OpLoad %7 %38

  90. %40 = OpFAdd %7 %34 %39

  91. OpStore %31 %40

  92. OpBranch %29

  93. %41 = OpLabel ; else

  94. %43 = OpLoad %7 %42

  95. %44 = OpExtInst %7 %1 Sqrt %43 ; extended instruction sqrt

  96. %45 = OpLoad %7 %9

  97. %46 = OpFMul %7 %44 %45

  98. OpStore %31 %46

  99. OpBranch %29

  100. %29 = OpLabel ; endif

  101. OpStore %48 %35

  102. OpBranch %49

  103. %49 = OpLabel

  104. OpLoopMerge %51 %52 None ; structured loop

  105. OpBranch %53

  106. %53 = OpLabel

  107. %54 = OpLoad %16 %48

  108. %56 = OpSLessThan %25 %54 %55 ; i < 4 ?

  109. OpBranchConditional %56 %50 %51 ; body or break

  110. %50 = OpLabel ; body

  111. %58 = OpLoad %7 %57

  112. %59 = OpLoad %7 %31

  113. %60 = OpFMul %7 %59 %58

  114. OpStore %31 %60

  115. OpBranch %52

  116. %52 = OpLabel ; continue target

  117. %61 = OpLoad %16 %48

  118. %62 = OpIAdd %16 %61 %21 ; ++i

  119. OpStore %48 %62

  120. OpBranch %49 ; loop back

  121. %51 = OpLabel ; loop merge point

  122. OpReturn

  123. OpFunctionEnd

 


http://www.ppmy.cn/news/168614.html

相关文章

Linux压缩与解压缩

目录 Linux压缩与解压缩 zip和unzip命令 定义 语法格式 参数及其作用 案例 素材准备 案例1 --- 使用zip也所文件test1.txt 案例2 --- 压缩率为最高压缩test2.txt 案例3 --- 将当前目录dir1连通目录下文件其压缩 实例4 --- 向压缩文件中test1.zip中添加test2.txt文件 实例5…

Mapbox-gl(not ready)

学习mapbox博文传输带vue上使用mapbox初始化第一个mapboxgeoservegeojsoncanvasMapbox-GL样式 -->sources&#xff08;数据来源&#xff09;和layers&#xff08;界面呈现的样子&#xff09;绘制点绘制线设置点的样式解决点重合问题设置线的样式线随点的移动改变3D地图的实现…

public interface GL10 extends GL

官方注释&#xff1a;https://www.khronos.org/registry/OpenGL-Refpages/ 有一点要注意的是 GL10 意味着 这个借口遵从 OpenGL ES 1.0 规范。(以此类推) 本片文章参考 OpenGL ES 1.1 完成 以下为私人注释。请以官方为准。 好多方法直接百度就可以找到前人的经验 /* //de…

GL线程

1 public class MiniLauncher extends AndroidApplication implements MenuActionListener {2 3 public View glView null;4 public DesktopListener mListener;5 Override6 public void onCreate(Bundle savedInstanceState) {7 8 //得到的是一个s…

Open GL的渲染流程

OpenGL渲染流程 </h1><div class"clear"></div><div class"postBody">一.什么是openGL OpenGL被定义为“图形硬件的一种软件接口”。从本质上说&#xff0c;它是一个3D图形和模型库&#xff0c;具有高度的可移植性&#xff0c;具有…

记录:微星 GE63 屏轴断裂 之后。。。

2022/11/25 记录 微星 GE63 1070 笔记本&#xff0c;使用的第三年&#xff0c;已过保了一年&#xff0c;上周使用时&#xff0c;准备合上笔记本盖。啪一下&#xff0c;左侧屏轴断裂&#xff0c;B面翘起&#xff0c;A面左下角轴盖断了一截。 网上好多人都有类似的情况&#xff…

## 微星gl63笔记本安装ubuntu18.04双系统

微星gl63笔记本安装ubuntu18.04双系统 List item 笔记本安装ubuntu18.04双系统&#xff0c;windows10本身是自带的&#xff0c;想再安装一个Ubuntu18.04构成双系统。 首先&#xff0c;利用UltralSO做好ubuntu18.04启动盘。U盘内存4g以上就可以。 Ubuntu下载地址 https://ubun…

记录微星gl63的ubuntu 18.04重装rtl8821ce驱动,重获wifi

由于不知是windows更新还是其他原因&#xff0c;双系统的Ubuntu 18.04在一次重启后就没有WiFi功能了。没办法只能重新安装rtl8821ce驱动&#xff0c;我的系统内核是5.4.0-53-generic&#xff0c; 1.打开rtl8821ce文件夹&#xff0c;再打开makefile文件夹&#xff0c;找到如下图…