Skip to content

Commit ebe8dde

Browse files
Various SPIRV fixes. (shader-slang#3231)
* Various SPIRV fixes. - Geometry shader support (WIP). - Fix texture get dimension and load. - Fold global GetElement(MakeArray/MakeVector) insts. - Call spvopt to inline all functions. - Translate OpImageSubscript. - Emit struct member names and global variable names. - Fix lowering of OpBitNot -> OpNot, instead of OpBitReverse. * Fix test. * Fix geometry shader. * Fix geometry shader emit. * Add atomic Image access test. * Fix tests. * don't fail if spirv-opt fails. * Update comments. * Fix test. * Cleanups. * indentation --------- Co-authored-by: Yong He <yhe@nvidia.com> Co-authored-by: Ellie Hermaszewska <ellieh@nvidia.com>
1 parent c5c8cfb commit ebe8dde

33 files changed

+1513
-294
lines changed

build/visual-studio/slang/slang.vcxproj

+4
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,7 @@ IF EXIST ..\..\..\external\slang-glslang\bin\windows-aarch64\release\slang-glsla
355355
<ClInclude Include="..\..\..\source\slang\slang-ir-address-analysis.h" />
356356
<ClInclude Include="..\..\..\source\slang\slang-ir-any-value-inference.h" />
357357
<ClInclude Include="..\..\..\source\slang\slang-ir-any-value-marshalling.h" />
358+
<ClInclude Include="..\..\..\source\slang\slang-ir-array-reg-to-mem.h" />
358359
<ClInclude Include="..\..\..\source\slang\slang-ir-augment-make-existential.h" />
359360
<ClInclude Include="..\..\..\source\slang\slang-ir-autodiff-cfg-norm.h" />
360361
<ClInclude Include="..\..\..\source\slang\slang-ir-autodiff-fwd.h" />
@@ -505,6 +506,7 @@ IF EXIST ..\..\..\external\slang-glslang\bin\windows-aarch64\release\slang-glsla
505506
<ClInclude Include="..\..\..\source\slang\slang-serialize-types.h" />
506507
<ClInclude Include="..\..\..\source\slang\slang-serialize-value-type-info.h" />
507508
<ClInclude Include="..\..\..\source\slang\slang-serialize.h" />
509+
<ClInclude Include="..\..\..\source\slang\slang-spirv-opt.h" />
508510
<ClInclude Include="..\..\..\source\slang\slang-spirv-val.h" />
509511
<ClInclude Include="..\..\..\source\slang\slang-stdlib-textures.h" />
510512
<ClInclude Include="..\..\..\source\slang\slang-syntax.h" />
@@ -572,6 +574,7 @@ IF EXIST ..\..\..\external\slang-glslang\bin\windows-aarch64\release\slang-glsla
572574
<ClCompile Include="..\..\..\source\slang\slang-ir-address-analysis.cpp" />
573575
<ClCompile Include="..\..\..\source\slang\slang-ir-any-value-inference.cpp" />
574576
<ClCompile Include="..\..\..\source\slang\slang-ir-any-value-marshalling.cpp" />
577+
<ClCompile Include="..\..\..\source\slang\slang-ir-array-reg-to-mem.cpp" />
575578
<ClCompile Include="..\..\..\source\slang\slang-ir-augment-make-existential.cpp" />
576579
<ClCompile Include="..\..\..\source\slang\slang-ir-autodiff-cfg-norm.cpp" />
577580
<ClCompile Include="..\..\..\source\slang\slang-ir-autodiff-fwd.cpp" />
@@ -716,6 +719,7 @@ IF EXIST ..\..\..\external\slang-glslang\bin\windows-aarch64\release\slang-glsla
716719
<ClCompile Include="..\..\..\source\slang\slang-serialize-types.cpp" />
717720
<ClCompile Include="..\..\..\source\slang\slang-serialize.cpp" />
718721
<ClCompile Include="..\..\..\source\slang\slang-spirv-core-grammar-embed.cpp" />
722+
<ClCompile Include="..\..\..\source\slang\slang-spirv-opt.cpp" />
719723
<ClCompile Include="..\..\..\source\slang\slang-spirv-val.cpp" />
720724
<ClCompile Include="..\..\..\source\slang\slang-stdlib-api.cpp" />
721725
<ClCompile Include="..\..\..\source\slang\slang-stdlib-textures.cpp" />

build/visual-studio/slang/slang.vcxproj.filters

+12
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,9 @@
153153
<ClInclude Include="..\..\..\source\slang\slang-ir-any-value-marshalling.h">
154154
<Filter>Header Files</Filter>
155155
</ClInclude>
156+
<ClInclude Include="..\..\..\source\slang\slang-ir-array-reg-to-mem.h">
157+
<Filter>Header Files</Filter>
158+
</ClInclude>
156159
<ClInclude Include="..\..\..\source\slang\slang-ir-augment-make-existential.h">
157160
<Filter>Header Files</Filter>
158161
</ClInclude>
@@ -603,6 +606,9 @@
603606
<ClInclude Include="..\..\..\source\slang\slang-serialize.h">
604607
<Filter>Header Files</Filter>
605608
</ClInclude>
609+
<ClInclude Include="..\..\..\source\slang\slang-spirv-opt.h">
610+
<Filter>Header Files</Filter>
611+
</ClInclude>
606612
<ClInclude Include="..\..\..\source\slang\slang-spirv-val.h">
607613
<Filter>Header Files</Filter>
608614
</ClInclude>
@@ -800,6 +806,9 @@
800806
<ClCompile Include="..\..\..\source\slang\slang-ir-any-value-marshalling.cpp">
801807
<Filter>Source Files</Filter>
802808
</ClCompile>
809+
<ClCompile Include="..\..\..\source\slang\slang-ir-array-reg-to-mem.cpp">
810+
<Filter>Source Files</Filter>
811+
</ClCompile>
803812
<ClCompile Include="..\..\..\source\slang\slang-ir-augment-make-existential.cpp">
804813
<Filter>Source Files</Filter>
805814
</ClCompile>
@@ -1232,6 +1241,9 @@
12321241
<ClCompile Include="..\..\..\source\slang\slang-spirv-core-grammar-embed.cpp">
12331242
<Filter>Source Files</Filter>
12341243
</ClCompile>
1244+
<ClCompile Include="..\..\..\source\slang\slang-spirv-opt.cpp">
1245+
<Filter>Source Files</Filter>
1246+
</ClCompile>
12351247
<ClCompile Include="..\..\..\source\slang\slang-spirv-val.cpp">
12361248
<Filter>Source Files</Filter>
12371249
</ClCompile>

source/slang/hlsl.meta.slang

+61-13
Original file line numberDiff line numberDiff line change
@@ -1167,35 +1167,83 @@ __magic_type(HLSLPointStreamType)
11671167
__intrinsic_type($(kIROp_HLSLPointStreamType))
11681168
struct PointStream
11691169
{
1170-
__target_intrinsic(glsl, "EmitVertex()")
1171-
void Append(T value);
1170+
[KnownBuiltin("GeometryStreamAppend")]
1171+
void Append(T value)
1172+
{
1173+
__target_switch
1174+
{
1175+
case glsl: __intrinsic_asm "EmitVertex()";
1176+
case hlsl: __intrinsic_asm ".Append";
1177+
case spirv: spirv_asm { OpEmitVertex; };
1178+
}
1179+
}
11721180

1173-
__target_intrinsic(glsl, "EndPrimitive()")
1174-
void RestartStrip();
1181+
[KnownBuiltin("GeometryStreamRestart")]
1182+
void RestartStrip()
1183+
{
1184+
__target_switch
1185+
{
1186+
case glsl: __intrinsic_asm "EndPrimitive()";
1187+
case hlsl: __intrinsic_asm ".RestartStrip";
1188+
case spirv: spirv_asm { OpEndPrimitive; };
1189+
}
1190+
}
11751191
};
11761192

11771193
__generic<T>
11781194
__magic_type(HLSLLineStreamType)
11791195
__intrinsic_type($(kIROp_HLSLLineStreamType))
11801196
struct LineStream
11811197
{
1182-
__target_intrinsic(glsl, "EmitVertex()")
1183-
void Append(T value);
1198+
[KnownBuiltin("GeometryStreamAppend")]
1199+
void Append(T value)
1200+
{
1201+
__target_switch
1202+
{
1203+
case glsl: __intrinsic_asm "EmitVertex()";
1204+
case hlsl: __intrinsic_asm ".Append";
1205+
case spirv: spirv_asm { OpEmitVertex; };
1206+
}
1207+
}
11841208

1185-
__target_intrinsic(glsl, "EndPrimitive()")
1186-
void RestartStrip();
1209+
[KnownBuiltin("GeometryStreamRestart")]
1210+
void RestartStrip()
1211+
{
1212+
__target_switch
1213+
{
1214+
case glsl: __intrinsic_asm "EndPrimitive()";
1215+
case hlsl: __intrinsic_asm ".RestartStrip";
1216+
case spirv: spirv_asm { OpEndPrimitive; };
1217+
}
1218+
}
11871219
};
11881220

11891221
__generic<T>
11901222
__magic_type(HLSLTriangleStreamType)
11911223
__intrinsic_type($(kIROp_HLSLTriangleStreamType))
11921224
struct TriangleStream
11931225
{
1194-
__target_intrinsic(glsl, "EmitVertex()")
1195-
void Append(T value);
1226+
[KnownBuiltin("GeometryStreamAppend")]
1227+
void Append(T value)
1228+
{
1229+
__target_switch
1230+
{
1231+
case glsl: __intrinsic_asm "EmitVertex()";
1232+
case hlsl: __intrinsic_asm ".Append";
1233+
case spirv: spirv_asm { OpEmitVertex; };
1234+
}
1235+
}
11961236

1197-
__target_intrinsic(glsl, "EndPrimitive()")
1198-
void RestartStrip();
1237+
[KnownBuiltin("GeometryStreamRestart")]
1238+
void RestartStrip()
1239+
{
1240+
__target_switch
1241+
{
1242+
case glsl: __intrinsic_asm "EndPrimitive()";
1243+
case hlsl: __intrinsic_asm ".RestartStrip";
1244+
case spirv: spirv_asm { OpEndPrimitive; };
1245+
}
1246+
}
11991247
};
12001248

12011249
#define VECTOR_MAP_UNARY(TYPE, COUNT, FUNC, VALUE) \
@@ -7994,7 +8042,7 @@ struct RayQuery <let rayFlagsGeneric : RAY_FLAG = RAY_FLAG_NONE>
79948042
uint iCandidateOrCommitted = 0;
79958043
return spirv_asm
79968044
{
7997-
%rr:$$bool = OpRayQueryGetIntersectionCandidateAABBOpaqueKHR &this $iCandidateOrCommitted;
8045+
%rr:$$bool = OpRayQueryGetIntersectionCandidateAABBOpaqueKHR &this;
79988046
result:$$bool = OpLogicalNot %rr;
79998047
};
80008048
}

