blob: 263f7bdf37bca31d1fc437f14e89f7b2bc4b8e01 [file] [log] [blame]
//===- DXContainerYAML.cpp - DXContainer YAMLIO implementation ------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file defines classes for handling the YAML representation of
// DXContainerYAML.
//
//===----------------------------------------------------------------------===//
#include "llvm/ObjectYAML/DXContainerYAML.h"
#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/ScopeExit.h"
#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ScopedPrinter.h"
#include <cstdint>
#include <system_error>
namespace llvm {
// This assert is duplicated here to leave a breadcrumb of the places that need
// to be updated if flags grow past 64-bits.
static_assert((uint64_t)dxbc::FeatureFlags::NextUnusedBit <= 1ull << 63,
"Shader flag bits exceed enum size.");
DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) {
#define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str) \
Val = (FlagData & (uint64_t)dxbc::FeatureFlags::Val) > 0;
#include "llvm/BinaryFormat/DXContainerConstants.def"
}
template <typename T>
static llvm::Error
readDescriptorRanges(DXContainerYAML::RootParameterHeaderYaml &Header,
DXContainerYAML::RootSignatureYamlDesc &RootSigDesc,
object::DirectX::DescriptorTableView *DTV) {
llvm::Expected<object::DirectX::DescriptorTable<T>> TableOrErr =
DTV->read<T>();
if (Error E = TableOrErr.takeError())
return E;
auto Table = *TableOrErr;
DXContainerYAML::RootParameterLocationYaml Location(Header);
DXContainerYAML::DescriptorTableYaml &TableYaml =
RootSigDesc.Parameters.getOrInsertTable(Location);
RootSigDesc.Parameters.insertLocation(Location);
TableYaml.NumRanges = Table.NumRanges;
TableYaml.RangesOffset = Table.RangesOffset;
for (const auto &R : Table.Ranges) {
DXContainerYAML::DescriptorRangeYaml NewR;
NewR.OffsetInDescriptorsFromTableStart =
R.OffsetInDescriptorsFromTableStart;
NewR.NumDescriptors = R.NumDescriptors;
NewR.BaseShaderRegister = R.BaseShaderRegister;
NewR.RegisterSpace = R.RegisterSpace;
NewR.RangeType = R.RangeType;
if constexpr (std::is_same_v<T, dxbc::RTS0::v2::DescriptorRange>) {
// Set all flag fields for v2
#define DESCRIPTOR_RANGE_FLAG(Num, Enum, Flag) \
NewR.Enum = \
(R.Flags & llvm::to_underlying(dxbc::DescriptorRangeFlags::Enum)) != 0;
#include "llvm/BinaryFormat/DXContainerConstants.def"
}
TableYaml.Ranges.push_back(NewR);
}
return Error::success();
}
llvm::Expected<DXContainerYAML::RootSignatureYamlDesc>
DXContainerYAML::RootSignatureYamlDesc::create(
const object::DirectX::RootSignature &Data) {
RootSignatureYamlDesc RootSigDesc;
uint32_t Version = Data.getVersion();
RootSigDesc.Version = Version;
RootSigDesc.NumStaticSamplers = Data.getNumStaticSamplers();
RootSigDesc.StaticSamplersOffset = Data.getStaticSamplersOffset();
RootSigDesc.NumRootParameters = Data.getNumRootParameters();
RootSigDesc.RootParametersOffset = Data.getRootParametersOffset();
uint32_t Flags = Data.getFlags();
for (const dxbc::RTS0::v1::RootParameterHeader &PH : Data.param_headers()) {
if (!dxbc::isValidParameterType(PH.ParameterType))
return createStringError(std::errc::invalid_argument,
"Invalid value for parameter type");
RootParameterHeaderYaml Header(PH.ParameterType);
Header.Offset = PH.ParameterOffset;
Header.Type = PH.ParameterType;
if (!dxbc::isValidShaderVisibility(PH.ShaderVisibility))
return createStringError(std::errc::invalid_argument,
"Invalid value for shader visibility");
Header.Visibility = PH.ShaderVisibility;
llvm::Expected<object::DirectX::RootParameterView> ParamViewOrErr =
Data.getParameter(PH);
if (Error E = ParamViewOrErr.takeError())
return std::move(E);
object::DirectX::RootParameterView ParamView = ParamViewOrErr.get();
if (auto *RCV = dyn_cast<object::DirectX::RootConstantView>(&ParamView)) {
llvm::Expected<dxbc::RTS0::v1::RootConstants> ConstantsOrErr =
RCV->read();
if (Error E = ConstantsOrErr.takeError())
return std::move(E);
auto Constants = *ConstantsOrErr;
RootParameterLocationYaml Location(Header);
RootConstantsYaml &ConstantYaml =
RootSigDesc.Parameters.getOrInsertConstants(Location);
RootSigDesc.Parameters.insertLocation(Location);
ConstantYaml.Num32BitValues = Constants.Num32BitValues;
ConstantYaml.ShaderRegister = Constants.ShaderRegister;
ConstantYaml.RegisterSpace = Constants.RegisterSpace;
} else if (auto *RDV =
dyn_cast<object::DirectX::RootDescriptorView>(&ParamView)) {
llvm::Expected<dxbc::RTS0::v2::RootDescriptor> DescriptorOrErr =
RDV->read(Version);
if (Error E = DescriptorOrErr.takeError())
return std::move(E);
auto Descriptor = *DescriptorOrErr;
RootParameterLocationYaml Location(Header);
RootDescriptorYaml &YamlDescriptor =
RootSigDesc.Parameters.getOrInsertDescriptor(Location);
RootSigDesc.Parameters.insertLocation(Location);
YamlDescriptor.ShaderRegister = Descriptor.ShaderRegister;
YamlDescriptor.RegisterSpace = Descriptor.RegisterSpace;
if (Version > 1) {
#define ROOT_DESCRIPTOR_FLAG(Num, Enum, Flag) \
YamlDescriptor.Enum = \
(Descriptor.Flags & \
llvm::to_underlying(dxbc::RootDescriptorFlags::Enum)) > 0;
#include "llvm/BinaryFormat/DXContainerConstants.def"
}
} else if (auto *DTV =
dyn_cast<object::DirectX::DescriptorTableView>(&ParamView)) {
if (Version == 1) {
if (Error E = readDescriptorRanges<dxbc::RTS0::v1::DescriptorRange>(
Header, RootSigDesc, DTV))
return std::move(E);
} else if (Version == 2) {
if (Error E = readDescriptorRanges<dxbc::RTS0::v2::DescriptorRange>(
Header, RootSigDesc, DTV))
return std::move(E);
} else
llvm_unreachable("Unknown version for DescriptorRanges");
}
}
for (const auto &S : Data.samplers()) {
StaticSamplerYamlDesc NewS;
NewS.Filter = S.Filter;
NewS.AddressU = S.AddressU;
NewS.AddressV = S.AddressV;
NewS.AddressW = S.AddressW;
NewS.MipLODBias = S.MipLODBias;
NewS.MaxAnisotropy = S.MaxAnisotropy;
NewS.ComparisonFunc = S.ComparisonFunc;
NewS.BorderColor = S.BorderColor;
NewS.MinLOD = S.MinLOD;
NewS.MaxLOD = S.MaxLOD;
NewS.ShaderRegister = S.ShaderRegister;
NewS.RegisterSpace = S.RegisterSpace;
NewS.ShaderVisibility = S.ShaderVisibility;
RootSigDesc.StaticSamplers.push_back(NewS);
}
#define ROOT_SIGNATURE_FLAG(Num, Val) \
RootSigDesc.Val = (Flags & llvm::to_underlying(dxbc::RootFlags::Val)) > 0;
#include "llvm/BinaryFormat/DXContainerConstants.def"
return RootSigDesc;
}
uint32_t DXContainerYAML::RootDescriptorYaml::getEncodedFlags() const {
uint64_t Flags = 0;
#define ROOT_DESCRIPTOR_FLAG(Num, Enum, Flag) \
if (Enum) \
Flags |= (uint32_t)dxbc::RootDescriptorFlags::Enum;
#include "llvm/BinaryFormat/DXContainerConstants.def"
return Flags;
}
uint32_t DXContainerYAML::RootSignatureYamlDesc::getEncodedFlags() {
uint64_t Flag = 0;
#define ROOT_SIGNATURE_FLAG(Num, Val) \
if (Val) \
Flag |= (uint32_t)dxbc::RootFlags::Val;
#include "llvm/BinaryFormat/DXContainerConstants.def"
return Flag;
}
uint32_t DXContainerYAML::DescriptorRangeYaml::getEncodedFlags() const {
uint64_t Flags = 0;
#define DESCRIPTOR_RANGE_FLAG(Num, Enum, Flag) \
if (Enum) \
Flags |= (uint32_t)dxbc::DescriptorRangeFlags::Enum;
#include "llvm/BinaryFormat/DXContainerConstants.def"
return Flags;
}
uint64_t DXContainerYAML::ShaderFeatureFlags::getEncodedFlags() {
uint64_t Flag = 0;
#define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str) \
if (Val) \
Flag |= (uint64_t)dxbc::FeatureFlags::Val;
#include "llvm/BinaryFormat/DXContainerConstants.def"
return Flag;
}
DXContainerYAML::ShaderHash::ShaderHash(const dxbc::ShaderHash &Data)
: IncludesSource((Data.Flags & static_cast<uint32_t>(
dxbc::HashFlags::IncludesSource)) != 0),
Digest(16, 0) {
memcpy(Digest.data(), &Data.Digest[0], 16);
}
DXContainerYAML::PSVInfo::PSVInfo() : Version(0) {
memset(&Info, 0, sizeof(Info));
}
DXContainerYAML::PSVInfo::PSVInfo(const dxbc::PSV::v0::RuntimeInfo *P,
uint16_t Stage)
: Version(0) {
memset(&Info, 0, sizeof(Info));
memcpy(&Info, P, sizeof(dxbc::PSV::v0::RuntimeInfo));
assert(Stage < std::numeric_limits<uint8_t>::max() &&
"Stage should be a very small number");
// We need to bring the stage in separately since it isn't part of the v1 data
// structure.
Info.ShaderStage = static_cast<uint8_t>(Stage);
}
DXContainerYAML::PSVInfo::PSVInfo(const dxbc::PSV::v1::RuntimeInfo *P)
: Version(1) {
memset(&Info, 0, sizeof(Info));
memcpy(&Info, P, sizeof(dxbc::PSV::v1::RuntimeInfo));
}
DXContainerYAML::PSVInfo::PSVInfo(const dxbc::PSV::v2::RuntimeInfo *P)
: Version(2) {
memset(&Info, 0, sizeof(Info));
memcpy(&Info, P, sizeof(dxbc::PSV::v2::RuntimeInfo));
}
DXContainerYAML::PSVInfo::PSVInfo(const dxbc::PSV::v3::RuntimeInfo *P,
StringRef StringTable)
: Version(3),
EntryName(StringTable.substr(P->EntryNameOffset,
StringTable.find('\0', P->EntryNameOffset) -
P->EntryNameOffset)) {
memset(&Info, 0, sizeof(Info));
memcpy(&Info, P, sizeof(dxbc::PSV::v3::RuntimeInfo));
}
namespace yaml {
void MappingTraits<DXContainerYAML::VersionTuple>::mapping(
IO &IO, DXContainerYAML::VersionTuple &Version) {
IO.mapRequired("Major", Version.Major);
IO.mapRequired("Minor", Version.Minor);
}
void MappingTraits<DXContainerYAML::FileHeader>::mapping(
IO &IO, DXContainerYAML::FileHeader &Header) {
IO.mapRequired("Hash", Header.Hash);
IO.mapRequired("Version", Header.Version);
IO.mapOptional("FileSize", Header.FileSize);
IO.mapRequired("PartCount", Header.PartCount);
IO.mapOptional("PartOffsets", Header.PartOffsets);
}
void MappingTraits<DXContainerYAML::DXILProgram>::mapping(
IO &IO, DXContainerYAML::DXILProgram &Program) {
IO.mapRequired("MajorVersion", Program.MajorVersion);
IO.mapRequired("MinorVersion", Program.MinorVersion);
IO.mapRequired("ShaderKind", Program.ShaderKind);
IO.mapOptional("Size", Program.Size);
IO.mapRequired("DXILMajorVersion", Program.DXILMajorVersion);
IO.mapRequired("DXILMinorVersion", Program.DXILMinorVersion);
IO.mapOptional("DXILSize", Program.DXILSize);
IO.mapOptional("DXIL", Program.DXIL);
}
void MappingTraits<DXContainerYAML::ShaderFeatureFlags>::mapping(
IO &IO, DXContainerYAML::ShaderFeatureFlags &Flags) {
#define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str) \
IO.mapRequired(#Val, Flags.Val);
#include "llvm/BinaryFormat/DXContainerConstants.def"
}
void MappingTraits<DXContainerYAML::ShaderHash>::mapping(
IO &IO, DXContainerYAML::ShaderHash &Hash) {
IO.mapRequired("IncludesSource", Hash.IncludesSource);
IO.mapRequired("Digest", Hash.Digest);
}
void MappingTraits<DXContainerYAML::PSVInfo>::mapping(
IO &IO, DXContainerYAML::PSVInfo &PSV) {
IO.mapRequired("Version", PSV.Version);
// Store the PSV version in the YAML context.
void *OldContext = IO.getContext();
uint32_t Version = PSV.Version;
IO.setContext(&Version);
// Restore the YAML context on function exit.
auto RestoreContext = make_scope_exit([&]() { IO.setContext(OldContext); });
// Shader stage is only included in binaries for v1 and later, but we always
// include it since it simplifies parsing and file construction.
IO.mapRequired("ShaderStage", PSV.Info.ShaderStage);
PSV.mapInfoForVersion(IO);
IO.mapRequired("ResourceStride", PSV.ResourceStride);
IO.mapRequired("Resources", PSV.Resources);
if (PSV.Version == 0)
return;
IO.mapRequired("SigInputElements", PSV.SigInputElements);
IO.mapRequired("SigOutputElements", PSV.SigOutputElements);
IO.mapRequired("SigPatchOrPrimElements", PSV.SigPatchOrPrimElements);
Triple::EnvironmentType Stage = dxbc::getShaderStage(PSV.Info.ShaderStage);
if (PSV.Info.UsesViewID) {
MutableArrayRef<SmallVector<llvm::yaml::Hex32>> MutableOutMasks(
PSV.OutputVectorMasks);
IO.mapRequired("OutputVectorMasks", MutableOutMasks);
if (Stage == Triple::EnvironmentType::Hull)
IO.mapRequired("PatchOrPrimMasks", PSV.PatchOrPrimMasks);
}
MutableArrayRef<SmallVector<llvm::yaml::Hex32>> MutableIOMap(
PSV.InputOutputMap);
IO.mapRequired("InputOutputMap", MutableIOMap);
if (Stage == Triple::EnvironmentType::Hull)
IO.mapRequired("InputPatchMap", PSV.InputPatchMap);
if (Stage == Triple::EnvironmentType::Domain)
IO.mapRequired("PatchOutputMap", PSV.PatchOutputMap);
}
void MappingTraits<DXContainerYAML::SignatureParameter>::mapping(
IO &IO, DXContainerYAML::SignatureParameter &S) {
IO.mapRequired("Stream", S.Stream);
IO.mapRequired("Name", S.Name);
IO.mapRequired("Index", S.Index);
IO.mapRequired("SystemValue", S.SystemValue);
IO.mapRequired("CompType", S.CompType);
IO.mapRequired("Register", S.Register);
IO.mapRequired("Mask", S.Mask);
IO.mapRequired("ExclusiveMask", S.ExclusiveMask);
IO.mapRequired("MinPrecision", S.MinPrecision);
}
void MappingTraits<DXContainerYAML::Signature>::mapping(
IO &IO, DXContainerYAML::Signature &S) {
IO.mapRequired("Parameters", S.Parameters);
}
void MappingTraits<DXContainerYAML::RootSignatureYamlDesc>::mapping(
IO &IO, DXContainerYAML::RootSignatureYamlDesc &S) {
IO.mapRequired("Version", S.Version);
IO.mapRequired("NumRootParameters", S.NumRootParameters);
IO.mapRequired("RootParametersOffset", S.RootParametersOffset);
IO.mapRequired("NumStaticSamplers", S.NumStaticSamplers);
IO.mapRequired("StaticSamplersOffset", S.StaticSamplersOffset);
IO.mapRequired("Parameters", S.Parameters.Locations, S);
IO.mapOptional("Samplers", S.StaticSamplers);
#define ROOT_SIGNATURE_FLAG(Num, Val) IO.mapOptional(#Val, S.Val, false);
#include "llvm/BinaryFormat/DXContainerConstants.def"
}
void MappingTraits<llvm::DXContainerYAML::DescriptorRangeYaml>::mapping(
IO &IO, llvm::DXContainerYAML::DescriptorRangeYaml &R) {
IO.mapRequired("RangeType", R.RangeType);
// handling the edge case where NumDescriptors might be -1
if (IO.outputting()) {
if (R.NumDescriptors == UINT_MAX) {
int32_t NegOne = -1;
IO.mapRequired("NumDescriptors", NegOne);
} else
IO.mapRequired("NumDescriptors", R.NumDescriptors);
} else {
int32_t TmpNumDesc = 0;
IO.mapRequired("NumDescriptors", TmpNumDesc);
R.NumDescriptors = static_cast<uint32_t>(TmpNumDesc);
}
IO.mapRequired("BaseShaderRegister", R.BaseShaderRegister);
IO.mapRequired("RegisterSpace", R.RegisterSpace);
IO.mapRequired("OffsetInDescriptorsFromTableStart",
R.OffsetInDescriptorsFromTableStart);
#define DESCRIPTOR_RANGE_FLAG(Num, Enum, Flag) \
IO.mapOptional(#Flag, R.Enum, false);
#include "llvm/BinaryFormat/DXContainerConstants.def"
}
void MappingTraits<llvm::DXContainerYAML::DescriptorTableYaml>::mapping(
IO &IO, llvm::DXContainerYAML::DescriptorTableYaml &T) {
IO.mapRequired("NumRanges", T.NumRanges);
IO.mapOptional("RangesOffset", T.RangesOffset);
IO.mapRequired("Ranges", T.Ranges);
}
void MappingContextTraits<DXContainerYAML::RootParameterLocationYaml,
DXContainerYAML::RootSignatureYamlDesc>::
mapping(IO &IO, DXContainerYAML::RootParameterLocationYaml &L,
DXContainerYAML::RootSignatureYamlDesc &S) {
IO.mapRequired("ParameterType", L.Header.Type);
IO.mapRequired("ShaderVisibility", L.Header.Visibility);
switch (L.Header.Type) {
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): {
DXContainerYAML::RootConstantsYaml &Constants =
S.Parameters.getOrInsertConstants(L);
IO.mapRequired("Constants", Constants);
break;
}
case llvm::to_underlying(dxbc::RootParameterType::CBV):
case llvm::to_underlying(dxbc::RootParameterType::SRV):
case llvm::to_underlying(dxbc::RootParameterType::UAV): {
DXContainerYAML::RootDescriptorYaml &Descriptor =
S.Parameters.getOrInsertDescriptor(L);
IO.mapRequired("Descriptor", Descriptor);
break;
}
case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): {
DXContainerYAML::DescriptorTableYaml &Table =
S.Parameters.getOrInsertTable(L);
IO.mapRequired("Table", Table);
break;
}
}
}
void MappingTraits<llvm::DXContainerYAML::RootConstantsYaml>::mapping(
IO &IO, llvm::DXContainerYAML::RootConstantsYaml &C) {
IO.mapRequired("Num32BitValues", C.Num32BitValues);
IO.mapRequired("RegisterSpace", C.RegisterSpace);
IO.mapRequired("ShaderRegister", C.ShaderRegister);
}
void MappingTraits<llvm::DXContainerYAML::RootDescriptorYaml>::mapping(
IO &IO, llvm::DXContainerYAML::RootDescriptorYaml &D) {
IO.mapRequired("RegisterSpace", D.RegisterSpace);
IO.mapRequired("ShaderRegister", D.ShaderRegister);
#define ROOT_DESCRIPTOR_FLAG(Num, Enum, Flag) \
IO.mapOptional(#Flag, D.Enum, false);
#include "llvm/BinaryFormat/DXContainerConstants.def"
}
void MappingTraits<llvm::DXContainerYAML::StaticSamplerYamlDesc>::mapping(
IO &IO, llvm::DXContainerYAML::StaticSamplerYamlDesc &S) {
IO.mapOptional("Filter", S.Filter);
IO.mapOptional("AddressU", S.AddressU);
IO.mapOptional("AddressV", S.AddressV);
IO.mapOptional("AddressW", S.AddressW);
IO.mapOptional("MipLODBias", S.MipLODBias);
IO.mapOptional("MaxAnisotropy", S.MaxAnisotropy);
IO.mapOptional("ComparisonFunc", S.ComparisonFunc);
IO.mapOptional("BorderColor", S.BorderColor);
IO.mapOptional("MinLOD", S.MinLOD);
IO.mapOptional("MaxLOD", S.MaxLOD);
IO.mapRequired("ShaderRegister", S.ShaderRegister);
IO.mapRequired("RegisterSpace", S.RegisterSpace);
IO.mapRequired("ShaderVisibility", S.ShaderVisibility);
}
void MappingTraits<DXContainerYAML::Part>::mapping(IO &IO,
DXContainerYAML::Part &P) {
IO.mapRequired("Name", P.Name);
IO.mapRequired("Size", P.Size);
IO.mapOptional("Program", P.Program);
IO.mapOptional("Flags", P.Flags);
IO.mapOptional("Hash", P.Hash);
IO.mapOptional("PSVInfo", P.Info);
IO.mapOptional("Signature", P.Signature);
IO.mapOptional("RootSignature", P.RootSignature);
}
void MappingTraits<DXContainerYAML::Object>::mapping(
IO &IO, DXContainerYAML::Object &Obj) {
IO.mapTag("!dxcontainer", true);
IO.mapRequired("Header", Obj.Header);
IO.mapRequired("Parts", Obj.Parts);
}
void MappingTraits<DXContainerYAML::ResourceFlags>::mapping(
IO &IO, DXContainerYAML::ResourceFlags &Flags) {
#define RESOURCE_FLAG(FlagIndex, Enum) IO.mapRequired(#Enum, Flags.Bits.Enum);
#include "llvm/BinaryFormat/DXContainerConstants.def"
}
void MappingTraits<DXContainerYAML::ResourceBindInfo>::mapping(
IO &IO, DXContainerYAML::ResourceBindInfo &Res) {
IO.mapRequired("Type", Res.Type);
IO.mapRequired("Space", Res.Space);
IO.mapRequired("LowerBound", Res.LowerBound);
IO.mapRequired("UpperBound", Res.UpperBound);
const uint32_t *PSVVersion = static_cast<uint32_t *>(IO.getContext());
if (*PSVVersion < 2)
return;
IO.mapRequired("Kind", Res.Kind);
IO.mapRequired("Flags", Res.Flags);
}
void MappingTraits<DXContainerYAML::SignatureElement>::mapping(
IO &IO, DXContainerYAML::SignatureElement &El) {
IO.mapRequired("Name", El.Name);
IO.mapRequired("Indices", El.Indices);
IO.mapRequired("StartRow", El.StartRow);
IO.mapRequired("Cols", El.Cols);
IO.mapRequired("StartCol", El.StartCol);
IO.mapRequired("Allocated", El.Allocated);
IO.mapRequired("Kind", El.Kind);
IO.mapRequired("ComponentType", El.Type);
IO.mapRequired("Interpolation", El.Mode);
IO.mapRequired("DynamicMask", El.DynamicMask);
IO.mapRequired("Stream", El.Stream);
}
void ScalarEnumerationTraits<dxbc::PSV::SemanticKind>::enumeration(
IO &IO, dxbc::PSV::SemanticKind &Value) {
for (const auto &E : dxbc::PSV::getSemanticKinds())
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
}
void ScalarEnumerationTraits<dxbc::PSV::ComponentType>::enumeration(
IO &IO, dxbc::PSV::ComponentType &Value) {
for (const auto &E : dxbc::PSV::getComponentTypes())
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
}
void ScalarEnumerationTraits<dxbc::PSV::InterpolationMode>::enumeration(
IO &IO, dxbc::PSV::InterpolationMode &Value) {
for (const auto &E : dxbc::PSV::getInterpolationModes())
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
}
void ScalarEnumerationTraits<dxbc::PSV::ResourceType>::enumeration(
IO &IO, dxbc::PSV::ResourceType &Value) {
for (const auto &E : dxbc::PSV::getResourceTypes())
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
}
void ScalarEnumerationTraits<dxbc::PSV::ResourceKind>::enumeration(
IO &IO, dxbc::PSV::ResourceKind &Value) {
for (const auto &E : dxbc::PSV::getResourceKinds())
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
}
void ScalarEnumerationTraits<dxbc::D3DSystemValue>::enumeration(
IO &IO, dxbc::D3DSystemValue &Value) {
for (const auto &E : dxbc::getD3DSystemValues())
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
}
void ScalarEnumerationTraits<dxbc::SigMinPrecision>::enumeration(
IO &IO, dxbc::SigMinPrecision &Value) {
for (const auto &E : dxbc::getSigMinPrecisions())
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
}
void ScalarEnumerationTraits<dxbc::SigComponentType>::enumeration(
IO &IO, dxbc::SigComponentType &Value) {
for (const auto &E : dxbc::getSigComponentTypes())
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
}
} // namespace yaml
void DXContainerYAML::PSVInfo::mapInfoForVersion(yaml::IO &IO) {
dxbc::PipelinePSVInfo &StageInfo = Info.StageInfo;
Triple::EnvironmentType Stage = dxbc::getShaderStage(Info.ShaderStage);
switch (Stage) {
case Triple::EnvironmentType::Pixel:
IO.mapRequired("DepthOutput", StageInfo.PS.DepthOutput);
IO.mapRequired("SampleFrequency", StageInfo.PS.SampleFrequency);
break;
case Triple::EnvironmentType::Vertex:
IO.mapRequired("OutputPositionPresent", StageInfo.VS.OutputPositionPresent);
break;
case Triple::EnvironmentType::Geometry:
IO.mapRequired("InputPrimitive", StageInfo.GS.InputPrimitive);
IO.mapRequired("OutputTopology", StageInfo.GS.OutputTopology);
IO.mapRequired("OutputStreamMask", StageInfo.GS.OutputStreamMask);
IO.mapRequired("OutputPositionPresent", StageInfo.GS.OutputPositionPresent);
break;
case Triple::EnvironmentType::Hull:
IO.mapRequired("InputControlPointCount",
StageInfo.HS.InputControlPointCount);
IO.mapRequired("OutputControlPointCount",
StageInfo.HS.OutputControlPointCount);
IO.mapRequired("TessellatorDomain", StageInfo.HS.TessellatorDomain);
IO.mapRequired("TessellatorOutputPrimitive",
StageInfo.HS.TessellatorOutputPrimitive);
break;
case Triple::EnvironmentType::Domain:
IO.mapRequired("InputControlPointCount",
StageInfo.DS.InputControlPointCount);
IO.mapRequired("OutputPositionPresent", StageInfo.DS.OutputPositionPresent);
IO.mapRequired("TessellatorDomain", StageInfo.DS.TessellatorDomain);
break;
case Triple::EnvironmentType::Mesh:
IO.mapRequired("GroupSharedBytesUsed", StageInfo.MS.GroupSharedBytesUsed);
IO.mapRequired("GroupSharedBytesDependentOnViewID",
StageInfo.MS.GroupSharedBytesDependentOnViewID);
IO.mapRequired("PayloadSizeInBytes", StageInfo.MS.PayloadSizeInBytes);
IO.mapRequired("MaxOutputVertices", StageInfo.MS.MaxOutputVertices);
IO.mapRequired("MaxOutputPrimitives", StageInfo.MS.MaxOutputPrimitives);
break;
case Triple::EnvironmentType::Amplification:
IO.mapRequired("PayloadSizeInBytes", StageInfo.AS.PayloadSizeInBytes);
break;
default:
break;
}
IO.mapRequired("MinimumWaveLaneCount", Info.MinimumWaveLaneCount);
IO.mapRequired("MaximumWaveLaneCount", Info.MaximumWaveLaneCount);
if (Version == 0)
return;
IO.mapRequired("UsesViewID", Info.UsesViewID);
switch (Stage) {
case Triple::EnvironmentType::Geometry:
IO.mapRequired("MaxVertexCount", Info.GeomData.MaxVertexCount);
break;
case Triple::EnvironmentType::Hull:
case Triple::EnvironmentType::Domain:
IO.mapRequired("SigPatchConstOrPrimVectors",
Info.GeomData.SigPatchConstOrPrimVectors);
break;
case Triple::EnvironmentType::Mesh:
IO.mapRequired("SigPrimVectors", Info.GeomData.MeshInfo.SigPrimVectors);
IO.mapRequired("MeshOutputTopology",
Info.GeomData.MeshInfo.MeshOutputTopology);
break;
default:
break;
}
IO.mapRequired("SigInputVectors", Info.SigInputVectors);
MutableArrayRef<uint8_t> Vec(Info.SigOutputVectors);
IO.mapRequired("SigOutputVectors", Vec);
if (Version == 1)
return;
IO.mapRequired("NumThreadsX", Info.NumThreadsX);
IO.mapRequired("NumThreadsY", Info.NumThreadsY);
IO.mapRequired("NumThreadsZ", Info.NumThreadsZ);
if (Version == 2)
return;
IO.mapRequired("EntryName", EntryName);
}
} // namespace llvm