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