2017-07-20 40 views
1

具有相同 操作数参数的非结构类型(标量,向量,数组等)不能是类型别名。对于非结构, 两种类型<id>只匹配 - 如果类型匹配。SPIR-V中的哪些类型不允许为别名?

这是什么意思?

#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

我的猜测:这意味着例如int和uint不能相同,即使它们可能具有相同的大小。对于float来说更是如此,你不能把float看作int,就像c,float f; int i = *((int *)&f)得到它的位。 – starmole

回答

1

我的猜测是,这个检验规则不幸的措辞,是指这个(2.8. Types and Variables of SPIR-V specification):

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

但有差异。例如。 “非集合”(即非结构+非集合)与“非结构”。

所以,它的意思是你不能做喜欢的东西: OpTypeInt id=1 bits=32 sign=0 // OK OpTypeInt id=1 bits=32 sign=1 // ERROR -- redefined result id OpTypeInt id=2 bits=32 sign=0 // ERROR -- uint32 already defined as id 1 OpTypeInt id=3 bits=32 sign=1 // OK

我没有看到这条规则在人类可读SPIR-V例如侵犯。

相关问题