xref: /freebsd-src/contrib/llvm-project/llvm/lib/ObjectYAML/DXContainerYAML.cpp (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
181ad6265SDimitry Andric //===- DXContainerYAML.cpp - DXContainer YAMLIO implementation ------------===//
281ad6265SDimitry Andric //
381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
681ad6265SDimitry Andric //
781ad6265SDimitry Andric //===----------------------------------------------------------------------===//
881ad6265SDimitry Andric //
981ad6265SDimitry Andric // This file defines classes for handling the YAML representation of
1081ad6265SDimitry Andric // DXContainerYAML.
1181ad6265SDimitry Andric //
1281ad6265SDimitry Andric //===----------------------------------------------------------------------===//
1381ad6265SDimitry Andric 
1481ad6265SDimitry Andric #include "llvm/ObjectYAML/DXContainerYAML.h"
15*5f757f3fSDimitry Andric #include "llvm/ADT/ScopeExit.h"
16bdd1243dSDimitry Andric #include "llvm/BinaryFormat/DXContainer.h"
17*5f757f3fSDimitry Andric #include "llvm/Support/ScopedPrinter.h"
1881ad6265SDimitry Andric 
1981ad6265SDimitry Andric namespace llvm {
20bdd1243dSDimitry Andric 
21bdd1243dSDimitry Andric // This assert is duplicated here to leave a breadcrumb of the places that need
22bdd1243dSDimitry Andric // to be updated if flags grow past 64-bits.
23bdd1243dSDimitry Andric static_assert((uint64_t)dxbc::FeatureFlags::NextUnusedBit <= 1ull << 63,
24bdd1243dSDimitry Andric               "Shader flag bits exceed enum size.");
25bdd1243dSDimitry Andric 
26bdd1243dSDimitry Andric DXContainerYAML::ShaderFlags::ShaderFlags(uint64_t FlagData) {
27bdd1243dSDimitry Andric #define SHADER_FLAG(Num, Val, Str)                                             \
28bdd1243dSDimitry Andric   Val = (FlagData & (uint64_t)dxbc::FeatureFlags::Val) > 0;
29bdd1243dSDimitry Andric #include "llvm/BinaryFormat/DXContainerConstants.def"
30bdd1243dSDimitry Andric }
31bdd1243dSDimitry Andric 
32bdd1243dSDimitry Andric uint64_t DXContainerYAML::ShaderFlags::getEncodedFlags() {
33bdd1243dSDimitry Andric   uint64_t Flag = 0;
34bdd1243dSDimitry Andric #define SHADER_FLAG(Num, Val, Str)                                             \
35bdd1243dSDimitry Andric   if (Val)                                                                     \
36bdd1243dSDimitry Andric     Flag |= (uint64_t)dxbc::FeatureFlags::Val;
37bdd1243dSDimitry Andric #include "llvm/BinaryFormat/DXContainerConstants.def"
38bdd1243dSDimitry Andric   return Flag;
39bdd1243dSDimitry Andric }
40bdd1243dSDimitry Andric 
41bdd1243dSDimitry Andric DXContainerYAML::ShaderHash::ShaderHash(const dxbc::ShaderHash &Data)
42bdd1243dSDimitry Andric     : IncludesSource((Data.Flags & static_cast<uint32_t>(
43bdd1243dSDimitry Andric                                        dxbc::HashFlags::IncludesSource)) != 0),
44bdd1243dSDimitry Andric       Digest(16, 0) {
45bdd1243dSDimitry Andric   memcpy(Digest.data(), &Data.Digest[0], 16);
46bdd1243dSDimitry Andric }
47bdd1243dSDimitry Andric 
4806c3fb27SDimitry Andric DXContainerYAML::PSVInfo::PSVInfo() : Version(0) {
4906c3fb27SDimitry Andric   memset(&Info, 0, sizeof(Info));
5006c3fb27SDimitry Andric }
5106c3fb27SDimitry Andric 
5206c3fb27SDimitry Andric DXContainerYAML::PSVInfo::PSVInfo(const dxbc::PSV::v0::RuntimeInfo *P,
5306c3fb27SDimitry Andric                                   uint16_t Stage)
5406c3fb27SDimitry Andric     : Version(0) {
5506c3fb27SDimitry Andric   memset(&Info, 0, sizeof(Info));
5606c3fb27SDimitry Andric   memcpy(&Info, P, sizeof(dxbc::PSV::v0::RuntimeInfo));
5706c3fb27SDimitry Andric 
5806c3fb27SDimitry Andric   assert(Stage < std::numeric_limits<uint8_t>::max() &&
5906c3fb27SDimitry Andric          "Stage should be a very small number");
6006c3fb27SDimitry Andric   // We need to bring the stage in separately since it isn't part of the v1 data
6106c3fb27SDimitry Andric   // structure.
6206c3fb27SDimitry Andric   Info.ShaderStage = static_cast<uint8_t>(Stage);
6306c3fb27SDimitry Andric }
6406c3fb27SDimitry Andric 
6506c3fb27SDimitry Andric DXContainerYAML::PSVInfo::PSVInfo(const dxbc::PSV::v1::RuntimeInfo *P)
6606c3fb27SDimitry Andric     : Version(1) {
6706c3fb27SDimitry Andric   memset(&Info, 0, sizeof(Info));
6806c3fb27SDimitry Andric   memcpy(&Info, P, sizeof(dxbc::PSV::v1::RuntimeInfo));
6906c3fb27SDimitry Andric }
7006c3fb27SDimitry Andric 
7106c3fb27SDimitry Andric DXContainerYAML::PSVInfo::PSVInfo(const dxbc::PSV::v2::RuntimeInfo *P)
7206c3fb27SDimitry Andric     : Version(2) {
7306c3fb27SDimitry Andric   memset(&Info, 0, sizeof(Info));
7406c3fb27SDimitry Andric   memcpy(&Info, P, sizeof(dxbc::PSV::v2::RuntimeInfo));
7506c3fb27SDimitry Andric }
7606c3fb27SDimitry Andric 
7781ad6265SDimitry Andric namespace yaml {
7881ad6265SDimitry Andric 
7981ad6265SDimitry Andric void MappingTraits<DXContainerYAML::VersionTuple>::mapping(
8081ad6265SDimitry Andric     IO &IO, DXContainerYAML::VersionTuple &Version) {
8181ad6265SDimitry Andric   IO.mapRequired("Major", Version.Major);
8281ad6265SDimitry Andric   IO.mapRequired("Minor", Version.Minor);
8381ad6265SDimitry Andric }
8481ad6265SDimitry Andric 
8581ad6265SDimitry Andric void MappingTraits<DXContainerYAML::FileHeader>::mapping(
8681ad6265SDimitry Andric     IO &IO, DXContainerYAML::FileHeader &Header) {
8781ad6265SDimitry Andric   IO.mapRequired("Hash", Header.Hash);
8881ad6265SDimitry Andric   IO.mapRequired("Version", Header.Version);
8981ad6265SDimitry Andric   IO.mapOptional("FileSize", Header.FileSize);
9081ad6265SDimitry Andric   IO.mapRequired("PartCount", Header.PartCount);
9181ad6265SDimitry Andric   IO.mapOptional("PartOffsets", Header.PartOffsets);
9281ad6265SDimitry Andric }
9381ad6265SDimitry Andric 
9481ad6265SDimitry Andric void MappingTraits<DXContainerYAML::DXILProgram>::mapping(
9581ad6265SDimitry Andric     IO &IO, DXContainerYAML::DXILProgram &Program) {
9681ad6265SDimitry Andric   IO.mapRequired("MajorVersion", Program.MajorVersion);
9781ad6265SDimitry Andric   IO.mapRequired("MinorVersion", Program.MinorVersion);
9881ad6265SDimitry Andric   IO.mapRequired("ShaderKind", Program.ShaderKind);
9981ad6265SDimitry Andric   IO.mapOptional("Size", Program.Size);
10081ad6265SDimitry Andric   IO.mapRequired("DXILMajorVersion", Program.DXILMajorVersion);
10181ad6265SDimitry Andric   IO.mapRequired("DXILMinorVersion", Program.DXILMinorVersion);
10281ad6265SDimitry Andric   IO.mapOptional("DXILSize", Program.DXILSize);
10381ad6265SDimitry Andric   IO.mapOptional("DXIL", Program.DXIL);
10481ad6265SDimitry Andric }
10581ad6265SDimitry Andric 
106bdd1243dSDimitry Andric void MappingTraits<DXContainerYAML::ShaderFlags>::mapping(
107bdd1243dSDimitry Andric     IO &IO, DXContainerYAML::ShaderFlags &Flags) {
108bdd1243dSDimitry Andric #define SHADER_FLAG(Num, Val, Str) IO.mapRequired(#Val, Flags.Val);
109bdd1243dSDimitry Andric #include "llvm/BinaryFormat/DXContainerConstants.def"
110bdd1243dSDimitry Andric }
111bdd1243dSDimitry Andric 
112bdd1243dSDimitry Andric void MappingTraits<DXContainerYAML::ShaderHash>::mapping(
113bdd1243dSDimitry Andric     IO &IO, DXContainerYAML::ShaderHash &Hash) {
114bdd1243dSDimitry Andric   IO.mapRequired("IncludesSource", Hash.IncludesSource);
115bdd1243dSDimitry Andric   IO.mapRequired("Digest", Hash.Digest);
116bdd1243dSDimitry Andric }
117bdd1243dSDimitry Andric 
11806c3fb27SDimitry Andric void MappingTraits<DXContainerYAML::PSVInfo>::mapping(
11906c3fb27SDimitry Andric     IO &IO, DXContainerYAML::PSVInfo &PSV) {
12006c3fb27SDimitry Andric   IO.mapRequired("Version", PSV.Version);
12106c3fb27SDimitry Andric 
12206c3fb27SDimitry Andric   // Store the PSV version in the YAML context.
12306c3fb27SDimitry Andric   void *OldContext = IO.getContext();
12406c3fb27SDimitry Andric   uint32_t Version = PSV.Version;
12506c3fb27SDimitry Andric   IO.setContext(&Version);
12606c3fb27SDimitry Andric 
127*5f757f3fSDimitry Andric   // Restore the YAML context on function exit.
128*5f757f3fSDimitry Andric   auto RestoreContext = make_scope_exit([&]() { IO.setContext(OldContext); });
129*5f757f3fSDimitry Andric 
13006c3fb27SDimitry Andric   // Shader stage is only included in binaries for v1 and later, but we always
13106c3fb27SDimitry Andric   // include it since it simplifies parsing and file construction.
13206c3fb27SDimitry Andric   IO.mapRequired("ShaderStage", PSV.Info.ShaderStage);
13306c3fb27SDimitry Andric   PSV.mapInfoForVersion(IO);
13406c3fb27SDimitry Andric 
13506c3fb27SDimitry Andric   IO.mapRequired("ResourceStride", PSV.ResourceStride);
13606c3fb27SDimitry Andric   IO.mapRequired("Resources", PSV.Resources);
137*5f757f3fSDimitry Andric   if (PSV.Version == 0)
138*5f757f3fSDimitry Andric     return;
139*5f757f3fSDimitry Andric   IO.mapRequired("SigInputElements", PSV.SigInputElements);
140*5f757f3fSDimitry Andric   IO.mapRequired("SigOutputElements", PSV.SigOutputElements);
141*5f757f3fSDimitry Andric   IO.mapRequired("SigPatchOrPrimElements", PSV.SigPatchOrPrimElements);
14206c3fb27SDimitry Andric 
143*5f757f3fSDimitry Andric   Triple::EnvironmentType Stage = dxbc::getShaderStage(PSV.Info.ShaderStage);
144*5f757f3fSDimitry Andric   if (PSV.Info.UsesViewID) {
145*5f757f3fSDimitry Andric     MutableArrayRef<SmallVector<llvm::yaml::Hex32>> MutableOutMasks(
146*5f757f3fSDimitry Andric         PSV.OutputVectorMasks);
147*5f757f3fSDimitry Andric     IO.mapRequired("OutputVectorMasks", MutableOutMasks);
148*5f757f3fSDimitry Andric     if (Stage == Triple::EnvironmentType::Hull)
149*5f757f3fSDimitry Andric       IO.mapRequired("PatchOrPrimMasks", PSV.PatchOrPrimMasks);
150*5f757f3fSDimitry Andric   }
151*5f757f3fSDimitry Andric   MutableArrayRef<SmallVector<llvm::yaml::Hex32>> MutableIOMap(
152*5f757f3fSDimitry Andric       PSV.InputOutputMap);
153*5f757f3fSDimitry Andric   IO.mapRequired("InputOutputMap", MutableIOMap);
154*5f757f3fSDimitry Andric 
155*5f757f3fSDimitry Andric   if (Stage == Triple::EnvironmentType::Hull)
156*5f757f3fSDimitry Andric     IO.mapRequired("InputPatchMap", PSV.InputPatchMap);
157*5f757f3fSDimitry Andric 
158*5f757f3fSDimitry Andric   if (Stage == Triple::EnvironmentType::Domain)
159*5f757f3fSDimitry Andric     IO.mapRequired("PatchOutputMap", PSV.PatchOutputMap);
160*5f757f3fSDimitry Andric }
161*5f757f3fSDimitry Andric 
162*5f757f3fSDimitry Andric void MappingTraits<DXContainerYAML::SignatureParameter>::mapping(
163*5f757f3fSDimitry Andric     IO &IO, DXContainerYAML::SignatureParameter &S) {
164*5f757f3fSDimitry Andric   IO.mapRequired("Stream", S.Stream);
165*5f757f3fSDimitry Andric   IO.mapRequired("Name", S.Name);
166*5f757f3fSDimitry Andric   IO.mapRequired("Index", S.Index);
167*5f757f3fSDimitry Andric   IO.mapRequired("SystemValue", S.SystemValue);
168*5f757f3fSDimitry Andric   IO.mapRequired("CompType", S.CompType);
169*5f757f3fSDimitry Andric   IO.mapRequired("Register", S.Register);
170*5f757f3fSDimitry Andric   IO.mapRequired("Mask", S.Mask);
171*5f757f3fSDimitry Andric   IO.mapRequired("ExclusiveMask", S.ExclusiveMask);
172*5f757f3fSDimitry Andric   IO.mapRequired("MinPrecision", S.MinPrecision);
173*5f757f3fSDimitry Andric }
174*5f757f3fSDimitry Andric 
175*5f757f3fSDimitry Andric void MappingTraits<DXContainerYAML::Signature>::mapping(
176*5f757f3fSDimitry Andric     IO &IO, DXContainerYAML::Signature &S) {
177*5f757f3fSDimitry Andric   IO.mapRequired("Parameters", S.Parameters);
17806c3fb27SDimitry Andric }
17906c3fb27SDimitry Andric 
18081ad6265SDimitry Andric void MappingTraits<DXContainerYAML::Part>::mapping(IO &IO,
18181ad6265SDimitry Andric                                                    DXContainerYAML::Part &P) {
18281ad6265SDimitry Andric   IO.mapRequired("Name", P.Name);
18381ad6265SDimitry Andric   IO.mapRequired("Size", P.Size);
18481ad6265SDimitry Andric   IO.mapOptional("Program", P.Program);
185bdd1243dSDimitry Andric   IO.mapOptional("Flags", P.Flags);
186bdd1243dSDimitry Andric   IO.mapOptional("Hash", P.Hash);
18706c3fb27SDimitry Andric   IO.mapOptional("PSVInfo", P.Info);
188*5f757f3fSDimitry Andric   IO.mapOptional("Signature", P.Signature);
18981ad6265SDimitry Andric }
19081ad6265SDimitry Andric 
19181ad6265SDimitry Andric void MappingTraits<DXContainerYAML::Object>::mapping(
19281ad6265SDimitry Andric     IO &IO, DXContainerYAML::Object &Obj) {
19381ad6265SDimitry Andric   IO.mapTag("!dxcontainer", true);
19481ad6265SDimitry Andric   IO.mapRequired("Header", Obj.Header);
19581ad6265SDimitry Andric   IO.mapRequired("Parts", Obj.Parts);
19681ad6265SDimitry Andric }
19781ad6265SDimitry Andric 
19806c3fb27SDimitry Andric void MappingTraits<DXContainerYAML::ResourceBindInfo>::mapping(
19906c3fb27SDimitry Andric     IO &IO, DXContainerYAML::ResourceBindInfo &Res) {
20006c3fb27SDimitry Andric   IO.mapRequired("Type", Res.Type);
20106c3fb27SDimitry Andric   IO.mapRequired("Space", Res.Space);
20206c3fb27SDimitry Andric   IO.mapRequired("LowerBound", Res.LowerBound);
20306c3fb27SDimitry Andric   IO.mapRequired("UpperBound", Res.UpperBound);
20406c3fb27SDimitry Andric 
20506c3fb27SDimitry Andric   const uint32_t *PSVVersion = static_cast<uint32_t *>(IO.getContext());
20606c3fb27SDimitry Andric   if (*PSVVersion < 2)
20706c3fb27SDimitry Andric     return;
20806c3fb27SDimitry Andric 
20906c3fb27SDimitry Andric   IO.mapRequired("Kind", Res.Kind);
21006c3fb27SDimitry Andric   IO.mapRequired("Flags", Res.Flags);
21106c3fb27SDimitry Andric }
21206c3fb27SDimitry Andric 
213*5f757f3fSDimitry Andric void MappingTraits<DXContainerYAML::SignatureElement>::mapping(
214*5f757f3fSDimitry Andric     IO &IO, DXContainerYAML::SignatureElement &El) {
215*5f757f3fSDimitry Andric   IO.mapRequired("Name", El.Name);
216*5f757f3fSDimitry Andric   IO.mapRequired("Indices", El.Indices);
217*5f757f3fSDimitry Andric   IO.mapRequired("StartRow", El.StartRow);
218*5f757f3fSDimitry Andric   IO.mapRequired("Cols", El.Cols);
219*5f757f3fSDimitry Andric   IO.mapRequired("StartCol", El.StartCol);
220*5f757f3fSDimitry Andric   IO.mapRequired("Allocated", El.Allocated);
221*5f757f3fSDimitry Andric   IO.mapRequired("Kind", El.Kind);
222*5f757f3fSDimitry Andric   IO.mapRequired("ComponentType", El.Type);
223*5f757f3fSDimitry Andric   IO.mapRequired("Interpolation", El.Mode);
224*5f757f3fSDimitry Andric   IO.mapRequired("DynamicMask", El.DynamicMask);
225*5f757f3fSDimitry Andric   IO.mapRequired("Stream", El.Stream);
226*5f757f3fSDimitry Andric }
227*5f757f3fSDimitry Andric 
228*5f757f3fSDimitry Andric void ScalarEnumerationTraits<dxbc::PSV::SemanticKind>::enumeration(
229*5f757f3fSDimitry Andric     IO &IO, dxbc::PSV::SemanticKind &Value) {
230*5f757f3fSDimitry Andric   for (const auto &E : dxbc::PSV::getSemanticKinds())
231*5f757f3fSDimitry Andric     IO.enumCase(Value, E.Name.str().c_str(), E.Value);
232*5f757f3fSDimitry Andric }
233*5f757f3fSDimitry Andric 
234*5f757f3fSDimitry Andric void ScalarEnumerationTraits<dxbc::PSV::ComponentType>::enumeration(
235*5f757f3fSDimitry Andric     IO &IO, dxbc::PSV::ComponentType &Value) {
236*5f757f3fSDimitry Andric   for (const auto &E : dxbc::PSV::getComponentTypes())
237*5f757f3fSDimitry Andric     IO.enumCase(Value, E.Name.str().c_str(), E.Value);
238*5f757f3fSDimitry Andric }
239*5f757f3fSDimitry Andric 
240*5f757f3fSDimitry Andric void ScalarEnumerationTraits<dxbc::PSV::InterpolationMode>::enumeration(
241*5f757f3fSDimitry Andric     IO &IO, dxbc::PSV::InterpolationMode &Value) {
242*5f757f3fSDimitry Andric   for (const auto &E : dxbc::PSV::getInterpolationModes())
243*5f757f3fSDimitry Andric     IO.enumCase(Value, E.Name.str().c_str(), E.Value);
244*5f757f3fSDimitry Andric }
245*5f757f3fSDimitry Andric 
246*5f757f3fSDimitry Andric void ScalarEnumerationTraits<dxbc::D3DSystemValue>::enumeration(
247*5f757f3fSDimitry Andric     IO &IO, dxbc::D3DSystemValue &Value) {
248*5f757f3fSDimitry Andric   for (const auto &E : dxbc::getD3DSystemValues())
249*5f757f3fSDimitry Andric     IO.enumCase(Value, E.Name.str().c_str(), E.Value);
250*5f757f3fSDimitry Andric }
251*5f757f3fSDimitry Andric 
252*5f757f3fSDimitry Andric void ScalarEnumerationTraits<dxbc::SigMinPrecision>::enumeration(
253*5f757f3fSDimitry Andric     IO &IO, dxbc::SigMinPrecision &Value) {
254*5f757f3fSDimitry Andric   for (const auto &E : dxbc::getSigMinPrecisions())
255*5f757f3fSDimitry Andric     IO.enumCase(Value, E.Name.str().c_str(), E.Value);
256*5f757f3fSDimitry Andric }
257*5f757f3fSDimitry Andric 
258*5f757f3fSDimitry Andric void ScalarEnumerationTraits<dxbc::SigComponentType>::enumeration(
259*5f757f3fSDimitry Andric     IO &IO, dxbc::SigComponentType &Value) {
260*5f757f3fSDimitry Andric   for (const auto &E : dxbc::getSigComponentTypes())
261*5f757f3fSDimitry Andric     IO.enumCase(Value, E.Name.str().c_str(), E.Value);
262*5f757f3fSDimitry Andric }
263*5f757f3fSDimitry Andric 
26481ad6265SDimitry Andric } // namespace yaml
26506c3fb27SDimitry Andric 
26606c3fb27SDimitry Andric void DXContainerYAML::PSVInfo::mapInfoForVersion(yaml::IO &IO) {
26706c3fb27SDimitry Andric   dxbc::PipelinePSVInfo &StageInfo = Info.StageInfo;
26806c3fb27SDimitry Andric   Triple::EnvironmentType Stage = dxbc::getShaderStage(Info.ShaderStage);
26906c3fb27SDimitry Andric 
27006c3fb27SDimitry Andric   switch (Stage) {
27106c3fb27SDimitry Andric   case Triple::EnvironmentType::Pixel:
27206c3fb27SDimitry Andric     IO.mapRequired("DepthOutput", StageInfo.PS.DepthOutput);
27306c3fb27SDimitry Andric     IO.mapRequired("SampleFrequency", StageInfo.PS.SampleFrequency);
27406c3fb27SDimitry Andric     break;
27506c3fb27SDimitry Andric   case Triple::EnvironmentType::Vertex:
27606c3fb27SDimitry Andric     IO.mapRequired("OutputPositionPresent", StageInfo.VS.OutputPositionPresent);
27706c3fb27SDimitry Andric     break;
27806c3fb27SDimitry Andric   case Triple::EnvironmentType::Geometry:
27906c3fb27SDimitry Andric     IO.mapRequired("InputPrimitive", StageInfo.GS.InputPrimitive);
28006c3fb27SDimitry Andric     IO.mapRequired("OutputTopology", StageInfo.GS.OutputTopology);
28106c3fb27SDimitry Andric     IO.mapRequired("OutputStreamMask", StageInfo.GS.OutputStreamMask);
28206c3fb27SDimitry Andric     IO.mapRequired("OutputPositionPresent", StageInfo.GS.OutputPositionPresent);
28306c3fb27SDimitry Andric     break;
28406c3fb27SDimitry Andric   case Triple::EnvironmentType::Hull:
28506c3fb27SDimitry Andric     IO.mapRequired("InputControlPointCount",
28606c3fb27SDimitry Andric                    StageInfo.HS.InputControlPointCount);
28706c3fb27SDimitry Andric     IO.mapRequired("OutputControlPointCount",
28806c3fb27SDimitry Andric                    StageInfo.HS.OutputControlPointCount);
28906c3fb27SDimitry Andric     IO.mapRequired("TessellatorDomain", StageInfo.HS.TessellatorDomain);
29006c3fb27SDimitry Andric     IO.mapRequired("TessellatorOutputPrimitive",
29106c3fb27SDimitry Andric                    StageInfo.HS.TessellatorOutputPrimitive);
29206c3fb27SDimitry Andric     break;
29306c3fb27SDimitry Andric   case Triple::EnvironmentType::Domain:
29406c3fb27SDimitry Andric     IO.mapRequired("InputControlPointCount",
29506c3fb27SDimitry Andric                    StageInfo.DS.InputControlPointCount);
29606c3fb27SDimitry Andric     IO.mapRequired("OutputPositionPresent", StageInfo.DS.OutputPositionPresent);
29706c3fb27SDimitry Andric     IO.mapRequired("TessellatorDomain", StageInfo.DS.TessellatorDomain);
29806c3fb27SDimitry Andric     break;
29906c3fb27SDimitry Andric   case Triple::EnvironmentType::Mesh:
30006c3fb27SDimitry Andric     IO.mapRequired("GroupSharedBytesUsed", StageInfo.MS.GroupSharedBytesUsed);
30106c3fb27SDimitry Andric     IO.mapRequired("GroupSharedBytesDependentOnViewID",
30206c3fb27SDimitry Andric                    StageInfo.MS.GroupSharedBytesDependentOnViewID);
30306c3fb27SDimitry Andric     IO.mapRequired("PayloadSizeInBytes", StageInfo.MS.PayloadSizeInBytes);
30406c3fb27SDimitry Andric     IO.mapRequired("MaxOutputVertices", StageInfo.MS.MaxOutputVertices);
30506c3fb27SDimitry Andric     IO.mapRequired("MaxOutputPrimitives", StageInfo.MS.MaxOutputPrimitives);
30606c3fb27SDimitry Andric     break;
30706c3fb27SDimitry Andric   case Triple::EnvironmentType::Amplification:
30806c3fb27SDimitry Andric     IO.mapRequired("PayloadSizeInBytes", StageInfo.AS.PayloadSizeInBytes);
30906c3fb27SDimitry Andric     break;
31006c3fb27SDimitry Andric   default:
31106c3fb27SDimitry Andric     break;
31206c3fb27SDimitry Andric   }
31306c3fb27SDimitry Andric 
31406c3fb27SDimitry Andric   IO.mapRequired("MinimumWaveLaneCount", Info.MinimumWaveLaneCount);
31506c3fb27SDimitry Andric   IO.mapRequired("MaximumWaveLaneCount", Info.MaximumWaveLaneCount);
31606c3fb27SDimitry Andric 
31706c3fb27SDimitry Andric   if (Version == 0)
31806c3fb27SDimitry Andric     return;
31906c3fb27SDimitry Andric 
32006c3fb27SDimitry Andric   IO.mapRequired("UsesViewID", Info.UsesViewID);
32106c3fb27SDimitry Andric 
32206c3fb27SDimitry Andric   switch (Stage) {
32306c3fb27SDimitry Andric   case Triple::EnvironmentType::Geometry:
32406c3fb27SDimitry Andric     IO.mapRequired("MaxVertexCount", Info.GeomData.MaxVertexCount);
32506c3fb27SDimitry Andric     break;
32606c3fb27SDimitry Andric   case Triple::EnvironmentType::Hull:
32706c3fb27SDimitry Andric   case Triple::EnvironmentType::Domain:
32806c3fb27SDimitry Andric     IO.mapRequired("SigPatchConstOrPrimVectors",
32906c3fb27SDimitry Andric                    Info.GeomData.SigPatchConstOrPrimVectors);
33006c3fb27SDimitry Andric     break;
33106c3fb27SDimitry Andric   case Triple::EnvironmentType::Mesh:
33206c3fb27SDimitry Andric     IO.mapRequired("SigPrimVectors", Info.GeomData.MeshInfo.SigPrimVectors);
33306c3fb27SDimitry Andric     IO.mapRequired("MeshOutputTopology",
33406c3fb27SDimitry Andric                    Info.GeomData.MeshInfo.MeshOutputTopology);
33506c3fb27SDimitry Andric     break;
33606c3fb27SDimitry Andric   default:
33706c3fb27SDimitry Andric     break;
33806c3fb27SDimitry Andric   }
33906c3fb27SDimitry Andric 
34006c3fb27SDimitry Andric   IO.mapRequired("SigInputVectors", Info.SigInputVectors);
34106c3fb27SDimitry Andric   MutableArrayRef<uint8_t> Vec(Info.SigOutputVectors);
34206c3fb27SDimitry Andric   IO.mapRequired("SigOutputVectors", Vec);
34306c3fb27SDimitry Andric 
34406c3fb27SDimitry Andric   if (Version == 1)
34506c3fb27SDimitry Andric     return;
34606c3fb27SDimitry Andric 
34706c3fb27SDimitry Andric   IO.mapRequired("NumThreadsX", Info.NumThreadsX);
34806c3fb27SDimitry Andric   IO.mapRequired("NumThreadsY", Info.NumThreadsY);
34906c3fb27SDimitry Andric   IO.mapRequired("NumThreadsZ", Info.NumThreadsZ);
35006c3fb27SDimitry Andric }
35106c3fb27SDimitry Andric 
35281ad6265SDimitry Andric } // namespace llvm
353