LLVM: lib/ObjectYAML/DXContainerYAML.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
20#include
21#include <system_error>
22
23namespace llvm {
24
25
26
27static_assert((uint64_t)dxbc::FeatureFlags::NextUnusedBit <= 1ull << 63,
28 "Shader flag bits exceed enum size.");
29
31#define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str) \
32 Val = (FlagData & (uint64_t)dxbc::FeatureFlags::Val) > 0;
33#include "llvm/BinaryFormat/DXContainerConstants.def"
34}
35
36template
41
45 return E;
46 auto Table = *TableOrErr;
47
52
53 TableYaml.NumRanges = Table.NumRanges;
55
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>) {
68
69#define DESCRIPTOR_RANGE_FLAG(Num, Enum, Flag) \
70 NewR.Enum = \
71 (R.Flags & llvm::to_underlying(dxbc::DescriptorRangeFlags::Enum)) != 0;
72#include "llvm/BinaryFormat/DXContainerConstants.def"
73 }
74 TableYaml.Ranges.push_back(NewR);
75 }
76
78}
79
83
86
92
95
98 "Invalid value for parameter type");
99
101 Header.Offset = PH.ParameterOffset;
102
105 "Invalid value for shader visibility");
106
108
110 Data.getParameter(PH);
112 return std::move(E);
114
117 RCV->read();
119 return std::move(E);
120
121 auto Constants = *ConstantsOrErr;
126 ConstantYaml.Num32BitValues = Constants.Num32BitValues;
127 ConstantYaml.ShaderRegister = Constants.ShaderRegister;
128 ConstantYaml.RegisterSpace = Constants.RegisterSpace;
129
130 } else if (auto *RDV =
135 return std::move(E);
136 auto Descriptor = *DescriptorOrErr;
141
142 YamlDescriptor.ShaderRegister = Descriptor.ShaderRegister;
143 YamlDescriptor.RegisterSpace = Descriptor.RegisterSpace;
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"
150 }
151 } else if (auto *DTV =
155 Header, RootSigDesc, DTV))
156 return std::move(E);
159 Header, RootSigDesc, DTV))
160 return std::move(E);
161 } else
163 }
164 }
165
166 for (const auto &S : Data.samplers()) {
169 "Invalid value for static sampler filter");
170
173 "Invalid value for static sampler AddressU");
174
177 "Invalid value for static sampler AddressV");
178
181 "Invalid value for static sampler AddressW");
182
185 std::errc::invalid_argument,
186 "Invalid value for static sampler ComparisonFunc");
187
190 "Invalid value for static sampler BorderColor");
191
194 std::errc::invalid_argument,
195 "Invalid value for static sampler ShaderVisibility");
196
206 NewS.MinLOD = S.MinLOD;
207 NewS.MaxLOD = S.MaxLOD;
211
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"
216 }
218 }
219
220#define ROOT_SIGNATURE_FLAG(Num, Val) \
221 RootSigDesc.Val = (Flags & llvm::to_underlying(dxbc::RootFlags::Val)) > 0;
222#include "llvm/BinaryFormat/DXContainerConstants.def"
223 return RootSigDesc;
224}
225
228#define ROOT_DESCRIPTOR_FLAG(Num, Enum, Flag) \
229 if (Enum) \
230 Flags |= (uint32_t)dxbc::RootDescriptorFlags::Enum;
231#include "llvm/BinaryFormat/DXContainerConstants.def"
232 return Flags;
233}
234
237#define ROOT_SIGNATURE_FLAG(Num, Val) \
238 if (Val) \
239 Flag |= (uint32_t)dxbc::RootFlags::Val;
240#include "llvm/BinaryFormat/DXContainerConstants.def"
241 return Flag;
242}
243
246#define DESCRIPTOR_RANGE_FLAG(Num, Enum, Flag) \
247 if (Enum) \
248 Flags |= (uint32_t)dxbc::DescriptorRangeFlags::Enum;
249#include "llvm/BinaryFormat/DXContainerConstants.def"
250 return Flags;
251}
252
255#define STATIC_SAMPLER_FLAG(Num, Enum, Flag) \
256 if (Enum) \
257 Flags |= (uint32_t)dxbc::StaticSamplerFlags::Enum;
258#include "llvm/BinaryFormat/DXContainerConstants.def"
259 return Flags;
260}
261
264#define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str) \
265 if (Val) \
266 Flag |= (uint64_t)dxbc::FeatureFlags::Val;
267#include "llvm/BinaryFormat/DXContainerConstants.def"
268 return Flag;
269}
270
275 memcpy(Digest.data(), &Data.Digest[0], 16);
276}
277
279 memset(&Info, 0, sizeof(Info));
280}
281
285 memset(&Info, 0, sizeof(Info));
287
288 assert(Stage < std::numeric_limits<uint8_t>::max() &&
289 "Stage should be a very small number");
290
291
292 Info.ShaderStage = static_cast<uint8_t>(Stage);
293}
294
297 memset(&Info, 0, sizeof(Info));
299}
300
303 memset(&Info, 0, sizeof(Info));
305}
306
312 P->EntryNameOffset)) {
313 memset(&Info, 0, sizeof(Info));
315}
316
317namespace yaml {
318
324
333
345
348#define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str) \
349 IO.mapRequired(#Val, Flags.Val);
350#include "llvm/BinaryFormat/DXContainerConstants.def"
351}
352
358
362
363
367
368
370
371
372
375
379 return;
383
388 IO.mapRequired("OutputVectorMasks", MutableOutMasks);
391 }
395
398
401}
402
415
420
430#define ROOT_SIGNATURE_FLAG(Num, Val) IO.mapOptional(#Val, S.Val, false);
431#include "llvm/BinaryFormat/DXContainerConstants.def"
432}
433
437
439 if (R.NumDescriptors == UINT_MAX) {
440 int32_t NegOne = -1;
442 } else
443 IO.mapRequired("NumDescriptors", R.NumDescriptors);
444 } else {
445 int32_t TmpNumDesc = 0;
447 R.NumDescriptors = static_cast<uint32_t>(TmpNumDesc);
448 }
449
450 IO.mapRequired("BaseShaderRegister", R.BaseShaderRegister);
451 IO.mapRequired("RegisterSpace", R.RegisterSpace);
452 IO.mapRequired("OffsetInDescriptorsFromTableStart",
453 R.OffsetInDescriptorsFromTableStart);
454#define DESCRIPTOR_RANGE_FLAG(Num, Enum, Flag) \
455 IO.mapOptional(#Flag, R.Enum, false);
456#include "llvm/BinaryFormat/DXContainerConstants.def"
457}
458
465
471 IO.mapRequired("ShaderVisibility", L.Header.Visibility);
472
473 switch (L.Header.Type) {
474 case dxbc::RootParameterType::Constants32Bit: {
478 break;
479 }
480 case dxbc::RootParameterType::CBV:
481 case dxbc::RootParameterType::SRV:
482 case dxbc::RootParameterType::UAV: {
486 break;
487 }
488 case dxbc::RootParameterType::DescriptorTable: {
492 break;
493 }
494 }
495}
496
503
508#define ROOT_DESCRIPTOR_FLAG(Num, Enum, Flag) \
509 IO.mapOptional(#Flag, D.Enum, false);
510#include "llvm/BinaryFormat/DXContainerConstants.def"
511}
512
515
529#define STATIC_SAMPLER_FLAG(Num, Enum, Flag) \
530 IO.mapOptional(#Flag, S.Enum, false);
531#include "llvm/BinaryFormat/DXContainerConstants.def"
532}
533
545
548 IO.mapTag("!dxcontainer", true);
551}
552
555#define RESOURCE_FLAG(FlagIndex, Enum) IO.mapRequired(#Enum, Flags.Bits.Enum);
556#include "llvm/BinaryFormat/DXContainerConstants.def"
557}
558
565
567 if (*PSVVersion < 2)
568 return;
569
572}
573
588
593}
594
595void ScalarEnumerationTraitsdxbc::PSV::ComponentType::enumeration(
598 IO.enumCase(Value, E.Name, E.Value);
599}
600
601void ScalarEnumerationTraitsdxbc::PSV::InterpolationMode::enumeration(
602 IO &IO, dxbc::PSV::InterpolationMode &Value) {
603 for (const auto &E : dxbc::PSV::getInterpolationModes())
604 IO.enumCase(Value, E.Name, E.Value);
605}
606
607void ScalarEnumerationTraitsdxbc::PSV::ResourceType::enumeration(
608 IO &IO, dxbc::PSV::ResourceType &Value) {
609 for (const auto &E : dxbc::PSV::getResourceTypes())
610 IO.enumCase(Value, E.Name, E.Value);
611}
612
613void ScalarEnumerationTraitsdxbc::PSV::ResourceKind::enumeration(
614 IO &IO, dxbc::PSV::ResourceKind &Value) {
615 for (const auto &E : dxbc::PSV::getResourceKinds())
616 IO.enumCase(Value, E.Name, E.Value);
617}
618
619void ScalarEnumerationTraitsdxbc::D3DSystemValue::enumeration(
620 IO &IO, dxbc::D3DSystemValue &Value) {
621 for (const auto &E : dxbc::getD3DSystemValues())
622 IO.enumCase(Value, E.Name, E.Value);
623}
624
625void ScalarEnumerationTraitsdxbc::SigMinPrecision::enumeration(
626 IO &IO, dxbc::SigMinPrecision &Value) {
627 for (const auto &E : dxbc::getSigMinPrecisions())
628 IO.enumCase(Value, E.Name, E.Value);
629}
630
631void ScalarEnumerationTraitsdxbc::SigComponentType::enumeration(
632 IO &IO, dxbc::SigComponentType &Value) {
633 for (const auto &E : dxbc::getSigComponentTypes())
634 IO.enumCase(Value, E.Name, E.Value);
635}
636
637void ScalarEnumerationTraitsdxbc::RootParameterType::enumeration(
638 IO &IO, dxbc::RootParameterType &Value) {
639 for (const auto &E : dxbc::getRootParameterTypes())
640 IO.enumCase(Value, E.Name, E.Value);
641}
642
643void ScalarEnumerationTraitsdxil::ResourceClass::enumeration(
644 IO &IO, dxil::ResourceClass &Value) {
645 const EnumEntrydxil::ResourceClass ResourceClasses[] = {
646 {"CBuffer", dxil::ResourceClass::CBuffer},
647 {"SRV", dxil::ResourceClass::SRV},
648 {"UAV", dxil::ResourceClass::UAV},
649 {"Sampler", dxil::ResourceClass::Sampler},
650 };
651
652 for (const auto &E : ResourceClasses)
653 IO.enumCase(Value, E.Name, E.Value);
654}
655
656void ScalarEnumerationTraitsdxbc::SamplerFilter::enumeration(
657 IO &IO, dxbc::SamplerFilter &Value) {
658 for (const auto &E : dxbc::getSamplerFilters())
659 IO.enumCase(Value, E.Name, E.Value);
660}
661
662void ScalarEnumerationTraitsdxbc::StaticBorderColor::enumeration(
663 IO &IO, dxbc::StaticBorderColor &Value) {
664 for (const auto &E : dxbc::getStaticBorderColors())
665 IO.enumCase(Value, E.Name, E.Value);
666}
667
668void ScalarEnumerationTraitsdxbc::TextureAddressMode::enumeration(
669 IO &IO, dxbc::TextureAddressMode &Value) {
670 for (const auto &E : dxbc::getTextureAddressModes())
671 IO.enumCase(Value, E.Name, E.Value);
672}
673
674void ScalarEnumerationTraitsdxbc::ShaderVisibility::enumeration(
675 IO &IO, dxbc::ShaderVisibility &Value) {
676 for (const auto &E : dxbc::getShaderVisibility())
677 IO.enumCase(Value, E.Name, E.Value);
678}
679
680void ScalarEnumerationTraitsdxbc::ComparisonFunc::enumeration(
681 IO &IO, dxbc::ComparisonFunc &Value) {
682 for (const auto &E : dxbc::getComparisonFuncs())
683 IO.enumCase(Value, E.Name, E.Value);
684}
685
686}
687
691
692 switch (Stage) {
696 break;
699 break;
705 break;
709 IO.mapRequired("OutputControlPointCount",
712 IO.mapRequired("TessellatorOutputPrimitive",
714 break;
720 break;
723 IO.mapRequired("GroupSharedBytesDependentOnViewID",
728 break;
731 break;
732 default:
733 break;
734 }
735
736 IO.mapRequired("MinimumWaveLaneCount", Info.MinimumWaveLaneCount);
737 IO.mapRequired("MaximumWaveLaneCount", Info.MaximumWaveLaneCount);
738
740 return;
741
743
744 switch (Stage) {
746 IO.mapRequired("MaxVertexCount", Info.GeomData.MaxVertexCount);
747 break;
750 IO.mapRequired("SigPatchConstOrPrimVectors",
751 Info.GeomData.SigPatchConstOrPrimVectors);
752 break;
754 IO.mapRequired("SigPrimVectors", Info.GeomData.MeshInfo.SigPrimVectors);
756 Info.GeomData.MeshInfo.MeshOutputTopology);
757 break;
758 default:
759 break;
760 }
761
765
767 return;
768
772
774 return;
775
777}
778
779}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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.
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.
virtual bool outputting() const =0
virtual bool mapTag(StringRef Tag, bool Default=false)=0
void enumCase(T &Val, StringRef Str, const T ConstVal)
void mapOptional(StringRef Key, T &Val)
void * getContext() const
void mapRequired(StringRef Key, T &Val)
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
dxbc::PSV::ResourceFlags ResourceFlags
dxbc::PSV::v2::ResourceBindInfo ResourceBindInfo
LLVM_ABI ArrayRef< EnumEntry< ComponentType > > getComponentTypes()
LLVM_ABI ArrayRef< EnumEntry< SemanticKind > > getSemanticKinds()
bool isValidShaderVisibility(uint32_t V)
bool isValidSamplerFilter(uint32_t V)
Triple::EnvironmentType getShaderStage(uint32_t Kind)
bool isValidBorderColor(uint32_t V)
bool isValidComparisonFunc(uint32_t V)
LLVM_ABI_FOR_TEST bool isValidParameterType(uint32_t V)
bool isValidAddress(uint32_t V)
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.
detail::scope_exit< std::decay_t< Callable > > make_scope_exit(Callable &&F)
decltype(auto) dyn_cast(const From &Val)
dyn_cast - Return the argument parameter cast to the specified type.
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
FunctionAddr VTableAddr uintptr_t uintptr_t Version
static llvm::Error readDescriptorRanges(DXContainerYAML::RootParameterHeaderYaml &Header, DXContainerYAML::RootSignatureYamlDesc &RootSigDesc, object::DirectX::DescriptorTableView *DTV)
Definition DXContainerYAML.cpp:38
FunctionAddr VTableAddr uintptr_t uintptr_t Data
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
Definition DXContainerYAML.cpp:244
dxil::ResourceClass RangeType
SmallVector< DescriptorRangeYaml > Ranges
std::array< MaskVector, 4 > InputOutputMap
LLVM_ABI PSVInfo()
Definition DXContainerYAML.cpp:278
MaskVector PatchOutputMap
SmallVector< SignatureElement > SigOutputElements
MaskVector PatchOrPrimMasks
SmallVector< SignatureElement > SigPatchOrPrimElements
SmallVector< ResourceBindInfo > Resources
SmallVector< SignatureElement > SigInputElements
LLVM_ABI void mapInfoForVersion(yaml::IO &IO)
Definition DXContainerYAML.cpp:688
dxbc::PSV::v3::RuntimeInfo Info
std::array< MaskVector, 4 > OutputVectorMasks
LLVM_ABI uint32_t getEncodedFlags() const
Definition DXContainerYAML.cpp:226
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
RootSignatureYamlDesc()=default
LLVM_ABI uint32_t getEncodedFlags()
Definition DXContainerYAML.cpp:235
static LLVM_ABI llvm::Expected< DXContainerYAML::RootSignatureYamlDesc > create(const object::DirectX::RootSignature &Data)
Definition DXContainerYAML.cpp:81
RootParameterYamlDesc Parameters
std::optional< uint32_t > StaticSamplersOffset
ShaderFeatureFlags()=default
LLVM_ABI uint64_t getEncodedFlags()
Definition DXContainerYAML.cpp:262
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
dxbc::StaticBorderColor BorderColor
dxbc::ShaderVisibility ShaderVisibility
dxbc::TextureAddressMode AddressU
dxbc::SamplerFilter Filter
dxbc::ComparisonFunc ComparisonFunc
dxbc::TextureAddressMode AddressV
LLVM_ABI uint32_t getEncodedFlags() const
Definition DXContainerYAML.cpp:253
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()
This class is similar to MappingTraits but allows you to pass in additional context for each map o...
This class should be specialized by any type that needs to be converted to/from a YAML mapping.
This class should be specialized by any integral type that converts to/from a YAML scalar where there...