Какие типы в SPIR-V не могут быть псевдонимами типов?

Неструктурные типы (скаляры, векторы, массивы и т. Д.) С одинаковой параметризацией операнда не могут быть псевдонимами типов. Для неструктур, два типа <id>s соответствуют if-and-only-if, если типы совпадают.

Что именно это означает?

#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 ответ

Решение

Я предполагаю, что это правило проверки, к сожалению, сформулировано и относится к нему ( 2.8. Типы и переменные спецификации SPIR-V):

Два разных типа <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.

Другие вопросы по тегам