Какие типы в 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.