SPIR-V中哪些类型不允许是类型别名?

时间:2017-07-20 07:06:50

标签: vulkan spir-v

  

具有相同的非结构类型(标量,向量,数组等)   操作数参数化不能是类型别名。对于非结构,   如果类型匹配,则两种类型<id>匹配if-and-only。

这究竟是什么意思?

#version 400

void main()
{
  uint a = 4;
  uint b = 5;
}

使用glslang编译此着色器会导致

; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 1
; Bound: 12
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Vertex %main "main"
               OpSource GLSL 400
               OpName %main "main"
               OpName %a "a"
               OpName %b "b"
       %void = OpTypeVoid
          %3 = OpTypeFunction %void
       %uint = OpTypeInt 32 0
%_ptr_Function_uint = OpTypePointer Function %uint
     %uint_4 = OpConstant %uint 4
     %uint_5 = OpConstant %uint 5
       %main = OpFunction %void None %3
          %5 = OpLabel
          %a = OpVariable %_ptr_Function_uint Function
          %b = OpVariable %_ptr_Function_uint Function
               OpStore %a %uint_4
               OpStore %b %uint_5
               OpReturn
               OpFunctionEnd

此处%uint = OpTypeInt 32 0多次使用,%_ptr_Function_uint也使用了两次。

这条规则在哪里适用?

1 个答案:

答案 0 :(得分:1)

我的猜测是,验证规则很遗憾,并且引用了这个(2.8. Types and Variables of SPIR-V specification):

  

根据定义,两种不同类型的<id>形式有两种不同的类型。声明具有相同操作码和操作数的多个聚合类型<id>是有效的。这是为了允许具有相同结构的多个聚合类型实例以不同方式进行修饰。 (不需要不同的装饰;允许两个不同的聚合类型<id>具有相同的声明和装饰,并且仍然是两种不同的类型。)非聚合类型是不同的:声明多个类型{无效{ {1}}用于相同的标量,向量或矩阵类型。也就是说,非聚合类型声明必须都具有不同的操作码或操作数。 (请注意,非聚合类型无法以影响其类型的方式进行修饰。)

但是存在差异。例如。 &#34;非聚合&#34;(即非结构+非数组)vs&#34;非结构&#34;。

所以,这意味着你不能做的事情如下: <id>

我在人类可读的SPIR-V示例中没有看到违反此规则。