LLVM 23.0.0git
DXContainerYAML.cpp
Go to the documentation of this file.
1//===- DXContainerYAML.cpp - DXContainer YAMLIO implementation ------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines classes for handling the YAML representation of
10// DXContainerYAML.
11//
12//===----------------------------------------------------------------------===//
13
16#include "llvm/ADT/ScopeExit.h"
18#include "llvm/Support/Error.h"
20#include <cstdint>
21#include <system_error>
22
23namespace llvm {
24
25// This assert is duplicated here to leave a breadcrumb of the places that need
26// to be updated if flags grow past 64-bits.
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 <typename T>
37static llvm::Error
41
43 DTV->read<T>();
44 if (Error E = TableOrErr.takeError())
45 return E;
46 auto Table = *TableOrErr;
47
50 RootSigDesc.Parameters.getOrInsertTable(Location);
51 RootSigDesc.Parameters.insertLocation(Location);
52
53 TableYaml.NumRanges = Table.NumRanges;
54 TableYaml.RangesOffset = Table.RangesOffset;
55
56 for (const auto &R : Table.Ranges) {
59 R.OffsetInDescriptorsFromTableStart;
60 NewR.NumDescriptors = R.NumDescriptors;
61 NewR.BaseShaderRegister = R.BaseShaderRegister;
62 NewR.RegisterSpace = R.RegisterSpace;
63 if (!dxbc::isValidRangeType(R.RangeType))
64 return createStringError(std::errc::invalid_argument,
65 "Invalid value for descriptor range type");
66 NewR.RangeType = dxil::ResourceClass(R.RangeType);
67 if constexpr (std::is_same_v<T, dxbc::RTS0::v2::DescriptorRange>) {
68 // Set all flag fields for v2
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
77 return Error::success();
78}
79
83
84 RootSignatureYamlDesc RootSigDesc;
85 uint32_t Version = Data.getVersion();
86
87 RootSigDesc.Version = Version;
88 RootSigDesc.NumStaticSamplers = Data.getNumStaticSamplers();
89 RootSigDesc.StaticSamplersOffset = Data.getStaticSamplersOffset();
90 RootSigDesc.NumRootParameters = Data.getNumRootParameters();
91 RootSigDesc.RootParametersOffset = Data.getRootParametersOffset();
92
93 uint32_t Flags = Data.getFlags();
94 for (const dxbc::RTS0::v1::RootParameterHeader &PH : Data.param_headers()) {
95
96 if (!dxbc::isValidParameterType(PH.ParameterType))
97 return createStringError(std::errc::invalid_argument,
98 "Invalid value for parameter type");
99
100 RootParameterHeaderYaml Header(dxbc::RootParameterType(PH.ParameterType));
101 Header.Offset = PH.ParameterOffset;
102
103 if (!dxbc::isValidShaderVisibility(PH.ShaderVisibility))
104 return createStringError(std::errc::invalid_argument,
105 "Invalid value for shader visibility");
106
107 Header.Visibility = dxbc::ShaderVisibility(PH.ShaderVisibility);
108
110 Data.getParameter(PH);
111 if (Error E = ParamViewOrErr.takeError())
112 return std::move(E);
113 object::DirectX::RootParameterView ParamView = ParamViewOrErr.get();
114
115 if (auto *RCV = dyn_cast<object::DirectX::RootConstantView>(&ParamView)) {
117 RCV->read();
118 if (Error E = ConstantsOrErr.takeError())
119 return std::move(E);
120
121 auto Constants = *ConstantsOrErr;
122 RootParameterLocationYaml Location(Header);
123 RootConstantsYaml &ConstantYaml =
124 RootSigDesc.Parameters.getOrInsertConstants(Location);
125 RootSigDesc.Parameters.insertLocation(Location);
126 ConstantYaml.Num32BitValues = Constants.Num32BitValues;
127 ConstantYaml.ShaderRegister = Constants.ShaderRegister;
128 ConstantYaml.RegisterSpace = Constants.RegisterSpace;
129
130 } else if (auto *RDV =
133 RDV->read(Version);
134 if (Error E = DescriptorOrErr.takeError())
135 return std::move(E);
136 auto Descriptor = *DescriptorOrErr;
137 RootParameterLocationYaml Location(Header);
138 RootDescriptorYaml &YamlDescriptor =
139 RootSigDesc.Parameters.getOrInsertDescriptor(Location);
140 RootSigDesc.Parameters.insertLocation(Location);
141
142 YamlDescriptor.ShaderRegister = Descriptor.ShaderRegister;
143 YamlDescriptor.RegisterSpace = Descriptor.RegisterSpace;
144 if (Version > 1) {
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 =
153 if (Version == 1) {
155 Header, RootSigDesc, DTV))
156 return std::move(E);
157 } else if (Version == 2 || Version == 3) {
159 Header, RootSigDesc, DTV))
160 return std::move(E);
161 } else
162 llvm_unreachable("Unknown version for DescriptorRanges");
163 }
164 }
165
166 for (const auto &S : Data.samplers()) {
167 if (!dxbc::isValidSamplerFilter(S.Filter))
168 return createStringError(std::errc::invalid_argument,
169 "Invalid value for static sampler filter");
170
171 if (!dxbc::isValidAddress(S.AddressU))
172 return createStringError(std::errc::invalid_argument,
173 "Invalid value for static sampler AddressU");
174
175 if (!dxbc::isValidAddress(S.AddressV))
176 return createStringError(std::errc::invalid_argument,
177 "Invalid value for static sampler AddressV");
178
179 if (!dxbc::isValidAddress(S.AddressW))
180 return createStringError(std::errc::invalid_argument,
181 "Invalid value for static sampler AddressW");
182
183 if (!dxbc::isValidComparisonFunc(S.ComparisonFunc))
184 return createStringError(
185 std::errc::invalid_argument,
186 "Invalid value for static sampler ComparisonFunc");
187
188 if (!dxbc::isValidBorderColor(S.BorderColor))
189 return createStringError(std::errc::invalid_argument,
190 "Invalid value for static sampler BorderColor");
191
192 if (!dxbc::isValidShaderVisibility(S.ShaderVisibility))
193 return createStringError(
194 std::errc::invalid_argument,
195 "Invalid value for static sampler ShaderVisibility");
196
198 NewS.Filter = dxbc::SamplerFilter(S.Filter);
199 NewS.AddressU = dxbc::TextureAddressMode(S.AddressU);
200 NewS.AddressV = dxbc::TextureAddressMode(S.AddressV);
201 NewS.AddressW = dxbc::TextureAddressMode(S.AddressW);
202 NewS.MipLODBias = S.MipLODBias;
203 NewS.MaxAnisotropy = S.MaxAnisotropy;
204 NewS.ComparisonFunc = dxbc::ComparisonFunc(S.ComparisonFunc);
205 NewS.BorderColor = dxbc::StaticBorderColor(S.BorderColor);
206 NewS.MinLOD = S.MinLOD;
207 NewS.MaxLOD = S.MaxLOD;
208 NewS.ShaderRegister = S.ShaderRegister;
209 NewS.RegisterSpace = S.RegisterSpace;
210 NewS.ShaderVisibility = dxbc::ShaderVisibility(S.ShaderVisibility);
211
212 if (Version > 2) {
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 }
217 RootSigDesc.StaticSamplers.push_back(NewS);
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
227 uint64_t Flags = 0;
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
236 uint64_t Flag = 0;
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
245 uint64_t Flags = 0;
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
254 uint64_t Flags = 0;
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
263 uint64_t Flag = 0;
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
272 : IncludesSource((Data.Flags & static_cast<uint32_t>(
273 dxbc::HashFlags::IncludesSource)) != 0),
274 Digest(16, 0) {
275 memcpy(Digest.data(), &Data.Digest[0], 16);
276}
277
279 memset(&Info, 0, sizeof(Info));
280}
281
283 uint16_t Stage)
284 : Version(0) {
285 memset(&Info, 0, sizeof(Info));
286 memcpy(&Info, P, sizeof(dxbc::PSV::v0::RuntimeInfo));
287
288 assert(Stage < std::numeric_limits<uint8_t>::max() &&
289 "Stage should be a very small number");
290 // We need to bring the stage in separately since it isn't part of the v1 data
291 // structure.
292 Info.ShaderStage = static_cast<uint8_t>(Stage);
293}
294
296 : Version(1) {
297 memset(&Info, 0, sizeof(Info));
298 memcpy(&Info, P, sizeof(dxbc::PSV::v1::RuntimeInfo));
299}
300
302 : Version(2) {
303 memset(&Info, 0, sizeof(Info));
304 memcpy(&Info, P, sizeof(dxbc::PSV::v2::RuntimeInfo));
305}
306
309 : Version(3),
310 EntryName(StringTable.substr(P->EntryNameOffset,
311 StringTable.find('\0', P->EntryNameOffset) -
312 P->EntryNameOffset)) {
313 memset(&Info, 0, sizeof(Info));
314 memcpy(&Info, P, sizeof(dxbc::PSV::v3::RuntimeInfo));
315}
316
317namespace yaml {
318
324
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);
332}
333
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);
344}
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
361 IO.mapRequired("Version", PSV.Version);
362
363 // Store the PSV version in the YAML context.
364 void *OldContext = IO.getContext();
367
368 // Restore the YAML context on function exit.
369 llvm::scope_exit RestoreContext([&]() { IO.setContext(OldContext); });
370
371 // Shader stage is only included in binaries for v1 and later, but we always
372 // include it since it simplifies parsing and file construction.
373 IO.mapRequired("ShaderStage", PSV.Info.ShaderStage);
375
376 IO.mapRequired("ResourceStride", PSV.ResourceStride);
377 if (PSV.Version > 0) {
378 IO.mapOptional("RuntimeInfoSize", PSV.RuntimeInfoSize);
379 IO.mapOptional("StringTable", PSV.StringTable);
380 }
381 IO.mapRequired("Resources", PSV.Resources);
382 if (PSV.Version == 0)
383 return;
384 IO.mapRequired("SigInputElements", PSV.SigInputElements);
385 IO.mapRequired("SigOutputElements", PSV.SigOutputElements);
386 IO.mapRequired("SigPatchOrPrimElements", PSV.SigPatchOrPrimElements);
387
389 if (PSV.Info.UsesViewID) {
392 IO.mapRequired("OutputVectorMasks", MutableOutMasks);
394 IO.mapRequired("PatchOrPrimMasks", PSV.PatchOrPrimMasks);
395 }
397 PSV.InputOutputMap);
398 IO.mapRequired("InputOutputMap", MutableIOMap);
399
401 IO.mapRequired("InputPatchMap", PSV.InputPatchMap);
402
404 IO.mapRequired("PatchOutputMap", PSV.PatchOutputMap);
405}
406
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);
418}
419
424
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"
436}
437
440 IO.mapRequired("RangeType", R.RangeType);
441 // handling the edge case where NumDescriptors might be -1
442 if (IO.outputting()) {
443 if (R.NumDescriptors == UINT_MAX) {
444 int32_t NegOne = -1;
445 IO.mapRequired("NumDescriptors", NegOne);
446 } else
447 IO.mapRequired("NumDescriptors", R.NumDescriptors);
448 } else {
449 int32_t TmpNumDesc = 0;
450 IO.mapRequired("NumDescriptors", TmpNumDesc);
451 R.NumDescriptors = static_cast<uint32_t>(TmpNumDesc);
452 }
453
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"
461}
462
465 IO.mapRequired("NumRanges", T.NumRanges);
466 IO.mapOptional("RangesOffset", T.RangesOffset);
467 IO.mapRequired("Ranges", T.Ranges);
468}
469
474 IO.mapRequired("ParameterType", L.Header.Type);
475 IO.mapRequired("ShaderVisibility", L.Header.Visibility);
476
477 switch (L.Header.Type) {
478 case dxbc::RootParameterType::Constants32Bit: {
481 IO.mapRequired("Constants", Constants);
482 break;
483 }
484 case dxbc::RootParameterType::CBV:
485 case dxbc::RootParameterType::SRV:
486 case dxbc::RootParameterType::UAV: {
489 IO.mapRequired("Descriptor", Descriptor);
490 break;
491 }
492 case dxbc::RootParameterType::DescriptorTable: {
495 IO.mapRequired("Table", Table);
496 break;
497 }
498 }
499}
500
503 IO.mapRequired("Num32BitValues", C.Num32BitValues);
504 IO.mapRequired("RegisterSpace", C.RegisterSpace);
505 IO.mapRequired("ShaderRegister", C.ShaderRegister);
506}
507
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"
515}
516
519
520 IO.mapOptional("Filter", S.Filter);
521 IO.mapOptional("AddressU", S.AddressU);
522 IO.mapOptional("AddressV", S.AddressV);
523 IO.mapOptional("AddressW", S.AddressW);
524 IO.mapOptional("MipLODBias", S.MipLODBias);
525 IO.mapOptional("MaxAnisotropy", S.MaxAnisotropy);
526 IO.mapOptional("ComparisonFunc", S.ComparisonFunc);
527 IO.mapOptional("BorderColor", S.BorderColor);
528 IO.mapOptional("MinLOD", S.MinLOD);
529 IO.mapOptional("MaxLOD", S.MaxLOD);
530 IO.mapRequired("ShaderRegister", S.ShaderRegister);
531 IO.mapRequired("RegisterSpace", S.RegisterSpace);
532 IO.mapRequired("ShaderVisibility", S.ShaderVisibility);
533#define STATIC_SAMPLER_FLAG(Num, Enum, Flag) \
534 IO.mapOptional(#Flag, S.Enum, false);
535#include "llvm/BinaryFormat/DXContainerConstants.def"
536}
537
540 IO.mapRequired("Name", P.Name);
541 IO.mapRequired("Size", P.Size);
542 IO.mapOptional("Program", P.Program);
543 IO.mapOptional("Flags", P.Flags);
544 IO.mapOptional("Hash", P.Hash);
545 IO.mapOptional("PSVInfo", P.Info);
546 IO.mapOptional("Signature", P.Signature);
547 IO.mapOptional("RootSignature", P.RootSignature);
548}
549
552 IO.mapTag("!dxcontainer", true);
553 IO.mapRequired("Header", Obj.Header);
554 IO.mapRequired("Parts", Obj.Parts);
555}
556
559#define RESOURCE_FLAG(FlagIndex, Enum) IO.mapRequired(#Enum, Flags.Bits.Enum);
560#include "llvm/BinaryFormat/DXContainerConstants.def"
561}
562
565 IO.mapRequired("Type", Res.Type);
566 IO.mapRequired("Space", Res.Space);
567 IO.mapRequired("LowerBound", Res.LowerBound);
568 IO.mapRequired("UpperBound", Res.UpperBound);
569
570 const uint32_t *PSVVersion = static_cast<uint32_t *>(IO.getContext());
571 if (*PSVVersion < 2)
572 return;
573
574 IO.mapRequired("Kind", Res.Kind);
575 IO.mapRequired("Flags", Res.Flags);
576}
577
580 IO.mapRequired("Name", El.Name);
581 IO.mapRequired("Indices", El.Indices);
582 IO.mapRequired("StartRow", El.StartRow);
583 IO.mapRequired("Cols", El.Cols);
584 IO.mapRequired("StartCol", El.StartCol);
585 IO.mapRequired("Allocated", El.Allocated);
586 IO.mapRequired("Kind", El.Kind);
587 IO.mapRequired("ComponentType", El.Type);
588 IO.mapRequired("Interpolation", El.Mode);
589 IO.mapRequired("DynamicMask", El.DynamicMask);
590 IO.mapRequired("Stream", El.Stream);
591}
592
598
601 for (const auto &E : dxbc::PSV::getSemanticKinds())
602 IO.enumCase(Value, E.Name, E.Value);
603}
604
605void ScalarEnumerationTraits<dxbc::PSV::ComponentType>::enumeration(
607 for (const auto &E : dxbc::PSV::getComponentTypes())
608 IO.enumCase(Value, E.Name, E.Value);
609}
610
611void ScalarEnumerationTraits<dxbc::PSV::InterpolationMode>::enumeration(
612 IO &IO, dxbc::PSV::InterpolationMode &Value) {
613 for (const auto &E : dxbc::PSV::getInterpolationModes())
614 IO.enumCase(Value, E.Name, E.Value);
615}
616
617void ScalarEnumerationTraits<dxbc::PSV::ResourceType>::enumeration(
618 IO &IO, dxbc::PSV::ResourceType &Value) {
619 for (const auto &E : dxbc::PSV::getResourceTypes())
620 IO.enumCase(Value, E.Name, E.Value);
621}
622
623void ScalarEnumerationTraits<dxbc::PSV::ResourceKind>::enumeration(
624 IO &IO, dxbc::PSV::ResourceKind &Value) {
625 for (const auto &E : dxbc::PSV::getResourceKinds())
626 IO.enumCase(Value, E.Name, E.Value);
627}
628
629void ScalarEnumerationTraits<dxbc::D3DSystemValue>::enumeration(
630 IO &IO, dxbc::D3DSystemValue &Value) {
631 for (const auto &E : dxbc::getD3DSystemValues())
632 IO.enumCase(Value, E.Name, E.Value);
633}
634
635void ScalarEnumerationTraits<dxbc::SigMinPrecision>::enumeration(
636 IO &IO, dxbc::SigMinPrecision &Value) {
637 for (const auto &E : dxbc::getSigMinPrecisions())
638 IO.enumCase(Value, E.Name, E.Value);
639}
640
641void ScalarEnumerationTraits<dxbc::SigComponentType>::enumeration(
642 IO &IO, dxbc::SigComponentType &Value) {
643 for (const auto &E : dxbc::getSigComponentTypes())
644 IO.enumCase(Value, E.Name, E.Value);
645}
646
647void ScalarEnumerationTraits<dxbc::RootParameterType>::enumeration(
648 IO &IO, dxbc::RootParameterType &Value) {
649 for (const auto &E : dxbc::getRootParameterTypes())
650 IO.enumCase(Value, E.Name, E.Value);
651}
652
653void ScalarEnumerationTraits<dxil::ResourceClass>::enumeration(
654 IO &IO, dxil::ResourceClass &Value) {
655 const EnumEntry<dxil::ResourceClass> ResourceClasses[] = {
656 {"CBuffer", dxil::ResourceClass::CBuffer},
657 {"SRV", dxil::ResourceClass::SRV},
658 {"UAV", dxil::ResourceClass::UAV},
659 {"Sampler", dxil::ResourceClass::Sampler},
660 };
661
662 for (const auto &E : ResourceClasses)
663 IO.enumCase(Value, E.Name, E.Value);
664}
665
666void ScalarEnumerationTraits<dxbc::SamplerFilter>::enumeration(
667 IO &IO, dxbc::SamplerFilter &Value) {
668 for (const auto &E : dxbc::getSamplerFilters())
669 IO.enumCase(Value, E.Name, E.Value);
670}
671
672void ScalarEnumerationTraits<dxbc::StaticBorderColor>::enumeration(
673 IO &IO, dxbc::StaticBorderColor &Value) {
674 for (const auto &E : dxbc::getStaticBorderColors())
675 IO.enumCase(Value, E.Name, E.Value);
676}
677
678void ScalarEnumerationTraits<dxbc::TextureAddressMode>::enumeration(
679 IO &IO, dxbc::TextureAddressMode &Value) {
680 for (const auto &E : dxbc::getTextureAddressModes())
681 IO.enumCase(Value, E.Name, E.Value);
682}
683
684void ScalarEnumerationTraits<dxbc::ShaderVisibility>::enumeration(
685 IO &IO, dxbc::ShaderVisibility &Value) {
686 for (const auto &E : dxbc::getShaderVisibility())
687 IO.enumCase(Value, E.Name, E.Value);
688}
689
690void ScalarEnumerationTraits<dxbc::ComparisonFunc>::enumeration(
691 IO &IO, dxbc::ComparisonFunc &Value) {
692 for (const auto &E : dxbc::getComparisonFuncs())
693 IO.enumCase(Value, E.Name, E.Value);
694}
695
696} // namespace yaml
697
699 dxbc::PipelinePSVInfo &StageInfo = Info.StageInfo;
701
702 switch (Stage) {
704 IO.mapRequired("DepthOutput", StageInfo.PS.DepthOutput);
705 IO.mapRequired("SampleFrequency", StageInfo.PS.SampleFrequency);
706 break;
708 IO.mapRequired("OutputPositionPresent", StageInfo.VS.OutputPositionPresent);
709 break;
711 IO.mapRequired("InputPrimitive", StageInfo.GS.InputPrimitive);
712 IO.mapRequired("OutputTopology", StageInfo.GS.OutputTopology);
713 IO.mapRequired("OutputStreamMask", StageInfo.GS.OutputStreamMask);
714 IO.mapRequired("OutputPositionPresent", StageInfo.GS.OutputPositionPresent);
715 break;
717 IO.mapRequired("InputControlPointCount",
718 StageInfo.HS.InputControlPointCount);
719 IO.mapRequired("OutputControlPointCount",
720 StageInfo.HS.OutputControlPointCount);
721 IO.mapRequired("TessellatorDomain", StageInfo.HS.TessellatorDomain);
722 IO.mapRequired("TessellatorOutputPrimitive",
724 break;
726 IO.mapRequired("InputControlPointCount",
727 StageInfo.DS.InputControlPointCount);
728 IO.mapRequired("OutputPositionPresent", StageInfo.DS.OutputPositionPresent);
729 IO.mapRequired("TessellatorDomain", StageInfo.DS.TessellatorDomain);
730 break;
732 IO.mapRequired("GroupSharedBytesUsed", StageInfo.MS.GroupSharedBytesUsed);
733 IO.mapRequired("GroupSharedBytesDependentOnViewID",
735 IO.mapRequired("PayloadSizeInBytes", StageInfo.MS.PayloadSizeInBytes);
736 IO.mapRequired("MaxOutputVertices", StageInfo.MS.MaxOutputVertices);
737 IO.mapRequired("MaxOutputPrimitives", StageInfo.MS.MaxOutputPrimitives);
738 break;
740 IO.mapRequired("PayloadSizeInBytes", StageInfo.AS.PayloadSizeInBytes);
741 break;
742 default:
743 break;
744 }
745
746 IO.mapRequired("MinimumWaveLaneCount", Info.MinimumWaveLaneCount);
747 IO.mapRequired("MaximumWaveLaneCount", Info.MaximumWaveLaneCount);
748
749 if (Version == 0)
750 return;
751
752 IO.mapRequired("UsesViewID", Info.UsesViewID);
753
754 switch (Stage) {
756 IO.mapRequired("MaxVertexCount", Info.GeomData.MaxVertexCount);
757 break;
760 IO.mapRequired("SigPatchConstOrPrimVectors",
761 Info.GeomData.SigPatchConstOrPrimVectors);
762 break;
764 IO.mapRequired("SigPrimVectors", Info.GeomData.MeshInfo.SigPrimVectors);
765 IO.mapRequired("MeshOutputTopology",
766 Info.GeomData.MeshInfo.MeshOutputTopology);
767 break;
768 default:
769 break;
770 }
771
772 IO.mapRequired("SigInputVectors", Info.SigInputVectors);
773 MutableArrayRef<uint8_t> Vec(Info.SigOutputVectors);
774 IO.mapRequired("SigOutputVectors", Vec);
775
776 if (Version == 1)
777 return;
778
779 IO.mapRequired("NumThreadsX", Info.NumThreadsX);
780 IO.mapRequired("NumThreadsY", Info.NumThreadsY);
781 IO.mapRequired("NumThreadsZ", Info.NumThreadsZ);
782
783 if (Version == 2)
784 return;
785
786 IO.mapRequired("EntryName", EntryName);
787}
788
789} // namespace llvm
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.
#define T
#define P(N)
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.
Definition Error.h:159
static ErrorSuccess success()
Create a success value.
Definition Error.h:336
Tagged union holding either a T or a Error.
Definition Error.h:485
Error takeError()
Take ownership of the stored error.
Definition Error.h:612
reference get()
Returns a reference to the stored T value.
Definition Error.h:582
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition ArrayRef.h:298
Represent a constant reference to a string, i.e.
Definition StringRef.h:55
@ Amplification
Definition Triple.h:321
LLVM Value Representation.
Definition Value.h:75
void setContext(void *)
virtual bool outputting() const =0
virtual bool mapTag(StringRef Tag, bool Default=false)=0
void enumCase(T &Val, StringRef Str, const T ConstVal)
Definition YAMLTraits.h:735
void mapOptional(StringRef Key, T &Val)
Definition YAMLTraits.h:800
void * getContext() const
void mapRequired(StringRef Key, T &Val)
Definition YAMLTraits.h:790
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
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)
Definition DXContainer.h:47
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.
Definition STLExtras.h:1764
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
Definition Error.h:1321
FunctionAddr VTableAddr uintptr_t uintptr_t Version
Definition InstrProf.h:334
static llvm::Error readDescriptorRanges(DXContainerYAML::RootParameterHeaderYaml &Header, DXContainerYAML::RootSignatureYamlDesc &RootSigDesc, object::DirectX::DescriptorTableView *DTV)
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:221
std::optional< uint32_t > Size
std::optional< std::vector< llvm::yaml::Hex8 > > DXIL
std::optional< uint32_t > DXILSize
SmallVector< DescriptorRangeYaml > Ranges
std::array< MaskVector, 4 > InputOutputMap
SmallVector< StringTableEntry > StringTable
SmallVector< SignatureElement > SigOutputElements
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
RootDescriptorYaml & getOrInsertDescriptor(RootParameterLocationYaml &ParamDesc)
SmallVector< RootParameterLocationYaml > Locations
RootConstantsYaml & getOrInsertConstants(RootParameterLocationYaml &ParamDesc)
void insertLocation(RootParameterLocationYaml &Location)
DescriptorTableYaml & getOrInsertTable(RootParameterLocationYaml &ParamDesc)
SmallVector< StaticSamplerYamlDesc > StaticSamplers
static LLVM_ABI llvm::Expected< DXContainerYAML::RootSignatureYamlDesc > create(const object::DirectX::RootSignature &Data)
std::vector< llvm::yaml::Hex8 > Digest
dxbc::PSV::InterpolationMode Mode
llvm::SmallVector< SignatureParameter > Parameters
uint32_t TessellatorOutputPrimitive
uint32_t GroupSharedBytesDependentOnViewID
llvm::Expected< DescriptorTable< T > > read()
This class is similar to MappingTraits<T> but allows you to pass in additional context for each map o...
Definition YAMLTraits.h:86
This class should be specialized by any type that needs to be converted to/from a YAML mapping.
Definition YAMLTraits.h:63
This class should be specialized by any integral type that converts to/from a YAML scalar where there...
Definition YAMLTraits.h:108
AmplificationPSVInfo AS