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;
64 if constexpr (std::is_same_v<T, dxbc::RTS0::v2::DescriptorRange>) {
66#define DESCRIPTOR_RANGE_FLAG(Num, Enum, Flag) \
68 (R.Flags & llvm::to_underlying(dxbc::DescriptorRangeFlags::Enum)) != 0;
69#include "llvm/BinaryFormat/DXContainerConstants.def"
71 TableYaml.
Ranges.push_back(NewR);
95 "Invalid value for parameter type");
98 Header.Offset = PH.ParameterOffset;
99 Header.Type = PH.ParameterType;
103 "Invalid value for shader visibility");
105 Header.Visibility = PH.ShaderVisibility;
108 Data.getParameter(PH);
113 if (
auto *RCV = dyn_cast<object::DirectX::RootConstantView>(&ParamView)) {
119 auto Constants = *ConstantsOrErr;
128 }
else if (
auto *RDV =
129 dyn_cast<object::DirectX::RootDescriptorView>(&ParamView)) {
134 auto Descriptor = *DescriptorOrErr;
143#define ROOT_DESCRIPTOR_FLAG(Num, Enum, Flag) \
144 YamlDescriptor.Enum = \
145 (Descriptor.Flags & \
146 llvm::to_underlying(dxbc::RootDescriptorFlags::Enum)) > 0;
147#include "llvm/BinaryFormat/DXContainerConstants.def"
149 }
else if (
auto *DTV =
150 dyn_cast<object::DirectX::DescriptorTableView>(&ParamView)) {
152 if (
Error E = readDescriptorRanges<dxbc::RTS0::v1::DescriptorRange>(
153 Header, RootSigDesc, DTV))
156 if (
Error E = readDescriptorRanges<dxbc::RTS0::v2::DescriptorRange>(
157 Header, RootSigDesc, DTV))
164 for (
const auto &S :
Data.samplers()) {
183#define ROOT_SIGNATURE_FLAG(Num, Val) \
184 RootSigDesc.Val = (Flags & llvm::to_underlying(dxbc::RootFlags::Val)) > 0;
185#include "llvm/BinaryFormat/DXContainerConstants.def"
191#define ROOT_DESCRIPTOR_FLAG(Num, Enum, Flag) \
193 Flags |= (uint32_t)dxbc::RootDescriptorFlags::Enum;
194#include "llvm/BinaryFormat/DXContainerConstants.def"
200#define ROOT_SIGNATURE_FLAG(Num, Val) \
202 Flag |= (uint32_t)dxbc::RootFlags::Val;
203#include "llvm/BinaryFormat/DXContainerConstants.def"
209#define DESCRIPTOR_RANGE_FLAG(Num, Enum, Flag) \
211 Flags |= (uint32_t)dxbc::DescriptorRangeFlags::Enum;
212#include "llvm/BinaryFormat/DXContainerConstants.def"
218#define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str) \
220 Flag |= (uint64_t)dxbc::FeatureFlags::Val;
221#include "llvm/BinaryFormat/DXContainerConstants.def"
227 dxbc::HashFlags::IncludesSource)) != 0),
242 assert(Stage < std::numeric_limits<uint8_t>::max() &&
243 "Stage should be a very small number");
266 P->EntryNameOffset)) {
275 IO.mapRequired(
"Major", Version.Major);
276 IO.mapRequired(
"Minor", Version.Minor);
281 IO.mapRequired(
"Hash", Header.Hash);
282 IO.mapRequired(
"Version", Header.Version);
283 IO.mapOptional(
"FileSize", Header.FileSize);
284 IO.mapRequired(
"PartCount", Header.PartCount);
285 IO.mapOptional(
"PartOffsets", Header.PartOffsets);
292 IO.mapRequired(
"ShaderKind", Program.
ShaderKind);
293 IO.mapOptional(
"Size", Program.
Size);
296 IO.mapOptional(
"DXILSize", Program.
DXILSize);
297 IO.mapOptional(
"DXIL", Program.
DXIL);
302#define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str) \
303 IO.mapRequired(#Val, Flags.Val);
304#include "llvm/BinaryFormat/DXContainerConstants.def"
310 IO.mapRequired(
"Digest", Hash.
Digest);
315 IO.mapRequired(
"Version", PSV.
Version);
318 void *OldContext = IO.getContext();
320 IO.setContext(&Version);
323 auto RestoreContext =
make_scope_exit([&]() { IO.setContext(OldContext); });
331 IO.mapRequired(
"Resources", PSV.
Resources);
342 IO.mapRequired(
"OutputVectorMasks", MutableOutMasks);
343 if (Stage == Triple::EnvironmentType::Hull)
348 IO.mapRequired(
"InputOutputMap", MutableIOMap);
350 if (Stage == Triple::EnvironmentType::Hull)
353 if (Stage == Triple::EnvironmentType::Domain)
359 IO.mapRequired(
"Stream", S.
Stream);
360 IO.mapRequired(
"Name", S.
Name);
361 IO.mapRequired(
"Index", S.
Index);
363 IO.mapRequired(
"CompType", S.
CompType);
364 IO.mapRequired(
"Register", S.
Register);
365 IO.mapRequired(
"Mask", S.
Mask);
377 IO.mapRequired(
"Version", S.
Version);
384#define ROOT_SIGNATURE_FLAG(Num, Val) IO.mapOptional(#Val, S.Val, false);
385#include "llvm/BinaryFormat/DXContainerConstants.def"
390 IO.mapRequired(
"RangeType", R.RangeType);
392 if (IO.outputting()) {
393 if (R.NumDescriptors == UINT_MAX) {
395 IO.mapRequired(
"NumDescriptors", NegOne);
397 IO.mapRequired(
"NumDescriptors", R.NumDescriptors);
399 int32_t TmpNumDesc = 0;
400 IO.mapRequired(
"NumDescriptors", TmpNumDesc);
401 R.NumDescriptors =
static_cast<uint32_t>(TmpNumDesc);
404 IO.mapRequired(
"BaseShaderRegister", R.BaseShaderRegister);
405 IO.mapRequired(
"RegisterSpace", R.RegisterSpace);
406 IO.mapRequired(
"OffsetInDescriptorsFromTableStart",
407 R.OffsetInDescriptorsFromTableStart);
408#define DESCRIPTOR_RANGE_FLAG(Num, Enum, Flag) \
409 IO.mapOptional(#Flag, R.Enum, false);
410#include "llvm/BinaryFormat/DXContainerConstants.def"
415 IO.mapRequired(
"NumRanges",
T.NumRanges);
416 IO.mapOptional(
"RangesOffset",
T.RangesOffset);
417 IO.mapRequired(
"Ranges",
T.Ranges);
424 IO.mapRequired(
"ParameterType", L.Header.Type);
425 IO.mapRequired(
"ShaderVisibility", L.Header.Visibility);
427 switch (L.Header.Type) {
431 IO.mapRequired(
"Constants", Constants);
439 IO.mapRequired(
"Descriptor", Descriptor);
445 IO.mapRequired(
"Table", Table);
453 IO.mapRequired(
"Num32BitValues",
C.Num32BitValues);
454 IO.mapRequired(
"RegisterSpace",
C.RegisterSpace);
455 IO.mapRequired(
"ShaderRegister",
C.ShaderRegister);
460 IO.mapRequired(
"RegisterSpace",
D.RegisterSpace);
461 IO.mapRequired(
"ShaderRegister",
D.ShaderRegister);
462#define ROOT_DESCRIPTOR_FLAG(Num, Enum, Flag) \
463 IO.mapOptional(#Flag, D.Enum, false);
464#include "llvm/BinaryFormat/DXContainerConstants.def"
470 IO.mapOptional(
"Filter", S.
Filter);
471 IO.mapOptional(
"AddressU", S.
AddressU);
472 IO.mapOptional(
"AddressV", S.
AddressV);
473 IO.mapOptional(
"AddressW", S.
AddressW);
478 IO.mapOptional(
"MinLOD", S.
MinLOD);
479 IO.mapOptional(
"MaxLOD", S.
MaxLOD);
487 IO.mapRequired(
"Name",
P.Name);
488 IO.mapRequired(
"Size",
P.Size);
489 IO.mapOptional(
"Program",
P.Program);
490 IO.mapOptional(
"Flags",
P.Flags);
491 IO.mapOptional(
"Hash",
P.Hash);
492 IO.mapOptional(
"PSVInfo",
P.Info);
493 IO.mapOptional(
"Signature",
P.Signature);
494 IO.mapOptional(
"RootSignature",
P.RootSignature);
499 IO.mapTag(
"!dxcontainer",
true);
500 IO.mapRequired(
"Header", Obj.
Header);
501 IO.mapRequired(
"Parts", Obj.
Parts);
506#define RESOURCE_FLAG(FlagIndex, Enum) IO.mapRequired(#Enum, Flags.Bits.Enum);
507#include "llvm/BinaryFormat/DXContainerConstants.def"
512 IO.mapRequired(
"Type", Res.
Type);
513 IO.mapRequired(
"Space", Res.
Space);
521 IO.mapRequired(
"Kind", Res.
Kind);
522 IO.mapRequired(
"Flags", Res.
Flags);
527 IO.mapRequired(
"Name", El.
Name);
528 IO.mapRequired(
"Indices", El.
Indices);
529 IO.mapRequired(
"StartRow", El.
StartRow);
530 IO.mapRequired(
"Cols", El.
Cols);
531 IO.mapRequired(
"StartCol", El.
StartCol);
532 IO.mapRequired(
"Allocated", El.
Allocated);
533 IO.mapRequired(
"Kind", El.
Kind);
534 IO.mapRequired(
"ComponentType", El.
Type);
535 IO.mapRequired(
"Interpolation", El.
Mode);
537 IO.mapRequired(
"Stream", El.
Stream);
540void ScalarEnumerationTraits<dxbc::PSV::SemanticKind>::enumeration(
542 for (
const auto &
E : dxbc::PSV::getSemanticKinds())
543 IO.enumCase(
Value,
E.Name.str().c_str(),
E.Value);
546void ScalarEnumerationTraits<dxbc::PSV::ComponentType>::enumeration(
548 for (
const auto &
E : dxbc::PSV::getComponentTypes())
549 IO.enumCase(
Value,
E.Name.str().c_str(),
E.Value);
552void ScalarEnumerationTraits<dxbc::PSV::InterpolationMode>::enumeration(
553 IO &IO, dxbc::PSV::InterpolationMode &Value) {
554 for (
const auto &
E : dxbc::PSV::getInterpolationModes())
555 IO.enumCase(Value,
E.Name.str().c_str(),
E.Value);
558void ScalarEnumerationTraits<dxbc::PSV::ResourceType>::enumeration(
559 IO &IO, dxbc::PSV::ResourceType &Value) {
560 for (
const auto &
E : dxbc::PSV::getResourceTypes())
561 IO.enumCase(Value,
E.Name.str().c_str(),
E.Value);
564void ScalarEnumerationTraits<dxbc::PSV::ResourceKind>::enumeration(
565 IO &IO, dxbc::PSV::ResourceKind &Value) {
566 for (
const auto &
E : dxbc::PSV::getResourceKinds())
567 IO.enumCase(Value,
E.Name.str().c_str(),
E.Value);
570void ScalarEnumerationTraits<dxbc::D3DSystemValue>::enumeration(
571 IO &IO, dxbc::D3DSystemValue &Value) {
572 for (
const auto &
E : dxbc::getD3DSystemValues())
573 IO.enumCase(Value,
E.Name.str().c_str(),
E.Value);
576void ScalarEnumerationTraits<dxbc::SigMinPrecision>::enumeration(
577 IO &IO, dxbc::SigMinPrecision &Value) {
578 for (
const auto &
E : dxbc::getSigMinPrecisions())
579 IO.enumCase(Value,
E.Name.str().c_str(),
E.Value);
582void ScalarEnumerationTraits<dxbc::SigComponentType>::enumeration(
583 IO &IO, dxbc::SigComponentType &Value) {
584 for (
const auto &
E : dxbc::getSigComponentTypes())
585 IO.enumCase(Value,
E.Name.str().c_str(),
E.Value);
609 IO.mapRequired(
"InputControlPointCount",
611 IO.mapRequired(
"OutputControlPointCount",
614 IO.mapRequired(
"TessellatorOutputPrimitive",
618 IO.mapRequired(
"InputControlPointCount",
625 IO.mapRequired(
"GroupSharedBytesDependentOnViewID",
638 IO.mapRequired(
"MinimumWaveLaneCount",
Info.MinimumWaveLaneCount);
639 IO.mapRequired(
"MaximumWaveLaneCount",
Info.MaximumWaveLaneCount);
644 IO.mapRequired(
"UsesViewID",
Info.UsesViewID);
648 IO.mapRequired(
"MaxVertexCount",
Info.GeomData.MaxVertexCount);
652 IO.mapRequired(
"SigPatchConstOrPrimVectors",
653 Info.GeomData.SigPatchConstOrPrimVectors);
656 IO.mapRequired(
"SigPrimVectors",
Info.GeomData.MeshInfo.SigPrimVectors);
657 IO.mapRequired(
"MeshOutputTopology",
658 Info.GeomData.MeshInfo.MeshOutputTopology);
664 IO.mapRequired(
"SigInputVectors",
Info.SigInputVectors);
666 IO.mapRequired(
"SigOutputVectors", Vec);
671 IO.mapRequired(
"NumThreadsX",
Info.NumThreadsX);
672 IO.mapRequired(
"NumThreadsY",
Info.NumThreadsY);
673 IO.mapRequired(
"NumThreadsZ",
Info.NumThreadsZ);
678 IO.mapRequired(
"EntryName", EntryName);
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")
Analysis containing CSE Info
This file declares classes for handling the YAML representation of DXContainer.
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.
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
StringRef - Represent a constant reference to a string, i.e.
A table of densely packed, null-terminated strings indexed by offset.
LLVM Value Representation.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
bool isValidShaderVisibility(uint32_t V)
Triple::EnvironmentType getShaderStage(uint32_t Kind)
bool isValidParameterType(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.
detail::scope_exit< std::decay_t< Callable > > make_scope_exit(Callable &&F)
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
constexpr std::underlying_type_t< Enum > to_underlying(Enum E)
Returns underlying integer value of an enum.
static llvm::Error readDescriptorRanges(DXContainerYAML::RootParameterHeaderYaml &Header, DXContainerYAML::RootSignatureYamlDesc &RootSigDesc, object::DirectX::DescriptorTableView *DTV)
uint16_t DXILMajorVersion
std::optional< uint32_t > Size
uint16_t DXILMinorVersion
std::optional< std::vector< llvm::yaml::Hex8 > > DXIL
std::optional< uint32_t > DXILSize
uint32_t OffsetInDescriptorsFromTableStart
uint32_t BaseShaderRegister
LLVM_ABI uint32_t getEncodedFlags() const
SmallVector< DescriptorRangeYaml > Ranges
std::vector< Part > Parts
std::array< MaskVector, 4 > InputOutputMap
MaskVector PatchOutputMap
SmallVector< SignatureElement > SigOutputElements
MaskVector PatchOrPrimMasks
SmallVector< SignatureElement > SigPatchOrPrimElements
SmallVector< ResourceBindInfo > Resources
SmallVector< SignatureElement > SigInputElements
LLVM_ABI void mapInfoForVersion(yaml::IO &IO)
dxbc::PSV::v3::RuntimeInfo Info
std::array< MaskVector, 4 > OutputVectorMasks
LLVM_ABI uint32_t getEncodedFlags() const
RootDescriptorYaml & getOrInsertDescriptor(RootParameterLocationYaml &ParamDesc)
SmallVector< RootParameterLocationYaml > Locations
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
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
dxbc::PSV::ComponentType Type
dxbc::PSV::InterpolationMode Mode
llvm::yaml::Hex8 DynamicMask
dxbc::PSV::SemanticKind Kind
SmallVector< uint32_t > Indices
dxbc::SigComponentType CompType
dxbc::SigMinPrecision MinPrecision
dxbc::D3DSystemValue SystemValue
llvm::SmallVector< SignatureParameter > Parameters
uint32_t ShaderVisibility
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()