2017-07-20 42 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例如侵犯。

相關問題