source/slang/slang-diagnostic-defs.h

+9-8
Original file line numberDiff line numberDiff line change
@@ -667,12 +667,12 @@ DIAGNOSTIC(42001, Error, invalidUseOfTorchTensorTypeInDeviceFunc, "invalid use o
667667

668668
DIAGNOSTIC(50010, Internal, missingExistentialBindingsForParameter, "missing argument for existential parameter slot")
669669

670-
DIAGNOSTIC(50020, Error, invalidTessCoordType, "TessCoord must have vec2 or vec3 type.")
671-
DIAGNOSTIC(50020, Error, invalidFragCoordType, "FragCoord must be a vec4.")
672-
DIAGNOSTIC(50020, Error, invalidInvocationIdType, "InvocationId must have int type.")
673-
DIAGNOSTIC(50020, Error, invalidThreadIdType, "ThreadId must have int type.")
674-
DIAGNOSTIC(50020, Error, invalidPrimitiveIdType, "PrimitiveId must have int type.")
675-
DIAGNOSTIC(50020, Error, invalidPatchVertexCountType, "PatchVertexCount must have int type.")
670+
DIAGNOSTIC(50020, Error, invalidTessCoordType, "TessCoord must have vec2 or vec3 type.")
671+
DIAGNOSTIC(50020, Error, invalidFragCoordType, "FragCoord must be a vec4.")
672+
DIAGNOSTIC(50020, Error, invalidInvocationIdType, "InvocationId must have int type.")
673+
DIAGNOSTIC(50020, Error, invalidThreadIdType, "ThreadId must have int type.")
674+
DIAGNOSTIC(50020, Error, invalidPrimitiveIdType, "PrimitiveId must have int type.")
675+
DIAGNOSTIC(50020, Error, invalidPatchVertexCountType, "PatchVertexCount must have int type.")
676676
DIAGNOSTIC(50022, Error, worldIsNotDefined, "world '$0' is not defined.")
677677
DIAGNOSTIC(50023, Error, stageShouldProvideWorldAttribute, "'$0' should provide 'World' attribute.")
678678
DIAGNOSTIC(50040, Error, componentHasInvalidTypeForPositionOutput, "'$0': component used as 'loc' output must be of vec4 type.")
@@ -693,7 +693,7 @@ DIAGNOSTIC(50052, Error, hullShaderRequiresTessLevelOuter, "'HullShader' require
693693
DIAGNOSTIC(50053, Error, invalidTessellationDomian, "'Domain' should be either 'triangles' or 'quads'.")
694694
DIAGNOSTIC(50053, Error, invalidTessellationOutputTopology, "'OutputTopology' must be one of: 'point', 'line', 'triangle_cw', or 'triangle_ccw'.")
695695
DIAGNOSTIC(50053, Error, invalidTessellationPartitioning, "'Partitioning' must be one of: 'integer', 'pow2', 'fractional_even', or 'fractional_odd'.")
696-
DIAGNOSTIC(50053, Error, invalidTessellationDomain, "'Domain' should be either 'triangles' or 'quads'.")
696+
DIAGNOSTIC(50053, Error, invalidTessellationDomain, "'Domain' should be either 'triangles' or 'quads'.")
697697

698698
DIAGNOSTIC(50082, Error, importingFromPackedBufferUnsupported, "importing type '$0' from PackedBuffer is not supported by the GLSL backend.")
699699
DIAGNOSTIC(51090, Error, cannotGenerateCodeForExternComponentType, "cannot generate code for extern component type '$0'.")
@@ -716,7 +716,7 @@ DIAGNOSTIC(52006, Error, compilerNotDefinedForTransition, "compiler not defined
716716

717717
DIAGNOSTIC(52007, Error, typeCannotBeUsedInDynamicDispatch, "failed to generate dynamic dispatch code for type '$0'.")
718718
DIAGNOSTIC(52008, Error, dynamicDispatchOnSpecializeOnlyInterface, "type '$0' is marked for specialization only, but dynamic dispatch is needed for the call.")
719-
DIAGNOSTIC(53001,Error, invalidTypeMarshallingForImportedDLLSymbol, "invalid type marshalling in imported func $0.")
719+
DIAGNOSTIC(53001, Error, invalidTypeMarshallingForImportedDLLSymbol, "invalid type marshalling in imported func $0.")
720720

721721
DIAGNOSTIC(54001, Error, meshOutputMustBeOut, "Mesh shader outputs must be declared with 'out'.")
722722
DIAGNOSTIC(54002, Error, meshOutputMustBeArray, "HLSL style mesh shader outputs must be arrays")
@@ -728,6 +728,7 @@ DIAGNOSTIC(55102, Error, invalidTorchKernelParamType, "'$0' is not a valid param
728728

729729
DIAGNOSTIC(56001, Error, unableToAutoMapCUDATypeToHostType, "Could not automatically map '$0' to a host type. Automatic binding generation failed for '$1'")
730730

731+
DIAGNOSTIC(57001, Warning, spirvOptFailed, "spirv-opt failed. $0")
731732
//
732733
// 8xxxx - Issues specific to a particular library/technology/platform/etc.
733734
//

source/slang/slang-emit-spirv-ops.h

+61
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,20 @@ SpvInst* emitOpName(
2020
return emitInst(parent, inst, SpvOpName, target, name);
2121
}
2222

23+
// https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#OpMemberName
24+
template<typename T>
25+
SpvInst* emitOpMemberName(
26+
SpvInstParent* parent,
27+
IRInst* inst,
28+
const T& target,
29+
int index,
30+
const UnownedStringSlice& name
31+
)
32+
{
33+
static_assert(isSingular<T>);
34+
return emitInst(parent, inst, SpvOpMemberName, target, SpvLiteralInteger::from32(index), name);
35+
}
36+
2337
// https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#OpExtension
2438
SpvInst* emitOpExtension(SpvInstParent* parent, IRInst* inst, const UnownedStringSlice& name)
2539
{
@@ -109,6 +123,36 @@ SpvInst* emitOpExecutionModeLocalSizeId(
109123
);
110124
}
111125

126+
// https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#OpExecutionMode
127+
template<typename T>
128+
SpvInst* emitOpExecutionModeOutputVertices(
129+
SpvInstParent* parent,
130+
IRInst* inst,
131+
const T& entryPoint,
132+
const SpvLiteralInteger& vertexCount
133+
)
134+
{
135+
static_assert(isSingular<T>);
136+
return emitInst(
137+
parent, inst, SpvOpExecutionMode, entryPoint, SpvExecutionModeOutputVertices, vertexCount
138+
);
139+
}
140+
141+
// https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#OpExecutionMode
142+
template<typename T>
143+
SpvInst* emitOpExecutionModeInvocations(
144+
SpvInstParent* parent,
145+
IRInst* inst,
146+
const T& entryPoint,
147+
const SpvLiteralInteger& invocations
148+
)
149+
{
150+
static_assert(isSingular<T>);
151+
return emitInst(
152+
parent, inst, SpvOpExecutionMode, entryPoint, SpvExecutionModeInvocations, invocations
153+
);
154+
}
155+
112156
// https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#OpCapability
113157
SpvInst* emitOpCapability(SpvInstParent* parent, IRInst* inst, SpvCapability capability)
114158
{
@@ -1111,6 +1155,23 @@ SpvInst* emitOpCompositeExtract(
11111155
);
11121156
}
11131157

1158+
// https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#OpVectorExtractDynamic
1159+
template<typename T1, typename T2, typename T3>
1160+
SpvInst* emitOpVectorExtractDynamic(
1161+
SpvInstParent* parent,
1162+
IRInst* inst,
1163+
const T1& idResultType,
1164+
const T2& composite,
1165+
const T3& index)
1166+
{
1167+
static_assert(isSingular<T1>);
1168+
static_assert(isSingular<T2>);
1169+
static_assert(isSingular<T3>);
1170+
return emitInst(
1171+
parent, inst, SpvOpVectorExtractDynamic, idResultType, kResultID, composite, index
1172+
);
1173+
}
1174+
11141175
// https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#OpCopyObject
11151176
template<typename T1, typename T2>
11161177
SpvInst* emitOpCopyObject(

0 commit comments

Comments
 (0)