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