Path: blob/main/contrib/llvm-project/llvm/lib/ObjectYAML/DXContainerYAML.cpp
35234 views
//===- DXContainerYAML.cpp - DXContainer YAMLIO implementation ------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file defines classes for handling the YAML representation of9// DXContainerYAML.10//11//===----------------------------------------------------------------------===//1213#include "llvm/ObjectYAML/DXContainerYAML.h"14#include "llvm/ADT/ScopeExit.h"15#include "llvm/BinaryFormat/DXContainer.h"16#include "llvm/Support/ScopedPrinter.h"1718namespace llvm {1920// This assert is duplicated here to leave a breadcrumb of the places that need21// to be updated if flags grow past 64-bits.22static_assert((uint64_t)dxbc::FeatureFlags::NextUnusedBit <= 1ull << 63,23"Shader flag bits exceed enum size.");2425DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) {26#define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str) \27Val = (FlagData & (uint64_t)dxbc::FeatureFlags::Val) > 0;28#include "llvm/BinaryFormat/DXContainerConstants.def"29}3031uint64_t DXContainerYAML::ShaderFeatureFlags::getEncodedFlags() {32uint64_t Flag = 0;33#define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str) \34if (Val) \35Flag |= (uint64_t)dxbc::FeatureFlags::Val;36#include "llvm/BinaryFormat/DXContainerConstants.def"37return Flag;38}3940DXContainerYAML::ShaderHash::ShaderHash(const dxbc::ShaderHash &Data)41: IncludesSource((Data.Flags & static_cast<uint32_t>(42dxbc::HashFlags::IncludesSource)) != 0),43Digest(16, 0) {44memcpy(Digest.data(), &Data.Digest[0], 16);45}4647DXContainerYAML::PSVInfo::PSVInfo() : Version(0) {48memset(&Info, 0, sizeof(Info));49}5051DXContainerYAML::PSVInfo::PSVInfo(const dxbc::PSV::v0::RuntimeInfo *P,52uint16_t Stage)53: Version(0) {54memset(&Info, 0, sizeof(Info));55memcpy(&Info, P, sizeof(dxbc::PSV::v0::RuntimeInfo));5657assert(Stage < std::numeric_limits<uint8_t>::max() &&58"Stage should be a very small number");59// We need to bring the stage in separately since it isn't part of the v1 data60// structure.61Info.ShaderStage = static_cast<uint8_t>(Stage);62}6364DXContainerYAML::PSVInfo::PSVInfo(const dxbc::PSV::v1::RuntimeInfo *P)65: Version(1) {66memset(&Info, 0, sizeof(Info));67memcpy(&Info, P, sizeof(dxbc::PSV::v1::RuntimeInfo));68}6970DXContainerYAML::PSVInfo::PSVInfo(const dxbc::PSV::v2::RuntimeInfo *P)71: Version(2) {72memset(&Info, 0, sizeof(Info));73memcpy(&Info, P, sizeof(dxbc::PSV::v2::RuntimeInfo));74}7576DXContainerYAML::PSVInfo::PSVInfo(const dxbc::PSV::v3::RuntimeInfo *P,77StringRef StringTable)78: Version(3),79EntryName(StringTable.substr(P->EntryNameOffset,80StringTable.find('\0', P->EntryNameOffset) -81P->EntryNameOffset)) {82memset(&Info, 0, sizeof(Info));83memcpy(&Info, P, sizeof(dxbc::PSV::v3::RuntimeInfo));84}8586namespace yaml {8788void MappingTraits<DXContainerYAML::VersionTuple>::mapping(89IO &IO, DXContainerYAML::VersionTuple &Version) {90IO.mapRequired("Major", Version.Major);91IO.mapRequired("Minor", Version.Minor);92}9394void MappingTraits<DXContainerYAML::FileHeader>::mapping(95IO &IO, DXContainerYAML::FileHeader &Header) {96IO.mapRequired("Hash", Header.Hash);97IO.mapRequired("Version", Header.Version);98IO.mapOptional("FileSize", Header.FileSize);99IO.mapRequired("PartCount", Header.PartCount);100IO.mapOptional("PartOffsets", Header.PartOffsets);101}102103void MappingTraits<DXContainerYAML::DXILProgram>::mapping(104IO &IO, DXContainerYAML::DXILProgram &Program) {105IO.mapRequired("MajorVersion", Program.MajorVersion);106IO.mapRequired("MinorVersion", Program.MinorVersion);107IO.mapRequired("ShaderKind", Program.ShaderKind);108IO.mapOptional("Size", Program.Size);109IO.mapRequired("DXILMajorVersion", Program.DXILMajorVersion);110IO.mapRequired("DXILMinorVersion", Program.DXILMinorVersion);111IO.mapOptional("DXILSize", Program.DXILSize);112IO.mapOptional("DXIL", Program.DXIL);113}114115void MappingTraits<DXContainerYAML::ShaderFeatureFlags>::mapping(116IO &IO, DXContainerYAML::ShaderFeatureFlags &Flags) {117#define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str) \118IO.mapRequired(#Val, Flags.Val);119#include "llvm/BinaryFormat/DXContainerConstants.def"120}121122void MappingTraits<DXContainerYAML::ShaderHash>::mapping(123IO &IO, DXContainerYAML::ShaderHash &Hash) {124IO.mapRequired("IncludesSource", Hash.IncludesSource);125IO.mapRequired("Digest", Hash.Digest);126}127128void MappingTraits<DXContainerYAML::PSVInfo>::mapping(129IO &IO, DXContainerYAML::PSVInfo &PSV) {130IO.mapRequired("Version", PSV.Version);131132// Store the PSV version in the YAML context.133void *OldContext = IO.getContext();134uint32_t Version = PSV.Version;135IO.setContext(&Version);136137// Restore the YAML context on function exit.138auto RestoreContext = make_scope_exit([&]() { IO.setContext(OldContext); });139140// Shader stage is only included in binaries for v1 and later, but we always141// include it since it simplifies parsing and file construction.142IO.mapRequired("ShaderStage", PSV.Info.ShaderStage);143PSV.mapInfoForVersion(IO);144145IO.mapRequired("ResourceStride", PSV.ResourceStride);146IO.mapRequired("Resources", PSV.Resources);147if (PSV.Version == 0)148return;149IO.mapRequired("SigInputElements", PSV.SigInputElements);150IO.mapRequired("SigOutputElements", PSV.SigOutputElements);151IO.mapRequired("SigPatchOrPrimElements", PSV.SigPatchOrPrimElements);152153Triple::EnvironmentType Stage = dxbc::getShaderStage(PSV.Info.ShaderStage);154if (PSV.Info.UsesViewID) {155MutableArrayRef<SmallVector<llvm::yaml::Hex32>> MutableOutMasks(156PSV.OutputVectorMasks);157IO.mapRequired("OutputVectorMasks", MutableOutMasks);158if (Stage == Triple::EnvironmentType::Hull)159IO.mapRequired("PatchOrPrimMasks", PSV.PatchOrPrimMasks);160}161MutableArrayRef<SmallVector<llvm::yaml::Hex32>> MutableIOMap(162PSV.InputOutputMap);163IO.mapRequired("InputOutputMap", MutableIOMap);164165if (Stage == Triple::EnvironmentType::Hull)166IO.mapRequired("InputPatchMap", PSV.InputPatchMap);167168if (Stage == Triple::EnvironmentType::Domain)169IO.mapRequired("PatchOutputMap", PSV.PatchOutputMap);170}171172void MappingTraits<DXContainerYAML::SignatureParameter>::mapping(173IO &IO, DXContainerYAML::SignatureParameter &S) {174IO.mapRequired("Stream", S.Stream);175IO.mapRequired("Name", S.Name);176IO.mapRequired("Index", S.Index);177IO.mapRequired("SystemValue", S.SystemValue);178IO.mapRequired("CompType", S.CompType);179IO.mapRequired("Register", S.Register);180IO.mapRequired("Mask", S.Mask);181IO.mapRequired("ExclusiveMask", S.ExclusiveMask);182IO.mapRequired("MinPrecision", S.MinPrecision);183}184185void MappingTraits<DXContainerYAML::Signature>::mapping(186IO &IO, DXContainerYAML::Signature &S) {187IO.mapRequired("Parameters", S.Parameters);188}189190void MappingTraits<DXContainerYAML::Part>::mapping(IO &IO,191DXContainerYAML::Part &P) {192IO.mapRequired("Name", P.Name);193IO.mapRequired("Size", P.Size);194IO.mapOptional("Program", P.Program);195IO.mapOptional("Flags", P.Flags);196IO.mapOptional("Hash", P.Hash);197IO.mapOptional("PSVInfo", P.Info);198IO.mapOptional("Signature", P.Signature);199}200201void MappingTraits<DXContainerYAML::Object>::mapping(202IO &IO, DXContainerYAML::Object &Obj) {203IO.mapTag("!dxcontainer", true);204IO.mapRequired("Header", Obj.Header);205IO.mapRequired("Parts", Obj.Parts);206}207208void MappingTraits<DXContainerYAML::ResourceBindInfo>::mapping(209IO &IO, DXContainerYAML::ResourceBindInfo &Res) {210IO.mapRequired("Type", Res.Type);211IO.mapRequired("Space", Res.Space);212IO.mapRequired("LowerBound", Res.LowerBound);213IO.mapRequired("UpperBound", Res.UpperBound);214215const uint32_t *PSVVersion = static_cast<uint32_t *>(IO.getContext());216if (*PSVVersion < 2)217return;218219IO.mapRequired("Kind", Res.Kind);220IO.mapRequired("Flags", Res.Flags);221}222223void MappingTraits<DXContainerYAML::SignatureElement>::mapping(224IO &IO, DXContainerYAML::SignatureElement &El) {225IO.mapRequired("Name", El.Name);226IO.mapRequired("Indices", El.Indices);227IO.mapRequired("StartRow", El.StartRow);228IO.mapRequired("Cols", El.Cols);229IO.mapRequired("StartCol", El.StartCol);230IO.mapRequired("Allocated", El.Allocated);231IO.mapRequired("Kind", El.Kind);232IO.mapRequired("ComponentType", El.Type);233IO.mapRequired("Interpolation", El.Mode);234IO.mapRequired("DynamicMask", El.DynamicMask);235IO.mapRequired("Stream", El.Stream);236}237238void ScalarEnumerationTraits<dxbc::PSV::SemanticKind>::enumeration(239IO &IO, dxbc::PSV::SemanticKind &Value) {240for (const auto &E : dxbc::PSV::getSemanticKinds())241IO.enumCase(Value, E.Name.str().c_str(), E.Value);242}243244void ScalarEnumerationTraits<dxbc::PSV::ComponentType>::enumeration(245IO &IO, dxbc::PSV::ComponentType &Value) {246for (const auto &E : dxbc::PSV::getComponentTypes())247IO.enumCase(Value, E.Name.str().c_str(), E.Value);248}249250void ScalarEnumerationTraits<dxbc::PSV::InterpolationMode>::enumeration(251IO &IO, dxbc::PSV::InterpolationMode &Value) {252for (const auto &E : dxbc::PSV::getInterpolationModes())253IO.enumCase(Value, E.Name.str().c_str(), E.Value);254}255256void ScalarEnumerationTraits<dxbc::D3DSystemValue>::enumeration(257IO &IO, dxbc::D3DSystemValue &Value) {258for (const auto &E : dxbc::getD3DSystemValues())259IO.enumCase(Value, E.Name.str().c_str(), E.Value);260}261262void ScalarEnumerationTraits<dxbc::SigMinPrecision>::enumeration(263IO &IO, dxbc::SigMinPrecision &Value) {264for (const auto &E : dxbc::getSigMinPrecisions())265IO.enumCase(Value, E.Name.str().c_str(), E.Value);266}267268void ScalarEnumerationTraits<dxbc::SigComponentType>::enumeration(269IO &IO, dxbc::SigComponentType &Value) {270for (const auto &E : dxbc::getSigComponentTypes())271IO.enumCase(Value, E.Name.str().c_str(), E.Value);272}273274} // namespace yaml275276void DXContainerYAML::PSVInfo::mapInfoForVersion(yaml::IO &IO) {277dxbc::PipelinePSVInfo &StageInfo = Info.StageInfo;278Triple::EnvironmentType Stage = dxbc::getShaderStage(Info.ShaderStage);279280switch (Stage) {281case Triple::EnvironmentType::Pixel:282IO.mapRequired("DepthOutput", StageInfo.PS.DepthOutput);283IO.mapRequired("SampleFrequency", StageInfo.PS.SampleFrequency);284break;285case Triple::EnvironmentType::Vertex:286IO.mapRequired("OutputPositionPresent", StageInfo.VS.OutputPositionPresent);287break;288case Triple::EnvironmentType::Geometry:289IO.mapRequired("InputPrimitive", StageInfo.GS.InputPrimitive);290IO.mapRequired("OutputTopology", StageInfo.GS.OutputTopology);291IO.mapRequired("OutputStreamMask", StageInfo.GS.OutputStreamMask);292IO.mapRequired("OutputPositionPresent", StageInfo.GS.OutputPositionPresent);293break;294case Triple::EnvironmentType::Hull:295IO.mapRequired("InputControlPointCount",296StageInfo.HS.InputControlPointCount);297IO.mapRequired("OutputControlPointCount",298StageInfo.HS.OutputControlPointCount);299IO.mapRequired("TessellatorDomain", StageInfo.HS.TessellatorDomain);300IO.mapRequired("TessellatorOutputPrimitive",301StageInfo.HS.TessellatorOutputPrimitive);302break;303case Triple::EnvironmentType::Domain:304IO.mapRequired("InputControlPointCount",305StageInfo.DS.InputControlPointCount);306IO.mapRequired("OutputPositionPresent", StageInfo.DS.OutputPositionPresent);307IO.mapRequired("TessellatorDomain", StageInfo.DS.TessellatorDomain);308break;309case Triple::EnvironmentType::Mesh:310IO.mapRequired("GroupSharedBytesUsed", StageInfo.MS.GroupSharedBytesUsed);311IO.mapRequired("GroupSharedBytesDependentOnViewID",312StageInfo.MS.GroupSharedBytesDependentOnViewID);313IO.mapRequired("PayloadSizeInBytes", StageInfo.MS.PayloadSizeInBytes);314IO.mapRequired("MaxOutputVertices", StageInfo.MS.MaxOutputVertices);315IO.mapRequired("MaxOutputPrimitives", StageInfo.MS.MaxOutputPrimitives);316break;317case Triple::EnvironmentType::Amplification:318IO.mapRequired("PayloadSizeInBytes", StageInfo.AS.PayloadSizeInBytes);319break;320default:321break;322}323324IO.mapRequired("MinimumWaveLaneCount", Info.MinimumWaveLaneCount);325IO.mapRequired("MaximumWaveLaneCount", Info.MaximumWaveLaneCount);326327if (Version == 0)328return;329330IO.mapRequired("UsesViewID", Info.UsesViewID);331332switch (Stage) {333case Triple::EnvironmentType::Geometry:334IO.mapRequired("MaxVertexCount", Info.GeomData.MaxVertexCount);335break;336case Triple::EnvironmentType::Hull:337case Triple::EnvironmentType::Domain:338IO.mapRequired("SigPatchConstOrPrimVectors",339Info.GeomData.SigPatchConstOrPrimVectors);340break;341case Triple::EnvironmentType::Mesh:342IO.mapRequired("SigPrimVectors", Info.GeomData.MeshInfo.SigPrimVectors);343IO.mapRequired("MeshOutputTopology",344Info.GeomData.MeshInfo.MeshOutputTopology);345break;346default:347break;348}349350IO.mapRequired("SigInputVectors", Info.SigInputVectors);351MutableArrayRef<uint8_t> Vec(Info.SigOutputVectors);352IO.mapRequired("SigOutputVectors", Vec);353354if (Version == 1)355return;356357IO.mapRequired("NumThreadsX", Info.NumThreadsX);358IO.mapRequired("NumThreadsY", Info.NumThreadsY);359IO.mapRequired("NumThreadsZ", Info.NumThreadsZ);360361if (Version == 2)362return;363364IO.mapRequired("EntryName", EntryName);365}366367} // namespace llvm368369370