xref: /freebsd-src/contrib/llvm-project/llvm/lib/ObjectYAML/DXContainerYAML.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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"
155f757f3fSDimitry Andric #include "llvm/ADT/ScopeExit.h"
16bdd1243dSDimitry Andric #include "llvm/BinaryFormat/DXContainer.h"
175f757f3fSDimitry 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 
26*0fca6ea1SDimitry Andric DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) {
27*0fca6ea1SDimitry Andric #define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str)                      \
28bdd1243dSDimitry Andric   Val = (FlagData & (uint64_t)dxbc::FeatureFlags::Val) > 0;
29bdd1243dSDimitry Andric #include "llvm/BinaryFormat/DXContainerConstants.def"
30bdd1243dSDimitry Andric }
31bdd1243dSDimitry Andric 
32*0fca6ea1SDimitry Andric uint64_t DXContainerYAML::ShaderFeatureFlags::getEncodedFlags() {
33bdd1243dSDimitry Andric   uint64_t Flag = 0;
34*0fca6ea1SDimitry Andric #define SHADER_FEATURE_FLAG(Num, DxilModuleNum, 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 
77*0fca6ea1SDimitry Andric DXContainerYAML::PSVInfo::PSVInfo(const dxbc::PSV::v3::RuntimeInfo *P,
78*0fca6ea1SDimitry Andric                                   StringRef StringTable)
79*0fca6ea1SDimitry Andric     : Version(3),
80*0fca6ea1SDimitry Andric       EntryName(StringTable.substr(P->EntryNameOffset,
81*0fca6ea1SDimitry Andric                                    StringTable.find('\0', P->EntryNameOffset) -
82*0fca6ea1SDimitry Andric                                        P->EntryNameOffset)) {
83*0fca6ea1SDimitry Andric   memset(&Info, 0, sizeof(Info));
84*0fca6ea1SDimitry Andric   memcpy(&Info, P, sizeof(dxbc::PSV::v3::RuntimeInfo));
85*0fca6ea1SDimitry Andric }
86*0fca6ea1SDimitry Andric 
8781ad6265SDimitry Andric namespace yaml {
8881ad6265SDimitry Andric 
8981ad6265SDimitry Andric void MappingTraits<DXContainerYAML::VersionTuple>::mapping(
9081ad6265SDimitry Andric     IO &IO, DXContainerYAML::VersionTuple &Version) {
9181ad6265SDimitry Andric   IO.mapRequired("Major", Version.Major);
9281ad6265SDimitry Andric   IO.mapRequired("Minor", Version.Minor);
9381ad6265SDimitry Andric }
9481ad6265SDimitry Andric 
9581ad6265SDimitry Andric void MappingTraits<DXContainerYAML::FileHeader>::mapping(
9681ad6265SDimitry Andric     IO &IO, DXContainerYAML::FileHeader &Header) {
9781ad6265SDimitry Andric   IO.mapRequired("Hash", Header.Hash);
9881ad6265SDimitry Andric   IO.mapRequired("Version", Header.Version);
9981ad6265SDimitry Andric   IO.mapOptional("FileSize", Header.FileSize);
10081ad6265SDimitry Andric   IO.mapRequired("PartCount", Header.PartCount);
10181ad6265SDimitry Andric   IO.mapOptional("PartOffsets", Header.PartOffsets);
10281ad6265SDimitry Andric }
10381ad6265SDimitry Andric 
10481ad6265SDimitry Andric void MappingTraits<DXContainerYAML::DXILProgram>::mapping(
10581ad6265SDimitry Andric     IO &IO, DXContainerYAML::DXILProgram &Program) {
10681ad6265SDimitry Andric   IO.mapRequired("MajorVersion", Program.MajorVersion);
10781ad6265SDimitry Andric   IO.mapRequired("MinorVersion", Program.MinorVersion);
10881ad6265SDimitry Andric   IO.mapRequired("ShaderKind", Program.ShaderKind);
10981ad6265SDimitry Andric   IO.mapOptional("Size", Program.Size);
11081ad6265SDimitry Andric   IO.mapRequired("DXILMajorVersion", Program.DXILMajorVersion);
11181ad6265SDimitry Andric   IO.mapRequired("DXILMinorVersion", Program.DXILMinorVersion);
11281ad6265SDimitry Andric   IO.mapOptional("DXILSize", Program.DXILSize);
11381ad6265SDimitry Andric   IO.mapOptional("DXIL", Program.DXIL);
11481ad6265SDimitry Andric }
11581ad6265SDimitry Andric 
116*0fca6ea1SDimitry Andric void MappingTraits<DXContainerYAML::ShaderFeatureFlags>::mapping(
117*0fca6ea1SDimitry Andric     IO &IO, DXContainerYAML::ShaderFeatureFlags &Flags) {
118*0fca6ea1SDimitry Andric #define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str)                      \
119*0fca6ea1SDimitry Andric   IO.mapRequired(#Val, Flags.Val);
120bdd1243dSDimitry Andric #include "llvm/BinaryFormat/DXContainerConstants.def"
121bdd1243dSDimitry Andric }
122bdd1243dSDimitry Andric 
123bdd1243dSDimitry Andric void MappingTraits<DXContainerYAML::ShaderHash>::mapping(
124bdd1243dSDimitry Andric     IO &IO, DXContainerYAML::ShaderHash &Hash) {
125bdd1243dSDimitry Andric   IO.mapRequired("IncludesSource", Hash.IncludesSource);
126bdd1243dSDimitry Andric   IO.mapRequired("Digest", Hash.Digest);
127bdd1243dSDimitry Andric }
128bdd1243dSDimitry Andric 
12906c3fb27SDimitry Andric void MappingTraits<DXContainerYAML::PSVInfo>::mapping(
13006c3fb27SDimitry Andric     IO &IO, DXContainerYAML::PSVInfo &PSV) {
13106c3fb27SDimitry Andric   IO.mapRequired("Version", PSV.Version);
13206c3fb27SDimitry Andric 
13306c3fb27SDimitry Andric   // Store the PSV version in the YAML context.
13406c3fb27SDimitry Andric   void *OldContext = IO.getContext();
13506c3fb27SDimitry Andric   uint32_t Version = PSV.Version;
13606c3fb27SDimitry Andric   IO.setContext(&Version);
13706c3fb27SDimitry Andric 
1385f757f3fSDimitry Andric   // Restore the YAML context on function exit.
1395f757f3fSDimitry Andric   auto RestoreContext = make_scope_exit([&]() { IO.setContext(OldContext); });
1405f757f3fSDimitry Andric 
14106c3fb27SDimitry Andric   // Shader stage is only included in binaries for v1 and later, but we always
14206c3fb27SDimitry Andric   // include it since it simplifies parsing and file construction.
14306c3fb27SDimitry Andric   IO.mapRequired("ShaderStage", PSV.Info.ShaderStage);
14406c3fb27SDimitry Andric   PSV.mapInfoForVersion(IO);
14506c3fb27SDimitry Andric 
14606c3fb27SDimitry Andric   IO.mapRequired("ResourceStride", PSV.ResourceStride);
14706c3fb27SDimitry Andric   IO.mapRequired("Resources", PSV.Resources);
1485f757f3fSDimitry Andric   if (PSV.Version == 0)
1495f757f3fSDimitry Andric     return;
1505f757f3fSDimitry Andric   IO.mapRequired("SigInputElements", PSV.SigInputElements);
1515f757f3fSDimitry Andric   IO.mapRequired("SigOutputElements", PSV.SigOutputElements);
1525f757f3fSDimitry Andric   IO.mapRequired("SigPatchOrPrimElements", PSV.SigPatchOrPrimElements);
15306c3fb27SDimitry Andric 
1545f757f3fSDimitry Andric   Triple::EnvironmentType Stage = dxbc::getShaderStage(PSV.Info.ShaderStage);
1555f757f3fSDimitry Andric   if (PSV.Info.UsesViewID) {
1565f757f3fSDimitry Andric     MutableArrayRef<SmallVector<llvm::yaml::Hex32>> MutableOutMasks(
1575f757f3fSDimitry Andric         PSV.OutputVectorMasks);
1585f757f3fSDimitry Andric     IO.mapRequired("OutputVectorMasks", MutableOutMasks);
1595f757f3fSDimitry Andric     if (Stage == Triple::EnvironmentType::Hull)
1605f757f3fSDimitry Andric       IO.mapRequired("PatchOrPrimMasks", PSV.PatchOrPrimMasks);
1615f757f3fSDimitry Andric   }
1625f757f3fSDimitry Andric   MutableArrayRef<SmallVector<llvm::yaml::Hex32>> MutableIOMap(
1635f757f3fSDimitry Andric       PSV.InputOutputMap);
1645f757f3fSDimitry Andric   IO.mapRequired("InputOutputMap", MutableIOMap);
1655f757f3fSDimitry Andric 
1665f757f3fSDimitry Andric   if (Stage == Triple::EnvironmentType::Hull)
1675f757f3fSDimitry Andric     IO.mapRequired("InputPatchMap", PSV.InputPatchMap);
1685f757f3fSDimitry Andric 
1695f757f3fSDimitry Andric   if (Stage == Triple::EnvironmentType::Domain)
1705f757f3fSDimitry Andric     IO.mapRequired("PatchOutputMap", PSV.PatchOutputMap);
1715f757f3fSDimitry Andric }
1725f757f3fSDimitry Andric 
1735f757f3fSDimitry Andric void MappingTraits<DXContainerYAML::SignatureParameter>::mapping(
1745f757f3fSDimitry Andric     IO &IO, DXContainerYAML::SignatureParameter &S) {
1755f757f3fSDimitry Andric   IO.mapRequired("Stream", S.Stream);
1765f757f3fSDimitry Andric   IO.mapRequired("Name", S.Name);
1775f757f3fSDimitry Andric   IO.mapRequired("Index", S.Index);
1785f757f3fSDimitry Andric   IO.mapRequired("SystemValue", S.SystemValue);
1795f757f3fSDimitry Andric   IO.mapRequired("CompType", S.CompType);
1805f757f3fSDimitry Andric   IO.mapRequired("Register", S.Register);
1815f757f3fSDimitry Andric   IO.mapRequired("Mask", S.Mask);
1825f757f3fSDimitry Andric   IO.mapRequired("ExclusiveMask", S.ExclusiveMask);
1835f757f3fSDimitry Andric   IO.mapRequired("MinPrecision", S.MinPrecision);
1845f757f3fSDimitry Andric }
1855f757f3fSDimitry Andric 
1865f757f3fSDimitry Andric void MappingTraits<DXContainerYAML::Signature>::mapping(
1875f757f3fSDimitry Andric     IO &IO, DXContainerYAML::Signature &S) {
1885f757f3fSDimitry Andric   IO.mapRequired("Parameters", S.Parameters);
18906c3fb27SDimitry Andric }
19006c3fb27SDimitry Andric 
19181ad6265SDimitry Andric void MappingTraits<DXContainerYAML::Part>::mapping(IO &IO,
19281ad6265SDimitry Andric                                                    DXContainerYAML::Part &P) {
19381ad6265SDimitry Andric   IO.mapRequired("Name", P.Name);
19481ad6265SDimitry Andric   IO.mapRequired("Size", P.Size);
19581ad6265SDimitry Andric   IO.mapOptional("Program", P.Program);
196bdd1243dSDimitry Andric   IO.mapOptional("Flags", P.Flags);
197bdd1243dSDimitry Andric   IO.mapOptional("Hash", P.Hash);
19806c3fb27SDimitry Andric   IO.mapOptional("PSVInfo", P.Info);
1995f757f3fSDimitry Andric   IO.mapOptional("Signature", P.Signature);
20081ad6265SDimitry Andric }
20181ad6265SDimitry Andric 
20281ad6265SDimitry Andric void MappingTraits<DXContainerYAML::Object>::mapping(
20381ad6265SDimitry Andric     IO &IO, DXContainerYAML::Object &Obj) {
20481ad6265SDimitry Andric   IO.mapTag("!dxcontainer", true);
20581ad6265SDimitry Andric   IO.mapRequired("Header", Obj.Header);
20681ad6265SDimitry Andric   IO.mapRequired("Parts", Obj.Parts);
20781ad6265SDimitry Andric }
20881ad6265SDimitry Andric 
20906c3fb27SDimitry Andric void MappingTraits<DXContainerYAML::ResourceBindInfo>::mapping(
21006c3fb27SDimitry Andric     IO &IO, DXContainerYAML::ResourceBindInfo &Res) {
21106c3fb27SDimitry Andric   IO.mapRequired("Type", Res.Type);
21206c3fb27SDimitry Andric   IO.mapRequired("Space", Res.Space);
21306c3fb27SDimitry Andric   IO.mapRequired("LowerBound", Res.LowerBound);
21406c3fb27SDimitry Andric   IO.mapRequired("UpperBound", Res.UpperBound);
21506c3fb27SDimitry Andric 
21606c3fb27SDimitry Andric   const uint32_t *PSVVersion = static_cast<uint32_t *>(IO.getContext());
21706c3fb27SDimitry Andric   if (*PSVVersion < 2)
21806c3fb27SDimitry Andric     return;
21906c3fb27SDimitry Andric 
22006c3fb27SDimitry Andric   IO.mapRequired("Kind", Res.Kind);
22106c3fb27SDimitry Andric   IO.mapRequired("Flags", Res.Flags);
22206c3fb27SDimitry Andric }
22306c3fb27SDimitry Andric 
2245f757f3fSDimitry Andric void MappingTraits<DXContainerYAML::SignatureElement>::mapping(
2255f757f3fSDimitry Andric     IO &IO, DXContainerYAML::SignatureElement &El) {
2265f757f3fSDimitry Andric   IO.mapRequired("Name", El.Name);
2275f757f3fSDimitry Andric   IO.mapRequired("Indices", El.Indices);
2285f757f3fSDimitry Andric   IO.mapRequired("StartRow", El.StartRow);
2295f757f3fSDimitry Andric   IO.mapRequired("Cols", El.Cols);
2305f757f3fSDimitry Andric   IO.mapRequired("StartCol", El.StartCol);
2315f757f3fSDimitry Andric   IO.mapRequired("Allocated", El.Allocated);
2325f757f3fSDimitry Andric   IO.mapRequired("Kind", El.Kind);
2335f757f3fSDimitry Andric   IO.mapRequired("ComponentType", El.Type);
2345f757f3fSDimitry Andric   IO.mapRequired("Interpolation", El.Mode);
2355f757f3fSDimitry Andric   IO.mapRequired("DynamicMask", El.DynamicMask);
2365f757f3fSDimitry Andric   IO.mapRequired("Stream", El.Stream);
2375f757f3fSDimitry Andric }
2385f757f3fSDimitry Andric 
2395f757f3fSDimitry Andric void ScalarEnumerationTraits<dxbc::PSV::SemanticKind>::enumeration(
2405f757f3fSDimitry Andric     IO &IO, dxbc::PSV::SemanticKind &Value) {
2415f757f3fSDimitry Andric   for (const auto &E : dxbc::PSV::getSemanticKinds())
2425f757f3fSDimitry Andric     IO.enumCase(Value, E.Name.str().c_str(), E.Value);
2435f757f3fSDimitry Andric }
2445f757f3fSDimitry Andric 
2455f757f3fSDimitry Andric void ScalarEnumerationTraits<dxbc::PSV::ComponentType>::enumeration(
2465f757f3fSDimitry Andric     IO &IO, dxbc::PSV::ComponentType &Value) {
2475f757f3fSDimitry Andric   for (const auto &E : dxbc::PSV::getComponentTypes())
2485f757f3fSDimitry Andric     IO.enumCase(Value, E.Name.str().c_str(), E.Value);
2495f757f3fSDimitry Andric }
2505f757f3fSDimitry Andric 
2515f757f3fSDimitry Andric void ScalarEnumerationTraits<dxbc::PSV::InterpolationMode>::enumeration(
2525f757f3fSDimitry Andric     IO &IO, dxbc::PSV::InterpolationMode &Value) {
2535f757f3fSDimitry Andric   for (const auto &E : dxbc::PSV::getInterpolationModes())
2545f757f3fSDimitry Andric     IO.enumCase(Value, E.Name.str().c_str(), E.Value);
2555f757f3fSDimitry Andric }
2565f757f3fSDimitry Andric 
2575f757f3fSDimitry Andric void ScalarEnumerationTraits<dxbc::D3DSystemValue>::enumeration(
2585f757f3fSDimitry Andric     IO &IO, dxbc::D3DSystemValue &Value) {
2595f757f3fSDimitry Andric   for (const auto &E : dxbc::getD3DSystemValues())
2605f757f3fSDimitry Andric     IO.enumCase(Value, E.Name.str().c_str(), E.Value);
2615f757f3fSDimitry Andric }
2625f757f3fSDimitry Andric 
2635f757f3fSDimitry Andric void ScalarEnumerationTraits<dxbc::SigMinPrecision>::enumeration(
2645f757f3fSDimitry Andric     IO &IO, dxbc::SigMinPrecision &Value) {
2655f757f3fSDimitry Andric   for (const auto &E : dxbc::getSigMinPrecisions())
2665f757f3fSDimitry Andric     IO.enumCase(Value, E.Name.str().c_str(), E.Value);
2675f757f3fSDimitry Andric }
2685f757f3fSDimitry Andric 
2695f757f3fSDimitry Andric void ScalarEnumerationTraits<dxbc::SigComponentType>::enumeration(
2705f757f3fSDimitry Andric     IO &IO, dxbc::SigComponentType &Value) {
2715f757f3fSDimitry Andric   for (const auto &E : dxbc::getSigComponentTypes())
2725f757f3fSDimitry Andric     IO.enumCase(Value, E.Name.str().c_str(), E.Value);
2735f757f3fSDimitry Andric }
2745f757f3fSDimitry Andric 
27581ad6265SDimitry Andric } // namespace yaml
27606c3fb27SDimitry Andric 
27706c3fb27SDimitry Andric void DXContainerYAML::PSVInfo::mapInfoForVersion(yaml::IO &IO) {
27806c3fb27SDimitry Andric   dxbc::PipelinePSVInfo &StageInfo = Info.StageInfo;
27906c3fb27SDimitry Andric   Triple::EnvironmentType Stage = dxbc::getShaderStage(Info.ShaderStage);
28006c3fb27SDimitry Andric 
28106c3fb27SDimitry Andric   switch (Stage) {
28206c3fb27SDimitry Andric   case Triple::EnvironmentType::Pixel:
28306c3fb27SDimitry Andric     IO.mapRequired("DepthOutput", StageInfo.PS.DepthOutput);
28406c3fb27SDimitry Andric     IO.mapRequired("SampleFrequency", StageInfo.PS.SampleFrequency);
28506c3fb27SDimitry Andric     break;
28606c3fb27SDimitry Andric   case Triple::EnvironmentType::Vertex:
28706c3fb27SDimitry Andric     IO.mapRequired("OutputPositionPresent", StageInfo.VS.OutputPositionPresent);
28806c3fb27SDimitry Andric     break;
28906c3fb27SDimitry Andric   case Triple::EnvironmentType::Geometry:
29006c3fb27SDimitry Andric     IO.mapRequired("InputPrimitive", StageInfo.GS.InputPrimitive);
29106c3fb27SDimitry Andric     IO.mapRequired("OutputTopology", StageInfo.GS.OutputTopology);
29206c3fb27SDimitry Andric     IO.mapRequired("OutputStreamMask", StageInfo.GS.OutputStreamMask);
29306c3fb27SDimitry Andric     IO.mapRequired("OutputPositionPresent", StageInfo.GS.OutputPositionPresent);
29406c3fb27SDimitry Andric     break;
29506c3fb27SDimitry Andric   case Triple::EnvironmentType::Hull:
29606c3fb27SDimitry Andric     IO.mapRequired("InputControlPointCount",
29706c3fb27SDimitry Andric                    StageInfo.HS.InputControlPointCount);
29806c3fb27SDimitry Andric     IO.mapRequired("OutputControlPointCount",
29906c3fb27SDimitry Andric                    StageInfo.HS.OutputControlPointCount);
30006c3fb27SDimitry Andric     IO.mapRequired("TessellatorDomain", StageInfo.HS.TessellatorDomain);
30106c3fb27SDimitry Andric     IO.mapRequired("TessellatorOutputPrimitive",
30206c3fb27SDimitry Andric                    StageInfo.HS.TessellatorOutputPrimitive);
30306c3fb27SDimitry Andric     break;
30406c3fb27SDimitry Andric   case Triple::EnvironmentType::Domain:
30506c3fb27SDimitry Andric     IO.mapRequired("InputControlPointCount",
30606c3fb27SDimitry Andric                    StageInfo.DS.InputControlPointCount);
30706c3fb27SDimitry Andric     IO.mapRequired("OutputPositionPresent", StageInfo.DS.OutputPositionPresent);
30806c3fb27SDimitry Andric     IO.mapRequired("TessellatorDomain", StageInfo.DS.TessellatorDomain);
30906c3fb27SDimitry Andric     break;
31006c3fb27SDimitry Andric   case Triple::EnvironmentType::Mesh:
31106c3fb27SDimitry Andric     IO.mapRequired("GroupSharedBytesUsed", StageInfo.MS.GroupSharedBytesUsed);
31206c3fb27SDimitry Andric     IO.mapRequired("GroupSharedBytesDependentOnViewID",
31306c3fb27SDimitry Andric                    StageInfo.MS.GroupSharedBytesDependentOnViewID);
31406c3fb27SDimitry Andric     IO.mapRequired("PayloadSizeInBytes", StageInfo.MS.PayloadSizeInBytes);
31506c3fb27SDimitry Andric     IO.mapRequired("MaxOutputVertices", StageInfo.MS.MaxOutputVertices);
31606c3fb27SDimitry Andric     IO.mapRequired("MaxOutputPrimitives", StageInfo.MS.MaxOutputPrimitives);
31706c3fb27SDimitry Andric     break;
31806c3fb27SDimitry Andric   case Triple::EnvironmentType::Amplification:
31906c3fb27SDimitry Andric     IO.mapRequired("PayloadSizeInBytes", StageInfo.AS.PayloadSizeInBytes);
32006c3fb27SDimitry Andric     break;
32106c3fb27SDimitry Andric   default:
32206c3fb27SDimitry Andric     break;
32306c3fb27SDimitry Andric   }
32406c3fb27SDimitry Andric 
32506c3fb27SDimitry Andric   IO.mapRequired("MinimumWaveLaneCount", Info.MinimumWaveLaneCount);
32606c3fb27SDimitry Andric   IO.mapRequired("MaximumWaveLaneCount", Info.MaximumWaveLaneCount);
32706c3fb27SDimitry Andric 
32806c3fb27SDimitry Andric   if (Version == 0)
32906c3fb27SDimitry Andric     return;
33006c3fb27SDimitry Andric 
33106c3fb27SDimitry Andric   IO.mapRequired("UsesViewID", Info.UsesViewID);
33206c3fb27SDimitry Andric 
33306c3fb27SDimitry Andric   switch (Stage) {
33406c3fb27SDimitry Andric   case Triple::EnvironmentType::Geometry:
33506c3fb27SDimitry Andric     IO.mapRequired("MaxVertexCount", Info.GeomData.MaxVertexCount);
33606c3fb27SDimitry Andric     break;
33706c3fb27SDimitry Andric   case Triple::EnvironmentType::Hull:
33806c3fb27SDimitry Andric   case Triple::EnvironmentType::Domain:
33906c3fb27SDimitry Andric     IO.mapRequired("SigPatchConstOrPrimVectors",
34006c3fb27SDimitry Andric                    Info.GeomData.SigPatchConstOrPrimVectors);
34106c3fb27SDimitry Andric     break;
34206c3fb27SDimitry Andric   case Triple::EnvironmentType::Mesh:
34306c3fb27SDimitry Andric     IO.mapRequired("SigPrimVectors", Info.GeomData.MeshInfo.SigPrimVectors);
34406c3fb27SDimitry Andric     IO.mapRequired("MeshOutputTopology",
34506c3fb27SDimitry Andric                    Info.GeomData.MeshInfo.MeshOutputTopology);
34606c3fb27SDimitry Andric     break;
34706c3fb27SDimitry Andric   default:
34806c3fb27SDimitry Andric     break;
34906c3fb27SDimitry Andric   }
35006c3fb27SDimitry Andric 
35106c3fb27SDimitry Andric   IO.mapRequired("SigInputVectors", Info.SigInputVectors);
35206c3fb27SDimitry Andric   MutableArrayRef<uint8_t> Vec(Info.SigOutputVectors);
35306c3fb27SDimitry Andric   IO.mapRequired("SigOutputVectors", Vec);
35406c3fb27SDimitry Andric 
35506c3fb27SDimitry Andric   if (Version == 1)
35606c3fb27SDimitry Andric     return;
35706c3fb27SDimitry Andric 
35806c3fb27SDimitry Andric   IO.mapRequired("NumThreadsX", Info.NumThreadsX);
35906c3fb27SDimitry Andric   IO.mapRequired("NumThreadsY", Info.NumThreadsY);
36006c3fb27SDimitry Andric   IO.mapRequired("NumThreadsZ", Info.NumThreadsZ);
361*0fca6ea1SDimitry Andric 
362*0fca6ea1SDimitry Andric   if (Version == 2)
363*0fca6ea1SDimitry Andric     return;
364*0fca6ea1SDimitry Andric 
365*0fca6ea1SDimitry Andric   IO.mapRequired("EntryName", EntryName);
36606c3fb27SDimitry Andric }
36706c3fb27SDimitry Andric 
36881ad6265SDimitry Andric } // namespace llvm
369