xref: /llvm-project/llvm/lib/ObjectYAML/DXContainerYAML.cpp (revision 26f6091dc9c24bdf22390f2b9f68aacc4669ef36)
1129c056dSChris Bieneman //===- DXContainerYAML.cpp - DXContainer YAMLIO implementation ------------===//
2129c056dSChris Bieneman //
3129c056dSChris Bieneman // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4129c056dSChris Bieneman // See https://llvm.org/LICENSE.txt for license information.
5129c056dSChris Bieneman // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6129c056dSChris Bieneman //
7129c056dSChris Bieneman //===----------------------------------------------------------------------===//
8129c056dSChris Bieneman //
9129c056dSChris Bieneman // This file defines classes for handling the YAML representation of
10129c056dSChris Bieneman // DXContainerYAML.
11129c056dSChris Bieneman //
12129c056dSChris Bieneman //===----------------------------------------------------------------------===//
13129c056dSChris Bieneman 
14129c056dSChris Bieneman #include "llvm/ObjectYAML/DXContainerYAML.h"
150c3f51c0SChris Bieneman #include "llvm/ADT/ScopeExit.h"
1649dc58f5SChris Bieneman #include "llvm/BinaryFormat/DXContainer.h"
170c3f51c0SChris Bieneman #include "llvm/Support/ScopedPrinter.h"
18129c056dSChris Bieneman 
19129c056dSChris Bieneman namespace llvm {
2049dc58f5SChris Bieneman 
2149dc58f5SChris Bieneman // This assert is duplicated here to leave a breadcrumb of the places that need
2249dc58f5SChris Bieneman // to be updated if flags grow past 64-bits.
2349dc58f5SChris Bieneman static_assert((uint64_t)dxbc::FeatureFlags::NextUnusedBit <= 1ull << 63,
2449dc58f5SChris Bieneman               "Shader flag bits exceed enum size.");
2549dc58f5SChris Bieneman 
2650136ca1SXiang Li DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) {
274dc03701SXiang Li #define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str)                      \
2849dc58f5SChris Bieneman   Val = (FlagData & (uint64_t)dxbc::FeatureFlags::Val) > 0;
2949dc58f5SChris Bieneman #include "llvm/BinaryFormat/DXContainerConstants.def"
3049dc58f5SChris Bieneman }
3149dc58f5SChris Bieneman 
3250136ca1SXiang Li uint64_t DXContainerYAML::ShaderFeatureFlags::getEncodedFlags() {
3349dc58f5SChris Bieneman   uint64_t Flag = 0;
344dc03701SXiang Li #define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str)                      \
3549dc58f5SChris Bieneman   if (Val)                                                                     \
3649dc58f5SChris Bieneman     Flag |= (uint64_t)dxbc::FeatureFlags::Val;
3749dc58f5SChris Bieneman #include "llvm/BinaryFormat/DXContainerConstants.def"
3849dc58f5SChris Bieneman   return Flag;
3949dc58f5SChris Bieneman }
4049dc58f5SChris Bieneman 
412556ba4aSChris Bieneman DXContainerYAML::ShaderHash::ShaderHash(const dxbc::ShaderHash &Data)
422556ba4aSChris Bieneman     : IncludesSource((Data.Flags & static_cast<uint32_t>(
432556ba4aSChris Bieneman                                        dxbc::HashFlags::IncludesSource)) != 0),
442556ba4aSChris Bieneman       Digest(16, 0) {
452556ba4aSChris Bieneman   memcpy(Digest.data(), &Data.Digest[0], 16);
462556ba4aSChris Bieneman }
472556ba4aSChris Bieneman 
48ad93908eSChris Bieneman DXContainerYAML::PSVInfo::PSVInfo() : Version(0) {
49ad93908eSChris Bieneman   memset(&Info, 0, sizeof(Info));
50ad93908eSChris Bieneman }
51ad93908eSChris Bieneman 
52ad93908eSChris Bieneman DXContainerYAML::PSVInfo::PSVInfo(const dxbc::PSV::v0::RuntimeInfo *P,
53ad93908eSChris Bieneman                                   uint16_t Stage)
54ad93908eSChris Bieneman     : Version(0) {
55ad93908eSChris Bieneman   memset(&Info, 0, sizeof(Info));
56ad93908eSChris Bieneman   memcpy(&Info, P, sizeof(dxbc::PSV::v0::RuntimeInfo));
57ad93908eSChris Bieneman 
58ad93908eSChris Bieneman   assert(Stage < std::numeric_limits<uint8_t>::max() &&
59ad93908eSChris Bieneman          "Stage should be a very small number");
60ad93908eSChris Bieneman   // We need to bring the stage in separately since it isn't part of the v1 data
61ad93908eSChris Bieneman   // structure.
62ad93908eSChris Bieneman   Info.ShaderStage = static_cast<uint8_t>(Stage);
63ad93908eSChris Bieneman }
64ad93908eSChris Bieneman 
65ad93908eSChris Bieneman DXContainerYAML::PSVInfo::PSVInfo(const dxbc::PSV::v1::RuntimeInfo *P)
66ad93908eSChris Bieneman     : Version(1) {
67ad93908eSChris Bieneman   memset(&Info, 0, sizeof(Info));
68ad93908eSChris Bieneman   memcpy(&Info, P, sizeof(dxbc::PSV::v1::RuntimeInfo));
69ad93908eSChris Bieneman }
70ad93908eSChris Bieneman 
71ad93908eSChris Bieneman DXContainerYAML::PSVInfo::PSVInfo(const dxbc::PSV::v2::RuntimeInfo *P)
72ad93908eSChris Bieneman     : Version(2) {
73ad93908eSChris Bieneman   memset(&Info, 0, sizeof(Info));
74ad93908eSChris Bieneman   memcpy(&Info, P, sizeof(dxbc::PSV::v2::RuntimeInfo));
75ad93908eSChris Bieneman }
76ad93908eSChris Bieneman 
77c62c7463SCooper Partin DXContainerYAML::PSVInfo::PSVInfo(const dxbc::PSV::v3::RuntimeInfo *P,
78c62c7463SCooper Partin                                   StringRef StringTable)
79c62c7463SCooper Partin     : Version(3),
80c62c7463SCooper Partin       EntryName(StringTable.substr(P->EntryNameOffset,
81c62c7463SCooper Partin                                    StringTable.find('\0', P->EntryNameOffset) -
82c62c7463SCooper Partin                                        P->EntryNameOffset)) {
83c62c7463SCooper Partin   memset(&Info, 0, sizeof(Info));
84c62c7463SCooper Partin   memcpy(&Info, P, sizeof(dxbc::PSV::v3::RuntimeInfo));
85c62c7463SCooper Partin }
86c62c7463SCooper Partin 
87129c056dSChris Bieneman namespace yaml {
88129c056dSChris Bieneman 
89129c056dSChris Bieneman void MappingTraits<DXContainerYAML::VersionTuple>::mapping(
90129c056dSChris Bieneman     IO &IO, DXContainerYAML::VersionTuple &Version) {
91129c056dSChris Bieneman   IO.mapRequired("Major", Version.Major);
92129c056dSChris Bieneman   IO.mapRequired("Minor", Version.Minor);
93129c056dSChris Bieneman }
94129c056dSChris Bieneman 
95129c056dSChris Bieneman void MappingTraits<DXContainerYAML::FileHeader>::mapping(
96129c056dSChris Bieneman     IO &IO, DXContainerYAML::FileHeader &Header) {
97129c056dSChris Bieneman   IO.mapRequired("Hash", Header.Hash);
98129c056dSChris Bieneman   IO.mapRequired("Version", Header.Version);
99129c056dSChris Bieneman   IO.mapOptional("FileSize", Header.FileSize);
100129c056dSChris Bieneman   IO.mapRequired("PartCount", Header.PartCount);
101129c056dSChris Bieneman   IO.mapOptional("PartOffsets", Header.PartOffsets);
102129c056dSChris Bieneman }
103129c056dSChris Bieneman 
10421c94523SChris Bieneman void MappingTraits<DXContainerYAML::DXILProgram>::mapping(
10521c94523SChris Bieneman     IO &IO, DXContainerYAML::DXILProgram &Program) {
10621c94523SChris Bieneman   IO.mapRequired("MajorVersion", Program.MajorVersion);
10721c94523SChris Bieneman   IO.mapRequired("MinorVersion", Program.MinorVersion);
10821c94523SChris Bieneman   IO.mapRequired("ShaderKind", Program.ShaderKind);
10921c94523SChris Bieneman   IO.mapOptional("Size", Program.Size);
110157f1f25SChris Bieneman   IO.mapRequired("DXILMajorVersion", Program.DXILMajorVersion);
11121c94523SChris Bieneman   IO.mapRequired("DXILMinorVersion", Program.DXILMinorVersion);
11221c94523SChris Bieneman   IO.mapOptional("DXILSize", Program.DXILSize);
11321c94523SChris Bieneman   IO.mapOptional("DXIL", Program.DXIL);
11421c94523SChris Bieneman }
11521c94523SChris Bieneman 
11650136ca1SXiang Li void MappingTraits<DXContainerYAML::ShaderFeatureFlags>::mapping(
11750136ca1SXiang Li     IO &IO, DXContainerYAML::ShaderFeatureFlags &Flags) {
1184dc03701SXiang Li #define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str)                      \
1194dc03701SXiang Li   IO.mapRequired(#Val, Flags.Val);
12049dc58f5SChris Bieneman #include "llvm/BinaryFormat/DXContainerConstants.def"
12149dc58f5SChris Bieneman }
12249dc58f5SChris Bieneman 
1232556ba4aSChris Bieneman void MappingTraits<DXContainerYAML::ShaderHash>::mapping(
1242556ba4aSChris Bieneman     IO &IO, DXContainerYAML::ShaderHash &Hash) {
1252556ba4aSChris Bieneman   IO.mapRequired("IncludesSource", Hash.IncludesSource);
1262556ba4aSChris Bieneman   IO.mapRequired("Digest", Hash.Digest);
1272556ba4aSChris Bieneman }
1282556ba4aSChris Bieneman 
129ad93908eSChris Bieneman void MappingTraits<DXContainerYAML::PSVInfo>::mapping(
130ad93908eSChris Bieneman     IO &IO, DXContainerYAML::PSVInfo &PSV) {
131ad93908eSChris Bieneman   IO.mapRequired("Version", PSV.Version);
132ad93908eSChris Bieneman 
133dd3f7b02SChris Bieneman   // Store the PSV version in the YAML context.
134dd3f7b02SChris Bieneman   void *OldContext = IO.getContext();
135dd3f7b02SChris Bieneman   uint32_t Version = PSV.Version;
136dd3f7b02SChris Bieneman   IO.setContext(&Version);
137dd3f7b02SChris Bieneman 
1380c3f51c0SChris Bieneman   // Restore the YAML context on function exit.
1390c3f51c0SChris Bieneman   auto RestoreContext = make_scope_exit([&]() { IO.setContext(OldContext); });
1400c3f51c0SChris Bieneman 
141ad93908eSChris Bieneman   // Shader stage is only included in binaries for v1 and later, but we always
142ad93908eSChris Bieneman   // include it since it simplifies parsing and file construction.
143ad93908eSChris Bieneman   IO.mapRequired("ShaderStage", PSV.Info.ShaderStage);
144ad93908eSChris Bieneman   PSV.mapInfoForVersion(IO);
145dd3f7b02SChris Bieneman 
1465fdf8605SChris Bieneman   IO.mapRequired("ResourceStride", PSV.ResourceStride);
147dd3f7b02SChris Bieneman   IO.mapRequired("Resources", PSV.Resources);
1480c3f51c0SChris Bieneman   if (PSV.Version == 0)
1490c3f51c0SChris Bieneman     return;
1500c3f51c0SChris Bieneman   IO.mapRequired("SigInputElements", PSV.SigInputElements);
1510c3f51c0SChris Bieneman   IO.mapRequired("SigOutputElements", PSV.SigOutputElements);
1520c3f51c0SChris Bieneman   IO.mapRequired("SigPatchOrPrimElements", PSV.SigPatchOrPrimElements);
153b799e9daSChris B 
154b799e9daSChris B   Triple::EnvironmentType Stage = dxbc::getShaderStage(PSV.Info.ShaderStage);
155b799e9daSChris B   if (PSV.Info.UsesViewID) {
156b799e9daSChris B     MutableArrayRef<SmallVector<llvm::yaml::Hex32>> MutableOutMasks(
157b799e9daSChris B         PSV.OutputVectorMasks);
158b799e9daSChris B     IO.mapRequired("OutputVectorMasks", MutableOutMasks);
159b799e9daSChris B     if (Stage == Triple::EnvironmentType::Hull)
160b799e9daSChris B       IO.mapRequired("PatchOrPrimMasks", PSV.PatchOrPrimMasks);
161b799e9daSChris B   }
162b799e9daSChris B   MutableArrayRef<SmallVector<llvm::yaml::Hex32>> MutableIOMap(
163b799e9daSChris B       PSV.InputOutputMap);
164b799e9daSChris B   IO.mapRequired("InputOutputMap", MutableIOMap);
165b799e9daSChris B 
166b799e9daSChris B   if (Stage == Triple::EnvironmentType::Hull)
167b799e9daSChris B     IO.mapRequired("InputPatchMap", PSV.InputPatchMap);
168b799e9daSChris B 
169b799e9daSChris B   if (Stage == Triple::EnvironmentType::Domain)
170b799e9daSChris B     IO.mapRequired("PatchOutputMap", PSV.PatchOutputMap);
171ad93908eSChris Bieneman }
172ad93908eSChris Bieneman 
1739f87522bSChris B void MappingTraits<DXContainerYAML::SignatureParameter>::mapping(
1749f87522bSChris B     IO &IO, DXContainerYAML::SignatureParameter &S) {
1759f87522bSChris B   IO.mapRequired("Stream", S.Stream);
1769f87522bSChris B   IO.mapRequired("Name", S.Name);
1779f87522bSChris B   IO.mapRequired("Index", S.Index);
1789f87522bSChris B   IO.mapRequired("SystemValue", S.SystemValue);
1799f87522bSChris B   IO.mapRequired("CompType", S.CompType);
1809f87522bSChris B   IO.mapRequired("Register", S.Register);
1819f87522bSChris B   IO.mapRequired("Mask", S.Mask);
1829f87522bSChris B   IO.mapRequired("ExclusiveMask", S.ExclusiveMask);
1839f87522bSChris B   IO.mapRequired("MinPrecision", S.MinPrecision);
1849f87522bSChris B }
1859f87522bSChris B 
1869f87522bSChris B void MappingTraits<DXContainerYAML::Signature>::mapping(
1879f87522bSChris B     IO &IO, DXContainerYAML::Signature &S) {
1889f87522bSChris B   IO.mapRequired("Parameters", S.Parameters);
1899f87522bSChris B }
1909f87522bSChris B 
191129c056dSChris Bieneman void MappingTraits<DXContainerYAML::Part>::mapping(IO &IO,
192129c056dSChris Bieneman                                                    DXContainerYAML::Part &P) {
193129c056dSChris Bieneman   IO.mapRequired("Name", P.Name);
194129c056dSChris Bieneman   IO.mapRequired("Size", P.Size);
19521c94523SChris Bieneman   IO.mapOptional("Program", P.Program);
19649dc58f5SChris Bieneman   IO.mapOptional("Flags", P.Flags);
1972556ba4aSChris Bieneman   IO.mapOptional("Hash", P.Hash);
198ad93908eSChris Bieneman   IO.mapOptional("PSVInfo", P.Info);
1999f87522bSChris B   IO.mapOptional("Signature", P.Signature);
200129c056dSChris Bieneman }
201129c056dSChris Bieneman 
202129c056dSChris Bieneman void MappingTraits<DXContainerYAML::Object>::mapping(
203129c056dSChris Bieneman     IO &IO, DXContainerYAML::Object &Obj) {
204129c056dSChris Bieneman   IO.mapTag("!dxcontainer", true);
205129c056dSChris Bieneman   IO.mapRequired("Header", Obj.Header);
206129c056dSChris Bieneman   IO.mapRequired("Parts", Obj.Parts);
207129c056dSChris Bieneman }
208129c056dSChris Bieneman 
209*26f6091dSXiang Li void MappingTraits<DXContainerYAML::ResourceFlags>::mapping(
210*26f6091dSXiang Li     IO &IO, DXContainerYAML::ResourceFlags &Flags) {
211*26f6091dSXiang Li #define RESOURCE_FLAG(FlagIndex, Enum) IO.mapRequired(#Enum, Flags.Bits.Enum);
212*26f6091dSXiang Li #include "llvm/BinaryFormat/DXContainerConstants.def"
213*26f6091dSXiang Li }
214*26f6091dSXiang Li 
215dd3f7b02SChris Bieneman void MappingTraits<DXContainerYAML::ResourceBindInfo>::mapping(
216dd3f7b02SChris Bieneman     IO &IO, DXContainerYAML::ResourceBindInfo &Res) {
217dd3f7b02SChris Bieneman   IO.mapRequired("Type", Res.Type);
218dd3f7b02SChris Bieneman   IO.mapRequired("Space", Res.Space);
219dd3f7b02SChris Bieneman   IO.mapRequired("LowerBound", Res.LowerBound);
220dd3f7b02SChris Bieneman   IO.mapRequired("UpperBound", Res.UpperBound);
221dd3f7b02SChris Bieneman 
222dd3f7b02SChris Bieneman   const uint32_t *PSVVersion = static_cast<uint32_t *>(IO.getContext());
223dd3f7b02SChris Bieneman   if (*PSVVersion < 2)
224dd3f7b02SChris Bieneman     return;
225dd3f7b02SChris Bieneman 
226dd3f7b02SChris Bieneman   IO.mapRequired("Kind", Res.Kind);
227dd3f7b02SChris Bieneman   IO.mapRequired("Flags", Res.Flags);
228dd3f7b02SChris Bieneman }
229dd3f7b02SChris Bieneman 
2300c3f51c0SChris Bieneman void MappingTraits<DXContainerYAML::SignatureElement>::mapping(
2310c3f51c0SChris Bieneman     IO &IO, DXContainerYAML::SignatureElement &El) {
2320c3f51c0SChris Bieneman   IO.mapRequired("Name", El.Name);
2330c3f51c0SChris Bieneman   IO.mapRequired("Indices", El.Indices);
2340c3f51c0SChris Bieneman   IO.mapRequired("StartRow", El.StartRow);
2350c3f51c0SChris Bieneman   IO.mapRequired("Cols", El.Cols);
2360c3f51c0SChris Bieneman   IO.mapRequired("StartCol", El.StartCol);
2370c3f51c0SChris Bieneman   IO.mapRequired("Allocated", El.Allocated);
2380c3f51c0SChris Bieneman   IO.mapRequired("Kind", El.Kind);
2390c3f51c0SChris Bieneman   IO.mapRequired("ComponentType", El.Type);
2400c3f51c0SChris Bieneman   IO.mapRequired("Interpolation", El.Mode);
2410c3f51c0SChris Bieneman   IO.mapRequired("DynamicMask", El.DynamicMask);
2420c3f51c0SChris Bieneman   IO.mapRequired("Stream", El.Stream);
2430c3f51c0SChris Bieneman }
2440c3f51c0SChris Bieneman 
2450c3f51c0SChris Bieneman void ScalarEnumerationTraits<dxbc::PSV::SemanticKind>::enumeration(
2460c3f51c0SChris Bieneman     IO &IO, dxbc::PSV::SemanticKind &Value) {
2470c3f51c0SChris Bieneman   for (const auto &E : dxbc::PSV::getSemanticKinds())
2480c3f51c0SChris Bieneman     IO.enumCase(Value, E.Name.str().c_str(), E.Value);
2490c3f51c0SChris Bieneman }
2500c3f51c0SChris Bieneman 
2510c3f51c0SChris Bieneman void ScalarEnumerationTraits<dxbc::PSV::ComponentType>::enumeration(
2520c3f51c0SChris Bieneman     IO &IO, dxbc::PSV::ComponentType &Value) {
2530c3f51c0SChris Bieneman   for (const auto &E : dxbc::PSV::getComponentTypes())
2540c3f51c0SChris Bieneman     IO.enumCase(Value, E.Name.str().c_str(), E.Value);
2550c3f51c0SChris Bieneman }
2560c3f51c0SChris Bieneman 
2570c3f51c0SChris Bieneman void ScalarEnumerationTraits<dxbc::PSV::InterpolationMode>::enumeration(
2580c3f51c0SChris Bieneman     IO &IO, dxbc::PSV::InterpolationMode &Value) {
2590c3f51c0SChris Bieneman   for (const auto &E : dxbc::PSV::getInterpolationModes())
2600c3f51c0SChris Bieneman     IO.enumCase(Value, E.Name.str().c_str(), E.Value);
2610c3f51c0SChris Bieneman }
2620c3f51c0SChris Bieneman 
263fd0dbc7fSXiang Li void ScalarEnumerationTraits<dxbc::PSV::ResourceType>::enumeration(
264fd0dbc7fSXiang Li     IO &IO, dxbc::PSV::ResourceType &Value) {
265fd0dbc7fSXiang Li   for (const auto &E : dxbc::PSV::getResourceTypes())
266fd0dbc7fSXiang Li     IO.enumCase(Value, E.Name.str().c_str(), E.Value);
267fd0dbc7fSXiang Li }
268fd0dbc7fSXiang Li 
269fd0dbc7fSXiang Li void ScalarEnumerationTraits<dxbc::PSV::ResourceKind>::enumeration(
270fd0dbc7fSXiang Li     IO &IO, dxbc::PSV::ResourceKind &Value) {
271fd0dbc7fSXiang Li   for (const auto &E : dxbc::PSV::getResourceKinds())
272fd0dbc7fSXiang Li     IO.enumCase(Value, E.Name.str().c_str(), E.Value);
273fd0dbc7fSXiang Li }
274fd0dbc7fSXiang Li 
2759f87522bSChris B void ScalarEnumerationTraits<dxbc::D3DSystemValue>::enumeration(
2769f87522bSChris B     IO &IO, dxbc::D3DSystemValue &Value) {
2779f87522bSChris B   for (const auto &E : dxbc::getD3DSystemValues())
2789f87522bSChris B     IO.enumCase(Value, E.Name.str().c_str(), E.Value);
2799f87522bSChris B }
2809f87522bSChris B 
2819f87522bSChris B void ScalarEnumerationTraits<dxbc::SigMinPrecision>::enumeration(
2829f87522bSChris B     IO &IO, dxbc::SigMinPrecision &Value) {
2839f87522bSChris B   for (const auto &E : dxbc::getSigMinPrecisions())
2849f87522bSChris B     IO.enumCase(Value, E.Name.str().c_str(), E.Value);
2859f87522bSChris B }
2869f87522bSChris B 
2879f87522bSChris B void ScalarEnumerationTraits<dxbc::SigComponentType>::enumeration(
2889f87522bSChris B     IO &IO, dxbc::SigComponentType &Value) {
2899f87522bSChris B   for (const auto &E : dxbc::getSigComponentTypes())
2909f87522bSChris B     IO.enumCase(Value, E.Name.str().c_str(), E.Value);
2919f87522bSChris B }
2929f87522bSChris B 
293129c056dSChris Bieneman } // namespace yaml
294ad93908eSChris Bieneman 
295ad93908eSChris Bieneman void DXContainerYAML::PSVInfo::mapInfoForVersion(yaml::IO &IO) {
296ad93908eSChris Bieneman   dxbc::PipelinePSVInfo &StageInfo = Info.StageInfo;
297ad93908eSChris Bieneman   Triple::EnvironmentType Stage = dxbc::getShaderStage(Info.ShaderStage);
298ad93908eSChris Bieneman 
299ad93908eSChris Bieneman   switch (Stage) {
300ad93908eSChris Bieneman   case Triple::EnvironmentType::Pixel:
301ad93908eSChris Bieneman     IO.mapRequired("DepthOutput", StageInfo.PS.DepthOutput);
302ad93908eSChris Bieneman     IO.mapRequired("SampleFrequency", StageInfo.PS.SampleFrequency);
303ad93908eSChris Bieneman     break;
304ad93908eSChris Bieneman   case Triple::EnvironmentType::Vertex:
305ad93908eSChris Bieneman     IO.mapRequired("OutputPositionPresent", StageInfo.VS.OutputPositionPresent);
306ad93908eSChris Bieneman     break;
307ad93908eSChris Bieneman   case Triple::EnvironmentType::Geometry:
308ad93908eSChris Bieneman     IO.mapRequired("InputPrimitive", StageInfo.GS.InputPrimitive);
309ad93908eSChris Bieneman     IO.mapRequired("OutputTopology", StageInfo.GS.OutputTopology);
310ad93908eSChris Bieneman     IO.mapRequired("OutputStreamMask", StageInfo.GS.OutputStreamMask);
311ad93908eSChris Bieneman     IO.mapRequired("OutputPositionPresent", StageInfo.GS.OutputPositionPresent);
312ad93908eSChris Bieneman     break;
313ad93908eSChris Bieneman   case Triple::EnvironmentType::Hull:
314ad93908eSChris Bieneman     IO.mapRequired("InputControlPointCount",
315ad93908eSChris Bieneman                    StageInfo.HS.InputControlPointCount);
316ad93908eSChris Bieneman     IO.mapRequired("OutputControlPointCount",
317ad93908eSChris Bieneman                    StageInfo.HS.OutputControlPointCount);
318ad93908eSChris Bieneman     IO.mapRequired("TessellatorDomain", StageInfo.HS.TessellatorDomain);
319ad93908eSChris Bieneman     IO.mapRequired("TessellatorOutputPrimitive",
320ad93908eSChris Bieneman                    StageInfo.HS.TessellatorOutputPrimitive);
321ad93908eSChris Bieneman     break;
322ad93908eSChris Bieneman   case Triple::EnvironmentType::Domain:
323ad93908eSChris Bieneman     IO.mapRequired("InputControlPointCount",
324ad93908eSChris Bieneman                    StageInfo.DS.InputControlPointCount);
325ad93908eSChris Bieneman     IO.mapRequired("OutputPositionPresent", StageInfo.DS.OutputPositionPresent);
326ad93908eSChris Bieneman     IO.mapRequired("TessellatorDomain", StageInfo.DS.TessellatorDomain);
327ad93908eSChris Bieneman     break;
328ad93908eSChris Bieneman   case Triple::EnvironmentType::Mesh:
329ad93908eSChris Bieneman     IO.mapRequired("GroupSharedBytesUsed", StageInfo.MS.GroupSharedBytesUsed);
330ad93908eSChris Bieneman     IO.mapRequired("GroupSharedBytesDependentOnViewID",
331ad93908eSChris Bieneman                    StageInfo.MS.GroupSharedBytesDependentOnViewID);
332ad93908eSChris Bieneman     IO.mapRequired("PayloadSizeInBytes", StageInfo.MS.PayloadSizeInBytes);
333ad93908eSChris Bieneman     IO.mapRequired("MaxOutputVertices", StageInfo.MS.MaxOutputVertices);
334ad93908eSChris Bieneman     IO.mapRequired("MaxOutputPrimitives", StageInfo.MS.MaxOutputPrimitives);
335ad93908eSChris Bieneman     break;
336ad93908eSChris Bieneman   case Triple::EnvironmentType::Amplification:
337ad93908eSChris Bieneman     IO.mapRequired("PayloadSizeInBytes", StageInfo.AS.PayloadSizeInBytes);
338ad93908eSChris Bieneman     break;
339ad93908eSChris Bieneman   default:
340ad93908eSChris Bieneman     break;
341ad93908eSChris Bieneman   }
342ad93908eSChris Bieneman 
343ad93908eSChris Bieneman   IO.mapRequired("MinimumWaveLaneCount", Info.MinimumWaveLaneCount);
344ad93908eSChris Bieneman   IO.mapRequired("MaximumWaveLaneCount", Info.MaximumWaveLaneCount);
345ad93908eSChris Bieneman 
346ad93908eSChris Bieneman   if (Version == 0)
347ad93908eSChris Bieneman     return;
348ad93908eSChris Bieneman 
349ad93908eSChris Bieneman   IO.mapRequired("UsesViewID", Info.UsesViewID);
350ad93908eSChris Bieneman 
351ad93908eSChris Bieneman   switch (Stage) {
352ad93908eSChris Bieneman   case Triple::EnvironmentType::Geometry:
353ad93908eSChris Bieneman     IO.mapRequired("MaxVertexCount", Info.GeomData.MaxVertexCount);
354ad93908eSChris Bieneman     break;
355ad93908eSChris Bieneman   case Triple::EnvironmentType::Hull:
356ad93908eSChris Bieneman   case Triple::EnvironmentType::Domain:
357ad93908eSChris Bieneman     IO.mapRequired("SigPatchConstOrPrimVectors",
358ad93908eSChris Bieneman                    Info.GeomData.SigPatchConstOrPrimVectors);
359ad93908eSChris Bieneman     break;
360ad93908eSChris Bieneman   case Triple::EnvironmentType::Mesh:
361ad93908eSChris Bieneman     IO.mapRequired("SigPrimVectors", Info.GeomData.MeshInfo.SigPrimVectors);
362ad93908eSChris Bieneman     IO.mapRequired("MeshOutputTopology",
363ad93908eSChris Bieneman                    Info.GeomData.MeshInfo.MeshOutputTopology);
364ad93908eSChris Bieneman     break;
365ad93908eSChris Bieneman   default:
366ad93908eSChris Bieneman     break;
367ad93908eSChris Bieneman   }
368ad93908eSChris Bieneman 
369ad93908eSChris Bieneman   IO.mapRequired("SigInputVectors", Info.SigInputVectors);
370ad93908eSChris Bieneman   MutableArrayRef<uint8_t> Vec(Info.SigOutputVectors);
371ad93908eSChris Bieneman   IO.mapRequired("SigOutputVectors", Vec);
372ad93908eSChris Bieneman 
373ad93908eSChris Bieneman   if (Version == 1)
374ad93908eSChris Bieneman     return;
375ad93908eSChris Bieneman 
376ad93908eSChris Bieneman   IO.mapRequired("NumThreadsX", Info.NumThreadsX);
377ad93908eSChris Bieneman   IO.mapRequired("NumThreadsY", Info.NumThreadsY);
378ad93908eSChris Bieneman   IO.mapRequired("NumThreadsZ", Info.NumThreadsZ);
379c62c7463SCooper Partin 
380c62c7463SCooper Partin   if (Version == 2)
381c62c7463SCooper Partin     return;
382c62c7463SCooper Partin 
383c62c7463SCooper Partin   IO.mapRequired("EntryName", EntryName);
384ad93908eSChris Bieneman }
385ad93908eSChris Bieneman 
386129c056dSChris Bieneman } // namespace llvm
387