21#include <system_error>
27static_assert((uint64_t)dxbc::FeatureFlags::NextUnusedBit <= 1ull << 63,
28 "Shader flag bits exceed enum size.");
31#define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str) \
32 Val = (FlagData & (uint64_t)dxbc::FeatureFlags::Val) > 0;
33#include "llvm/BinaryFormat/DXContainerConstants.def"
46 auto Table = *TableOrErr;
56 for (
const auto &R : Table.Ranges) {
59 R.OffsetInDescriptorsFromTableStart;
65 "Invalid value for descriptor range type");
67 if constexpr (std::is_same_v<T, dxbc::RTS0::v2::DescriptorRange>) {
69#define DESCRIPTOR_RANGE_FLAG(Num, Enum, Flag) \
71 (R.Flags & llvm::to_underlying(dxbc::DescriptorRangeFlags::Enum)) != 0;
72#include "llvm/BinaryFormat/DXContainerConstants.def"
74 TableYaml.
Ranges.push_back(NewR);
98 "Invalid value for parameter type");
101 Header.Offset = PH.ParameterOffset;
105 "Invalid value for shader visibility");
110 Data.getParameter(PH);
121 auto Constants = *ConstantsOrErr;
130 }
else if (
auto *RDV =
136 auto Descriptor = *DescriptorOrErr;
145#define ROOT_DESCRIPTOR_FLAG(Num, Enum, Flag) \
146 YamlDescriptor.Enum = \
147 (Descriptor.Flags & \
148 llvm::to_underlying(dxbc::RootDescriptorFlags::Enum)) > 0;
149#include "llvm/BinaryFormat/DXContainerConstants.def"
151 }
else if (
auto *DTV =
155 Header, RootSigDesc, DTV))
159 Header, RootSigDesc, DTV))
166 for (
const auto &S :
Data.samplers()) {
169 "Invalid value for static sampler filter");
173 "Invalid value for static sampler AddressU");
177 "Invalid value for static sampler AddressV");
181 "Invalid value for static sampler AddressW");
185 std::errc::invalid_argument,
186 "Invalid value for static sampler ComparisonFunc");
190 "Invalid value for static sampler BorderColor");
194 std::errc::invalid_argument,
195 "Invalid value for static sampler ShaderVisibility");
213#define STATIC_SAMPLER_FLAG(Num, Enum, Flag) \
214 NewS.Enum = (S.Flags & llvm::to_underlying(dxbc::StaticSamplerFlags::Enum));
215#include "llvm/BinaryFormat/DXContainerConstants.def"
220#define ROOT_SIGNATURE_FLAG(Num, Val) \
221 RootSigDesc.Val = (Flags & llvm::to_underlying(dxbc::RootFlags::Val)) > 0;
222#include "llvm/BinaryFormat/DXContainerConstants.def"
228#define ROOT_DESCRIPTOR_FLAG(Num, Enum, Flag) \
230 Flags |= (uint32_t)dxbc::RootDescriptorFlags::Enum;
231#include "llvm/BinaryFormat/DXContainerConstants.def"
237#define ROOT_SIGNATURE_FLAG(Num, Val) \
239 Flag |= (uint32_t)dxbc::RootFlags::Val;
240#include "llvm/BinaryFormat/DXContainerConstants.def"
246#define DESCRIPTOR_RANGE_FLAG(Num, Enum, Flag) \
248 Flags |= (uint32_t)dxbc::DescriptorRangeFlags::Enum;
249#include "llvm/BinaryFormat/DXContainerConstants.def"
255#define STATIC_SAMPLER_FLAG(Num, Enum, Flag) \
257 Flags |= (uint32_t)dxbc::StaticSamplerFlags::Enum;
258#include "llvm/BinaryFormat/DXContainerConstants.def"
264#define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str) \
266 Flag |= (uint64_t)dxbc::FeatureFlags::Val;
267#include "llvm/BinaryFormat/DXContainerConstants.def"
288 assert(Stage < std::numeric_limits<uint8_t>::max() &&
289 "Stage should be a very small number");
312 P->EntryNameOffset)) {
319void MappingTraits<DXContainerYAML::VersionTuple>::mapping(
321 IO.mapRequired(
"Major",
Version.Major);
322 IO.mapRequired(
"Minor",
Version.Minor);
325void MappingTraits<DXContainerYAML::FileHeader>::mapping(
327 IO.mapRequired(
"Hash", Header.Hash);
328 IO.mapRequired(
"Version", Header.Version);
329 IO.mapOptional(
"FileSize", Header.FileSize);
330 IO.mapRequired(
"PartCount", Header.PartCount);
331 IO.mapOptional(
"PartOffsets", Header.PartOffsets);
334void MappingTraits<DXContainerYAML::DXILProgram>::mapping(
335 IO &IO, DXContainerYAML::DXILProgram &Program) {
336 IO.mapRequired(
"MajorVersion", Program.MajorVersion);
337 IO.mapRequired(
"MinorVersion", Program.MinorVersion);
338 IO.mapRequired(
"ShaderKind", Program.ShaderKind);
339 IO.mapOptional(
"Size", Program.Size);
340 IO.mapRequired(
"DXILMajorVersion", Program.DXILMajorVersion);
341 IO.mapRequired(
"DXILMinorVersion", Program.DXILMinorVersion);
342 IO.mapOptional(
"DXILSize", Program.DXILSize);
343 IO.mapOptional(
"DXIL", Program.DXIL);
346void MappingTraits<DXContainerYAML::ShaderFeatureFlags>::mapping(
347 IO &IO, DXContainerYAML::ShaderFeatureFlags &Flags) {
348#define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str) \
349 IO.mapRequired(#Val, Flags.Val);
350#include "llvm/BinaryFormat/DXContainerConstants.def"
353void MappingTraits<DXContainerYAML::ShaderHash>::mapping(
354 IO &IO, DXContainerYAML::ShaderHash &Hash) {
355 IO.mapRequired(
"IncludesSource", Hash.IncludesSource);
356 IO.mapRequired(
"Digest", Hash.Digest);
359void MappingTraits<DXContainerYAML::PSVInfo>::mapping(
360 IO &IO, DXContainerYAML::PSVInfo &PSV) {
361 IO.mapRequired(
"Version", PSV.Version);
364 void *OldContext = IO.getContext();
365 uint32_t
Version = PSV.Version;
366 IO.setContext(&Version);
373 IO.mapRequired(
"ShaderStage", PSV.Info.ShaderStage);
374 PSV.mapInfoForVersion(IO);
376 IO.mapRequired(
"ResourceStride", PSV.ResourceStride);
377 if (PSV.Version > 0) {
378 IO.mapOptional(
"RuntimeInfoSize", PSV.RuntimeInfoSize);
379 IO.mapOptional(
"StringTable", PSV.StringTable);
381 IO.mapRequired(
"Resources", PSV.Resources);
382 if (PSV.Version == 0)
384 IO.mapRequired(
"SigInputElements", PSV.SigInputElements);
385 IO.mapRequired(
"SigOutputElements", PSV.SigOutputElements);
386 IO.mapRequired(
"SigPatchOrPrimElements", PSV.SigPatchOrPrimElements);
388 Triple::EnvironmentType Stage = dxbc::getShaderStage(PSV.Info.ShaderStage);
389 if (PSV.Info.UsesViewID) {
390 MutableArrayRef<SmallVector<llvm::yaml::Hex32>> MutableOutMasks(
391 PSV.OutputVectorMasks);
392 IO.mapRequired(
"OutputVectorMasks", MutableOutMasks);
393 if (Stage == Triple::EnvironmentType::Hull)
394 IO.mapRequired(
"PatchOrPrimMasks", PSV.PatchOrPrimMasks);
396 MutableArrayRef<SmallVector<llvm::yaml::Hex32>> MutableIOMap(
398 IO.mapRequired(
"InputOutputMap", MutableIOMap);
400 if (Stage == Triple::EnvironmentType::Hull)
401 IO.mapRequired(
"InputPatchMap", PSV.InputPatchMap);
403 if (Stage == Triple::EnvironmentType::Domain)
404 IO.mapRequired(
"PatchOutputMap", PSV.PatchOutputMap);
407void MappingTraits<DXContainerYAML::SignatureParameter>::mapping(
408 IO &IO, DXContainerYAML::SignatureParameter &S) {
409 IO.mapRequired(
"Stream", S.Stream);
410 IO.mapRequired(
"Name", S.Name);
411 IO.mapRequired(
"Index", S.Index);
412 IO.mapRequired(
"SystemValue", S.SystemValue);
413 IO.mapRequired(
"CompType", S.CompType);
414 IO.mapRequired(
"Register", S.Register);
415 IO.mapRequired(
"Mask", S.Mask);
416 IO.mapRequired(
"ExclusiveMask", S.ExclusiveMask);
417 IO.mapRequired(
"MinPrecision", S.MinPrecision);
420void MappingTraits<DXContainerYAML::Signature>::mapping(
421 IO &IO, DXContainerYAML::Signature &S) {
422 IO.mapRequired(
"Parameters", S.Parameters);
425void MappingTraits<DXContainerYAML::RootSignatureYamlDesc>::mapping(
426 IO &IO, DXContainerYAML::RootSignatureYamlDesc &S) {
427 IO.mapRequired(
"Version", S.Version);
428 IO.mapRequired(
"NumRootParameters", S.NumRootParameters);
429 IO.mapOptional(
"RootParametersOffset", S.RootParametersOffset, std::nullopt);
430 IO.mapRequired(
"NumStaticSamplers", S.NumStaticSamplers);
431 IO.mapOptional(
"StaticSamplersOffset", S.StaticSamplersOffset, std::nullopt);
432 IO.mapRequired(
"Parameters", S.Parameters.Locations, S);
433 IO.mapOptional(
"Samplers", S.StaticSamplers);
434#define ROOT_SIGNATURE_FLAG(Num, Val) IO.mapOptional(#Val, S.Val, false);
435#include "llvm/BinaryFormat/DXContainerConstants.def"
438void MappingTraits<llvm::DXContainerYAML::DescriptorRangeYaml>::mapping(
439 IO &IO, llvm::DXContainerYAML::DescriptorRangeYaml &R) {
440 IO.mapRequired(
"RangeType",
R.RangeType);
442 if (IO.outputting()) {
443 if (
R.NumDescriptors == UINT_MAX) {
445 IO.mapRequired(
"NumDescriptors", NegOne);
447 IO.mapRequired(
"NumDescriptors",
R.NumDescriptors);
449 int32_t TmpNumDesc = 0;
450 IO.mapRequired(
"NumDescriptors", TmpNumDesc);
451 R.NumDescriptors =
static_cast<uint32_t
>(TmpNumDesc);
454 IO.mapRequired(
"BaseShaderRegister",
R.BaseShaderRegister);
455 IO.mapRequired(
"RegisterSpace",
R.RegisterSpace);
456 IO.mapRequired(
"OffsetInDescriptorsFromTableStart",
457 R.OffsetInDescriptorsFromTableStart);
458#define DESCRIPTOR_RANGE_FLAG(Num, Enum, Flag) \
459 IO.mapOptional(#Flag, R.Enum, false);
460#include "llvm/BinaryFormat/DXContainerConstants.def"
463void MappingTraits<llvm::DXContainerYAML::DescriptorTableYaml>::mapping(
464 IO &IO, llvm::DXContainerYAML::DescriptorTableYaml &
T) {
465 IO.mapRequired(
"NumRanges",
T.NumRanges);
466 IO.mapOptional(
"RangesOffset",
T.RangesOffset);
467 IO.mapRequired(
"Ranges",
T.Ranges);
470void MappingContextTraits<DXContainerYAML::RootParameterLocationYaml,
471 DXContainerYAML::RootSignatureYamlDesc>::
472 mapping(IO &IO, DXContainerYAML::RootParameterLocationYaml &L,
473 DXContainerYAML::RootSignatureYamlDesc &S) {
474 IO.mapRequired(
"ParameterType",
L.Header.Type);
475 IO.mapRequired(
"ShaderVisibility",
L.Header.Visibility);
477 switch (
L.Header.Type) {
478 case dxbc::RootParameterType::Constants32Bit: {
479 DXContainerYAML::RootConstantsYaml &
Constants =
480 S.Parameters.getOrInsertConstants(L);
481 IO.mapRequired(
"Constants", Constants);
484 case dxbc::RootParameterType::CBV:
485 case dxbc::RootParameterType::SRV:
486 case dxbc::RootParameterType::UAV: {
487 DXContainerYAML::RootDescriptorYaml &Descriptor =
488 S.Parameters.getOrInsertDescriptor(L);
489 IO.mapRequired(
"Descriptor", Descriptor);
492 case dxbc::RootParameterType::DescriptorTable: {
493 DXContainerYAML::DescriptorTableYaml &Table =
494 S.Parameters.getOrInsertTable(L);
495 IO.mapRequired(
"Table", Table);
501void MappingTraits<llvm::DXContainerYAML::RootConstantsYaml>::mapping(
502 IO &IO, llvm::DXContainerYAML::RootConstantsYaml &
C) {
503 IO.mapRequired(
"Num32BitValues",
C.Num32BitValues);
504 IO.mapRequired(
"RegisterSpace",
C.RegisterSpace);
505 IO.mapRequired(
"ShaderRegister",
C.ShaderRegister);
508void MappingTraits<llvm::DXContainerYAML::RootDescriptorYaml>::mapping(
509 IO &IO, llvm::DXContainerYAML::RootDescriptorYaml &
D) {
510 IO.mapRequired(
"RegisterSpace",
D.RegisterSpace);
511 IO.mapRequired(
"ShaderRegister",
D.ShaderRegister);
512#define ROOT_DESCRIPTOR_FLAG(Num, Enum, Flag) \
513 IO.mapOptional(#Flag, D.Enum, false);
514#include "llvm/BinaryFormat/DXContainerConstants.def"
517void MappingTraits<llvm::DXContainerYAML::StaticSamplerYamlDesc>::mapping(
518 IO &IO, llvm::DXContainerYAML::StaticSamplerYamlDesc &S) {
520 IO.mapOptional(
"Filter", S.
Filter);
521 IO.mapOptional(
"AddressU", S.
AddressU);
522 IO.mapOptional(
"AddressV", S.
AddressV);
523 IO.mapOptional(
"AddressW", S.
AddressW);
528 IO.mapOptional(
"MinLOD", S.
MinLOD);
529 IO.mapOptional(
"MaxLOD", S.
MaxLOD);
533#define STATIC_SAMPLER_FLAG(Num, Enum, Flag) \
534 IO.mapOptional(#Flag, S.Enum, false);
535#include "llvm/BinaryFormat/DXContainerConstants.def"
538void MappingTraits<DXContainerYAML::DebugName>::mapping(
539 IO &IO, DXContainerYAML::DebugName &DebugName) {
540 IO.mapOptional(
"Flags", DebugName.Flags);
541 IO.mapOptional(
"NameLength", DebugName.NameLength);
542 IO.mapRequired(
"DebugName", DebugName.Filename);
545void MappingTraits<DXContainerYAML::CompilerVersion>::mapping(
546 IO &IO, DXContainerYAML::CompilerVersion &CompilerVersion) {
547 IO.mapOptional(
"Major", CompilerVersion.Major);
548 IO.mapOptional(
"Minor", CompilerVersion.Minor);
549 IO.mapOptional(
"IsDebugBuild", CompilerVersion.IsDebugBuild);
550 IO.mapOptional(
"IsValidated", CompilerVersion.IsValidated);
551 IO.mapOptional(
"CommitCount", CompilerVersion.CommitCount);
552 IO.mapOptional(
"ContentSizeInBytes", CompilerVersion.ContentSizeInBytes);
553 IO.mapOptional(
"CommitSha", CompilerVersion.CommitSha);
554 IO.mapOptional(
"CustomVersionString", CompilerVersion.CustomVersionString);
557void MappingTraits<DXContainerYAML::Part>::mapping(IO &IO,
558 DXContainerYAML::Part &
P) {
559 IO.mapRequired(
"Name",
P.Name);
560 IO.mapRequired(
"Size",
P.Size);
561 IO.mapOptional(
"Program",
P.Program);
562 IO.mapOptional(
"Flags",
P.Flags);
563 IO.mapOptional(
"Hash",
P.Hash);
564 IO.mapOptional(
"PSVInfo",
P.Info);
565 IO.mapOptional(
"Signature",
P.Signature);
566 IO.mapOptional(
"RootSignature",
P.RootSignature);
567 IO.mapOptional(
"DebugName",
P.DebugName);
568 IO.mapOptional(
"CompilerVersion",
P.CompilerVersion);
569 IO.mapOptional(
"SourceInfo",
P.SourceInfo);
570 IO.mapOptional(
"PrivateData",
P.PrivateData);
573void MappingTraits<DXContainerYAML::Object>::mapping(
574 IO &IO, DXContainerYAML::Object &Obj) {
575 IO.mapTag(
"!dxcontainer",
true);
576 IO.mapRequired(
"Header",
Obj.Header);
577 IO.mapRequired(
"Parts",
Obj.Parts);
580void MappingTraits<DXContainerYAML::ResourceFlags>::mapping(
581 IO &IO, DXContainerYAML::ResourceFlags &Flags) {
582#define RESOURCE_FLAG(FlagIndex, Enum) IO.mapRequired(#Enum, Flags.Bits.Enum);
583#include "llvm/BinaryFormat/DXContainerConstants.def"
586void MappingTraits<DXContainerYAML::ResourceBindInfo>::mapping(
587 IO &IO, DXContainerYAML::ResourceBindInfo &Res) {
588 IO.mapRequired(
"Type", Res.Type);
589 IO.mapRequired(
"Space", Res.Space);
590 IO.mapRequired(
"LowerBound", Res.LowerBound);
591 IO.mapRequired(
"UpperBound", Res.UpperBound);
593 const uint32_t *PSVVersion =
static_cast<uint32_t *
>(IO.getContext());
597 IO.mapRequired(
"Kind", Res.Kind);
598 IO.mapRequired(
"Flags", Res.Flags);
601void MappingTraits<DXContainerYAML::SignatureElement>::mapping(
602 IO &IO, DXContainerYAML::SignatureElement &El) {
603 IO.mapRequired(
"Name", El.Name);
604 IO.mapRequired(
"Indices", El.Indices);
605 IO.mapRequired(
"StartRow", El.StartRow);
606 IO.mapRequired(
"Cols", El.Cols);
607 IO.mapRequired(
"StartCol", El.StartCol);
608 IO.mapRequired(
"Allocated", El.Allocated);
609 IO.mapRequired(
"Kind", El.Kind);
610 IO.mapRequired(
"ComponentType", El.Type);
611 IO.mapRequired(
"Interpolation", El.Mode);
612 IO.mapRequired(
"DynamicMask", El.DynamicMask);
613 IO.mapRequired(
"Stream", El.Stream);
616void MappingTraits<DXContainerYAML::StringTableEntry>::mapping(
617 IO &IO, DXContainerYAML::StringTableEntry &
E) {
618 IO.mapRequired(
"String",
E.String);
619 IO.mapRequired(
"Offset",
E.Offset);
622void ScalarEnumerationTraits<dxbc::PSV::SemanticKind>::enumeration(
623 IO &IO, dxbc::PSV::SemanticKind &
Value) {
624 for (
const auto &
E : dxbc::PSV::getSemanticKinds())
625 IO.enumCase(
Value,
E.name(),
E.value());
628void ScalarEnumerationTraits<dxbc::PSV::ComponentType>::enumeration(
629 IO &IO, dxbc::PSV::ComponentType &
Value) {
630 for (
const auto &
E : dxbc::PSV::getComponentTypes())
631 IO.enumCase(
Value,
E.name(),
E.value());
634void ScalarEnumerationTraits<dxbc::PSV::InterpolationMode>::enumeration(
635 IO &IO, dxbc::PSV::InterpolationMode &
Value) {
636 for (
const auto &
E : dxbc::PSV::getInterpolationModes())
637 IO.enumCase(
Value,
E.name(),
E.value());
640void ScalarEnumerationTraits<dxbc::PSV::ResourceType>::enumeration(
641 IO &IO, dxbc::PSV::ResourceType &
Value) {
642 for (
const auto &
E : dxbc::PSV::getResourceTypes())
643 IO.enumCase(
Value,
E.name(),
E.value());
646void ScalarEnumerationTraits<dxbc::PSV::ResourceKind>::enumeration(
647 IO &IO, dxbc::PSV::ResourceKind &
Value) {
648 for (
const auto &
E : dxbc::PSV::getResourceKinds())
649 IO.enumCase(
Value,
E.name(),
E.value());
652void ScalarEnumerationTraits<dxbc::D3DSystemValue>::enumeration(
653 IO &IO, dxbc::D3DSystemValue &
Value) {
654 for (
const auto &
E : dxbc::getD3DSystemValues())
655 IO.enumCase(
Value,
E.name(),
E.value());
658void ScalarEnumerationTraits<dxbc::SigMinPrecision>::enumeration(
659 IO &IO, dxbc::SigMinPrecision &
Value) {
660 for (
const auto &
E : dxbc::getSigMinPrecisions())
661 IO.enumCase(
Value,
E.name(),
E.value());
664void ScalarEnumerationTraits<dxbc::SigComponentType>::enumeration(
665 IO &IO, dxbc::SigComponentType &
Value) {
666 for (
const auto &
E : dxbc::getSigComponentTypes())
667 IO.enumCase(
Value,
E.name(),
E.value());
670void ScalarEnumerationTraits<dxbc::RootParameterType>::enumeration(
671 IO &IO, dxbc::RootParameterType &
Value) {
672 for (
const auto &
E : dxbc::getRootParameterTypes())
673 IO.enumCase(
Value,
E.name(),
E.value());
676void ScalarEnumerationTraits<dxil::ResourceClass>::enumeration(
677 IO &IO, dxil::ResourceClass &
Value) {
678 constexpr EnumStringDef<dxil::ResourceClass> ResourceClassDefs[] = {
679 {{
"CBuffer"}, dxil::ResourceClass::CBuffer},
680 {{
"SRV"}, dxil::ResourceClass::SRV},
681 {{
"UAV"}, dxil::ResourceClass::UAV},
682 {{
"Sampler"}, dxil::ResourceClass::Sampler},
687 IO.enumCase(
Value,
E.name(),
E.value());
690void ScalarEnumerationTraits<dxbc::SamplerFilter>::enumeration(
691 IO &IO, dxbc::SamplerFilter &
Value) {
692 for (
const auto &
E : dxbc::getSamplerFilters())
693 IO.enumCase(
Value,
E.name(),
E.value());
696void ScalarEnumerationTraits<dxbc::StaticBorderColor>::enumeration(
697 IO &IO, dxbc::StaticBorderColor &
Value) {
698 for (
const auto &
E : dxbc::getStaticBorderColors())
699 IO.enumCase(
Value,
E.name(),
E.value());
702void ScalarEnumerationTraits<dxbc::TextureAddressMode>::enumeration(
703 IO &IO, dxbc::TextureAddressMode &
Value) {
704 for (
const auto &
E : dxbc::getTextureAddressModes())
705 IO.enumCase(
Value,
E.name(),
E.value());
708void ScalarEnumerationTraits<dxbc::ShaderVisibility>::enumeration(
709 IO &IO, dxbc::ShaderVisibility &
Value) {
710 for (
const auto &
E : dxbc::getShaderVisibility())
711 IO.enumCase(
Value,
E.name(),
E.value());
714void ScalarEnumerationTraits<dxbc::ComparisonFunc>::enumeration(
715 IO &IO, dxbc::ComparisonFunc &
Value) {
716 for (
const auto &
E : dxbc::getComparisonFuncs())
717 IO.enumCase(
Value,
E.name(),
E.value());
720void ScalarEnumerationTraits<llvm::dxbc::SourceInfo::SectionType>::enumeration(
722 for (
const auto &
E : dxbc::SourceInfo::getSectionTypes())
723 IO.enumCase(
Value,
E.name(),
E.value());
726void ScalarEnumerationTraits<
730 for (
const auto &
E : dxbc::SourceInfo::Contents::getCompressionTypes())
731 IO.enumCase(
Value,
E.name(),
E.value());
734void MappingTraits<llvm::DXContainerYAML::SourceInfo::Header>::mapping(
735 IO &IO, llvm::DXContainerYAML::SourceInfo::Header &
H) {
736 IO.mapOptional(
"AlignedSizeInBytes",
H.AlignedSizeInBytes);
737 IO.mapOptional(
"Flags",
H.Flags);
738 IO.mapOptional(
"SectionCount",
H.SectionCount);
741void MappingTraits<llvm::DXContainerYAML::SourceInfo::SectionHeader>::mapping(
742 IO &IO, llvm::DXContainerYAML::SourceInfo::SectionHeader &
H) {
743 IO.mapOptional(
"AlignedSizeInBytes",
H.AlignedSizeInBytes);
744 IO.mapOptional(
"Flags",
H.Flags);
745 IO.mapOptional(
"Type",
H.Type);
748void MappingTraits<llvm::DXContainerYAML::SourceInfo::SourceNames::Header>::
749 mapping(IO &IO, llvm::DXContainerYAML::SourceInfo::SourceNames::Header &
H) {
750 IO.mapOptional(
"Flags",
H.Flags);
751 IO.mapOptional(
"Count",
H.Count);
752 IO.mapOptional(
"EntriesSizeInBytes",
H.EntriesSizeInBytes);
755void MappingTraits<llvm::DXContainerYAML::SourceInfo::SourceNames::Entry>::
756 mapping(IO &IO, llvm::DXContainerYAML::SourceInfo::SourceNames::Entry &
E) {
757 IO.mapOptional(
"AlignedSizeInBytes",
E.AlignedSizeInBytes);
758 IO.mapOptional(
"Flags",
E.Flags);
759 IO.mapOptional(
"NameSizeInBytes",
E.NameSizeInBytes);
760 IO.mapOptional(
"ContentSizeInBytes",
E.ContentSizeInBytes);
761 IO.mapRequired(
"FileName",
E.FileName);
764void MappingTraits<llvm::DXContainerYAML::SourceInfo::SourceNames>::mapping(
765 IO &IO, llvm::DXContainerYAML::SourceInfo::SourceNames &S) {
768 IO.mapRequired(
"Entries", S.
Entries);
771void MappingTraits<llvm::DXContainerYAML::SourceInfo::SourceContents::Header>::
773 llvm::DXContainerYAML::SourceInfo::SourceContents::Header &
H) {
774 IO.mapOptional(
"AlignedSizeInBytes",
H.AlignedSizeInBytes);
775 IO.mapOptional(
"Flags",
H.Flags);
776 IO.mapRequired(
"Type",
H.Type);
777 IO.mapOptional(
"EntriesSizeInBytes",
H.EntriesSizeInBytes);
778 IO.mapOptional(
"UncompressedEntriesSizeInBytes",
779 H.UncompressedEntriesSizeInBytes);
780 IO.mapOptional(
"Count",
H.Count);
783void MappingTraits<llvm::DXContainerYAML::SourceInfo::SourceContents::Entry>::
785 llvm::DXContainerYAML::SourceInfo::SourceContents::Entry &
E) {
786 IO.mapOptional(
"AlignedSizeInBytes",
E.AlignedSizeInBytes);
787 IO.mapOptional(
"Flags",
E.Flags);
788 IO.mapOptional(
"ContentSizeInBytes",
E.ContentSizeInBytes);
789 IO.mapRequired(
"FileContent",
E.FileContent);
792void MappingTraits<llvm::DXContainerYAML::SourceInfo::SourceContents>::mapping(
793 IO &IO, llvm::DXContainerYAML::SourceInfo::SourceContents &S) {
796 IO.mapRequired(
"Entries", S.
Entries);
799void MappingTraits<llvm::DXContainerYAML::SourceInfo::ProgramArgs::Header>::
800 mapping(IO &IO, llvm::DXContainerYAML::SourceInfo::ProgramArgs::Header &
H) {
801 IO.mapOptional(
"Flags",
H.Flags);
802 IO.mapOptional(
"SizeInBytes",
H.SizeInBytes);
803 IO.mapOptional(
"Count",
H.Count);
806void MappingTraits<mcdxbc::SourceInfo::ProgramArgs::Entry>::mapping(
807 IO &IO, mcdxbc::SourceInfo::ProgramArgs::Entry &
E) {
808 IO.mapRequired(
"Arg",
E.first);
809 IO.mapRequired(
"Value",
E.second);
812void MappingTraits<llvm::DXContainerYAML::SourceInfo::ProgramArgs>::mapping(
813 IO &IO, llvm::DXContainerYAML::SourceInfo::ProgramArgs &S) {
816 IO.mapRequired(
"Args", S.
Args);
819void MappingTraits<llvm::DXContainerYAML::SourceInfo>::mapping(
820 IO &IO, llvm::DXContainerYAML::SourceInfo &S) {
822 IO.mapRequired(
"Names", S.
Names);
823 IO.mapRequired(
"Contents", S.
Contents);
824 IO.mapRequired(
"Args", S.
Args);
864 IO.
mapRequired(
"GroupSharedBytesDependentOnViewID",
892 Info.GeomData.SigPatchConstOrPrimVectors);
895 IO.
mapRequired(
"SigPrimVectors",
Info.GeomData.MeshInfo.SigPrimVectors);
897 Info.GeomData.MeshInfo.MeshOutputTopology);
923 for (
auto Param : Sig)
925 Param.Stream, Sig.
getName(Param.NameOffset).
str(), Param.Index,
926 Param.SystemValue, Param.CompType, Param.Register, Param.Mask,
927 Param.ExclusiveMask, Param.MinPrecision});
933 Dst.AlignedSizeInBytes = Src.AlignedSizeInBytes;
934 Dst.Flags = Src.Flags;
938Expected<std::unique_ptr<DXContainerYAML::Object>>
940 std::unique_ptr<DXContainerYAML::Object> Obj =
941 std::make_unique<DXContainerYAML::Object>();
944 Obj->Header.Hash.push_back(Byte);
950 Obj->Header.PartOffsets = std::vector<uint32_t>();
951 for (
const auto P : Container) {
952 Obj->Header.PartOffsets->push_back(
P.Offset);
953 Obj->Parts.push_back(
958 case dxbc::PartType::DXIL:
959 case dxbc::PartType::ILDB: {
960 std::optional<object::DXContainer::DXILData> DXIL =
962 assert(DXIL &&
"Since we are iterating and found a DXIL/ILDB part, "
963 "this should never not have a value");
965 DXIL->first.getMajorVersion(),
966 DXIL->first.getMinorVersion(),
967 DXIL->first.ShaderKind,
969 DXIL->first.Bitcode.MajorVersion,
970 DXIL->first.Bitcode.MinorVersion,
971 DXIL->first.Bitcode.Offset,
972 DXIL->first.Bitcode.Size,
973 std::vector<llvm::yaml::Hex8>(
974 DXIL->second, DXIL->second + DXIL->first.Bitcode.Size)};
977 case dxbc::PartType::ILDN: {
979 assert(
DebugName &&
"Since we are iterating and found a ILDN part, this "
980 "should never not have a value");
986 case dxbc::PartType::PRIV: {
987 std::optional<StringRef> PrivateData = Container.
getPrivateData();
988 assert(PrivateData &&
"Since we are iterating and found a PRIV part, "
989 "this should never not have a value");
991 PrivateData->data() + PrivateData->size());
994 case dxbc::PartType::SFI0: {
997 if (Flags && *Flags > 0)
1001 case dxbc::PartType::HASH: {
1002 std::optional<dxbc::ShaderHash> Hash = Container.
getShaderHash();
1003 if (Hash && Hash->isPopulated())
1007 case dxbc::PartType::PSV0: {
1012 std::get_if<dxbc::PSV::v0::RuntimeInfo>(&
PSVInfo->getInfo())) {
1013 std::optional<uint16_t> ShaderKind = Container.
getShaderKind();
1017 }
else if (
const auto *
P = std::get_if<dxbc::PSV::v1::RuntimeInfo>(
1020 else if (
const auto *
P =
1021 std::get_if<dxbc::PSV::v2::RuntimeInfo>(&
PSVInfo->getInfo()))
1023 else if (
const auto *
P =
1024 std::get_if<dxbc::PSV::v3::RuntimeInfo>(&
PSVInfo->getInfo()))
1026 NewPart.
Info->ResourceStride =
PSVInfo->getResourceStride();
1027 NewPart.
Info->RuntimeInfoSize =
PSVInfo->getSize();
1028 if (
PSVInfo->getVersion() > 0) {
1031 while (Pos < ST.size()) {
1032 size_t End = ST.find(
'\0', Pos);
1036 NewPart.
Info->StringTable.push_back(
1037 {ST.slice(Pos, End),
static_cast<uint32_t>(Pos)});
1041 for (
auto Res :
PSVInfo->getResources())
1042 NewPart.
Info->Resources.push_back(Res);
1044 for (
auto El :
PSVInfo->getSigInputElements())
1045 NewPart.
Info->SigInputElements.push_back(
1047 El,
PSVInfo->getStringTable(),
1048 PSVInfo->getSemanticIndexTable()));
1049 for (
auto El :
PSVInfo->getSigOutputElements())
1050 NewPart.
Info->SigOutputElements.push_back(
1052 El,
PSVInfo->getStringTable(),
1053 PSVInfo->getSemanticIndexTable()));
1054 for (
auto El :
PSVInfo->getSigPatchOrPrimElements())
1055 NewPart.
Info->SigPatchOrPrimElements.push_back(
1057 El,
PSVInfo->getStringTable(),
1058 PSVInfo->getSemanticIndexTable()));
1061 for (
int I = 0;
I < 4; ++
I)
1062 for (
auto Mask :
PSVInfo->getOutputVectorMasks(
I))
1063 NewPart.
Info->OutputVectorMasks[
I].push_back(Mask);
1064 for (
auto Mask :
PSVInfo->getPatchOrPrimMasks())
1065 NewPart.
Info->PatchOrPrimMasks.push_back(Mask);
1068 for (
int I = 0;
I < 4; ++
I)
1069 for (
auto Mask :
PSVInfo->getInputOutputMap(
I))
1070 NewPart.
Info->InputOutputMap[
I].push_back(Mask);
1072 for (
auto Mask :
PSVInfo->getInputPatchMap())
1073 NewPart.
Info->InputPatchMap.push_back(Mask);
1075 for (
auto Mask :
PSVInfo->getPatchOutputMap())
1076 NewPart.
Info->PatchOutputMap.push_back(Mask);
1080 case dxbc::PartType::ISG1:
1083 case dxbc::PartType::OSG1:
1086 case dxbc::PartType::PSG1:
1091 case dxbc::PartType::RTS0: {
1092 std::optional<object::DirectX::RootSignature> RS =
1094 if (RS.has_value()) {
1095 auto RootSigDescOrErr =
1097 if (
Error E = RootSigDescOrErr.takeError())
1098 return std::move(
E);
1103 case dxbc::PartType::SRCI: {
1106 "should never not have a value");
1107 auto &SourceInfoYAML = NewPart.
SourceInfo.emplace();
1108 SourceInfoYAML.Parameters.AlignedSizeInBytes =
1111 SourceInfoYAML.Parameters.SectionCount =
1114 auto &NamesYAML = SourceInfoYAML.Names;
1117 NamesYAML.Parameters.Flags = Names.Parameters.Flags;
1118 NamesYAML.Parameters.Count = Names.Parameters.Count;
1119 NamesYAML.Parameters.EntriesSizeInBytes =
1120 Names.Parameters.EntriesSizeInBytes;
1121 NamesYAML.Entries.reserve(Names.Entries.size());
1122 for (
const auto &NameEntry : Names.Entries) {
1125 NameEntry.Parameters.AlignedSizeInBytes;
1126 NameEntryYAML.
Flags = NameEntry.Parameters.Flags;
1129 NameEntry.Parameters.ContentSizeInBytes;
1130 NameEntryYAML.
FileName = NameEntry.FileName;
1131 NamesYAML.Entries.emplace_back(NameEntryYAML);
1134 auto &ContentsYAML = SourceInfoYAML.Contents;
1136 assign(ContentsYAML.GenericHeader, Contents.GenericHeader);
1137 ContentsYAML.Parameters.AlignedSizeInBytes =
1138 Contents.Parameters.AlignedSizeInBytes;
1139 ContentsYAML.Parameters.Flags = Contents.Parameters.Flags;
1140 ContentsYAML.Parameters.Type = Contents.Parameters.Type;
1141 ContentsYAML.Parameters.EntriesSizeInBytes =
1142 Contents.Parameters.EntriesSizeInBytes;
1143 ContentsYAML.Parameters.UncompressedEntriesSizeInBytes =
1144 Contents.Parameters.UncompressedEntriesSizeInBytes;
1145 ContentsYAML.Parameters.Count = Contents.Parameters.Count;
1146 ContentsYAML.Entries.reserve(Contents.Entries.size());
1147 for (
const auto &ContentEntry : Contents.Entries) {
1150 ContentEntry.Parameters.AlignedSizeInBytes;
1151 ContentEntryYAML.
Flags = ContentEntry.Parameters.Flags;
1153 ContentEntry.Parameters.ContentSizeInBytes;
1154 ContentEntryYAML.
FileContent = ContentEntry.FileContent;
1155 ContentsYAML.Entries.emplace_back(ContentEntryYAML);
1158 auto &ArgsYAML = SourceInfoYAML.Args;
1160 assign(ArgsYAML.GenericHeader, Args.GenericHeader);
1161 ArgsYAML.Parameters.Flags = Args.Parameters.Flags;
1162 ArgsYAML.Parameters.SizeInBytes = Args.Parameters.SizeInBytes;
1163 ArgsYAML.Parameters.Count = Args.Parameters.Count;
1164 ArgsYAML.Args = Args.Args;
1167 case dxbc::PartType::VERS: {
1168 std::optional<mcdxbc::CompilerVersion>
Version =
1170 assert(
Version &&
"Since we are iterating and found a VERS part, this "
1171 "should never not have a value");
1174 !!(
Version->Parameters.Flags & dxbc::CompilerVersionFlags::Debug),
1175 !!(
Version->Parameters.Flags & dxbc::CompilerVersionFlags::Internal),
1176 Version->Parameters.CommitCount,
1177 Version->Parameters.ContentSizeInBytes,
Version->CommitSha.str(),
1178 Version->CustomVersionString.str()});
1183 return std::move(Obj);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file declares classes for handling the YAML representation of DXContainer.
#define BUILD_ENUM_STRINGS(Tab)
This file contains library features backported from future STL versions.
This file defines the make_scope_exit function, which executes user-defined cleanup logic at scope ex...
static StringRef substr(StringRef Str, uint64_t Len)
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
reference get()
Returns a reference to the stored T value.
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Represent a constant reference to a string, i.e.
static constexpr size_t npos
std::string str() const
Get the contents as an std::string.
const std::optional< DXILData > & getDXIL(bool Debug) const
std::optional< uint64_t > getShaderFeatureFlags() const
const std::optional< DirectX::PSVRuntimeInfo > & getPSVInfo() const
const std::optional< mcdxbc::SourceInfo > & getSourceInfo() const
const std::optional< mcdxbc::CompilerVersion > & getCompilerVersionInfo() const
std::optional< uint16_t > getShaderKind() const
const dxbc::Header & getHeader() const
const DirectX::Signature & getInputSignature() const
std::optional< DirectX::RootSignature > getRootSignature() const
const std::optional< mcdxbc::DebugName > getDebugName() const
const std::optional< StringRef > & getPrivateData() const
std::optional< dxbc::ShaderHash > getShaderHash() const
const DirectX::Signature & getOutputSignature() const
const DirectX::Signature & getPatchConstantSignature() const
StringRef getName(uint32_t Offset) const
void mapRequired(StringRef Key, T &Val)
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI Expected< std::unique_ptr< DXContainerYAML::Object > > fromDXContainer(object::DXContainer &DXC)
LLVM_ABI bool isValidShaderVisibility(uint32_t V)
LLVM_ABI PartType parsePartType(StringRef S)
LLVM_ABI bool isValidSamplerFilter(uint32_t V)
Triple::EnvironmentType getShaderStage(uint32_t Kind)
LLVM_ABI bool isDebugProgramPart(PartType PT)
LLVM_ABI bool isValidBorderColor(uint32_t V)
LLVM_ABI bool isValidComparisonFunc(uint32_t V)
LLVM_ABI bool isValidParameterType(uint32_t V)
LLVM_ABI bool isValidAddress(uint32_t V)
LLVM_ABI bool isValidRangeType(uint32_t V)
This is an optimization pass for GlobalISel generic memory operations.
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
static DXContainerYAML::Signature dumpSignature(const object::DirectX::Signature &Sig)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
scope_exit(Callable) -> scope_exit< Callable >
static void assign(DXContainerYAML::SourceInfo::SectionHeader &Dst, const dxbc::SourceInfo::SectionHeader &Src)
EnumStrings(const EnumStringsStorage< T, NumStrs, N, StrLen > &) -> EnumStrings< T, NumStrs >
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
static llvm::Error readDescriptorRanges(DXContainerYAML::RootParameterHeaderYaml &Header, DXContainerYAML::RootSignatureYamlDesc &RootSigDesc, object::DirectX::DescriptorTableView *DTV)
std::optional< uint16_t > NameLength
std::optional< uint16_t > Flags
uint32_t OffsetInDescriptorsFromTableStart
uint32_t BaseShaderRegister
LLVM_ABI uint32_t getEncodedFlags() const
dxil::ResourceClass RangeType
SmallVector< DescriptorRangeYaml > Ranges
SmallVector< StringTableEntry > StringTable
LLVM_ABI void mapInfoForVersion(yaml::IO &IO)
dxbc::PSV::v3::RuntimeInfo Info
std::optional< PSVInfo > Info
std::optional< DXContainerYAML::RootSignatureYamlDesc > RootSignature
std::optional< std::vector< llvm::yaml::Hex8 > > PrivateData
std::optional< DXILProgram > Program
std::optional< DXContainerYAML::Signature > Signature
std::optional< ShaderHash > Hash
std::optional< DXContainerYAML::CompilerVersion > CompilerVersion
std::optional< DXContainerYAML::DebugName > DebugName
std::optional< ShaderFeatureFlags > Flags
std::optional< DXContainerYAML::SourceInfo > SourceInfo
LLVM_ABI uint32_t getEncodedFlags() const
RootDescriptorYaml & getOrInsertDescriptor(RootParameterLocationYaml &ParamDesc)
RootConstantsYaml & getOrInsertConstants(RootParameterLocationYaml &ParamDesc)
void insertLocation(RootParameterLocationYaml &Location)
DescriptorTableYaml & getOrInsertTable(RootParameterLocationYaml &ParamDesc)
uint32_t NumRootParameters
uint32_t NumStaticSamplers
SmallVector< StaticSamplerYamlDesc > StaticSamplers
std::optional< uint32_t > RootParametersOffset
RootSignatureYamlDesc()=default
LLVM_ABI uint32_t getEncodedFlags()
static LLVM_ABI llvm::Expected< DXContainerYAML::RootSignatureYamlDesc > create(const object::DirectX::RootSignature &Data)
RootParameterYamlDesc Parameters
std::optional< uint32_t > StaticSamplersOffset
ShaderFeatureFlags()=default
LLVM_ABI uint64_t getEncodedFlags()
std::vector< llvm::yaml::Hex8 > Digest
SmallVector< mcdxbc::SourceInfo::ProgramArgs::Entry > Args
SectionHeader GenericHeader
std::optional< uint32_t > Flags
std::optional< uint32_t > ContentSizeInBytes
std::optional< uint32_t > AlignedSizeInBytes
SmallVector< Entry > Entries
std::optional< uint32_t > AlignedSizeInBytes
std::optional< uint32_t > NameSizeInBytes
std::optional< uint32_t > Flags
std::optional< uint32_t > ContentSizeInBytes
SmallVector< Entry > Entries
dxbc::StaticBorderColor BorderColor
dxbc::ShaderVisibility ShaderVisibility
dxbc::TextureAddressMode AddressU
dxbc::SamplerFilter Filter
dxbc::ComparisonFunc ComparisonFunc
dxbc::TextureAddressMode AddressV
LLVM_ABI uint32_t getEncodedFlags() const
dxbc::TextureAddressMode AddressW
uint32_t PayloadSizeInBytes
uint32_t InputControlPointCount
uint32_t TessellatorDomain
uint8_t OutputPositionPresent
uint8_t OutputPositionPresent
uint32_t OutputStreamMask
uint32_t TessellatorOutputPrimitive
uint32_t OutputControlPointCount
uint32_t InputControlPointCount
uint32_t TessellatorDomain
uint32_t PayloadSizeInBytes
uint16_t MaxOutputVertices
uint16_t MaxOutputPrimitives
uint32_t GroupSharedBytesDependentOnViewID
uint32_t GroupSharedBytesUsed
uint8_t OutputPositionPresent
llvm::Expected< DescriptorTable< T > > read()