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
319void MappingTraits<DXContainerYAML::VersionTuple>::mapping(
321 IO.mapRequired("Major", Version.Major);
322 IO.mapRequired("Minor", Version.Minor);
323}
324
325void MappingTraits<DXContainerYAML::FileHeader>::mapping(
326 IO &IO, DXContainerYAML::FileHeader &Header) {
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
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);
344}
345
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"
351}
352
353void MappingTraits<DXContainerYAML::ShaderHash>::mapping(
354 IO &IO, DXContainerYAML::ShaderHash &Hash) {
355 IO.mapRequired("IncludesSource", Hash.IncludesSource);
356 IO.mapRequired("Digest", Hash.Digest);
357}
358
359void MappingTraits<DXContainerYAML::PSVInfo>::mapping(
360 IO &IO, DXContainerYAML::PSVInfo &PSV) {
361 IO.mapRequired("Version", PSV.Version);
362
363 // Store the PSV version in the YAML context.
364 void *OldContext = IO.getContext();
365 uint32_t Version = PSV.Version;
366 IO.setContext(&Version);
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);
374 PSV.mapInfoForVersion(IO);
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
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);
395 }
396 MutableArrayRef<SmallVector<llvm::yaml::Hex32>> MutableIOMap(
397 PSV.InputOutputMap);
398 IO.mapRequired("InputOutputMap", MutableIOMap);
399
400 if (Stage == Triple::EnvironmentType::Hull)
401 IO.mapRequired("InputPatchMap", PSV.InputPatchMap);
402
403 if (Stage == Triple::EnvironmentType::Domain)
404 IO.mapRequired("PatchOutputMap", PSV.PatchOutputMap);
405}
406
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);
418}
419
420void MappingTraits<DXContainerYAML::Signature>::mapping(
421 IO &IO, DXContainerYAML::Signature &S) {
422 IO.mapRequired("Parameters", S.Parameters);
423}
424
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"
436}
437
438void MappingTraits<llvm::DXContainerYAML::DescriptorRangeYaml>::mapping(
439 IO &IO, llvm::DXContainerYAML::DescriptorRangeYaml &R) {
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
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);
468}
469
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);
476
477 switch (L.Header.Type) {
478 case dxbc::RootParameterType::Constants32Bit: {
479 DXContainerYAML::RootConstantsYaml &Constants =
480 S.Parameters.getOrInsertConstants(L);
481 IO.mapRequired("Constants", Constants);
482 break;
483 }
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);
490 break;
491 }
492 case dxbc::RootParameterType::DescriptorTable: {
493 DXContainerYAML::DescriptorTableYaml &Table =
494 S.Parameters.getOrInsertTable(L);
495 IO.mapRequired("Table", Table);
496 break;
497 }
498 }
499}
500
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);
506}
507
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"
515}
516
517void MappingTraits<llvm::DXContainerYAML::StaticSamplerYamlDesc>::mapping(
518 IO &IO, llvm::DXContainerYAML::StaticSamplerYamlDesc &S) {
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
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);
543}
544
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);
555}
556
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}
571
572void MappingTraits<DXContainerYAML::Object>::mapping(
573 IO &IO, DXContainerYAML::Object &Obj) {
574 IO.mapTag("!dxcontainer", true);
575 IO.mapRequired("Header", Obj.Header);
576 IO.mapRequired("Parts", Obj.Parts);
577}
578
579void MappingTraits<DXContainerYAML::ResourceFlags>::mapping(
580 IO &IO, DXContainerYAML::ResourceFlags &Flags) {
581#define RESOURCE_FLAG(FlagIndex, Enum) IO.mapRequired(#Enum, Flags.Bits.Enum);
582#include "llvm/BinaryFormat/DXContainerConstants.def"
583}
584
585void MappingTraits<DXContainerYAML::ResourceBindInfo>::mapping(
586 IO &IO, DXContainerYAML::ResourceBindInfo &Res) {
587 IO.mapRequired("Type", Res.Type);
588 IO.mapRequired("Space", Res.Space);
589 IO.mapRequired("LowerBound", Res.LowerBound);
590 IO.mapRequired("UpperBound", Res.UpperBound);
591
592 const uint32_t *PSVVersion = static_cast<uint32_t *>(IO.getContext());
593 if (*PSVVersion < 2)
594 return;
595
596 IO.mapRequired("Kind", Res.Kind);
597 IO.mapRequired("Flags", Res.Flags);
598}
599
600void MappingTraits<DXContainerYAML::SignatureElement>::mapping(
601 IO &IO, DXContainerYAML::SignatureElement &El) {
602 IO.mapRequired("Name", El.Name);
603 IO.mapRequired("Indices", El.Indices);
604 IO.mapRequired("StartRow", El.StartRow);
605 IO.mapRequired("Cols", El.Cols);
606 IO.mapRequired("StartCol", El.StartCol);
607 IO.mapRequired("Allocated", El.Allocated);
608 IO.mapRequired("Kind", El.Kind);
609 IO.mapRequired("ComponentType", El.Type);
610 IO.mapRequired("Interpolation", El.Mode);
611 IO.mapRequired("DynamicMask", El.DynamicMask);
612 IO.mapRequired("Stream", El.Stream);
613}
614
615void MappingTraits<DXContainerYAML::StringTableEntry>::mapping(
616 IO &IO, DXContainerYAML::StringTableEntry &E) {
617 IO.mapRequired("String", E.String);
618 IO.mapRequired("Offset", E.Offset);
619}
620
621void ScalarEnumerationTraits<dxbc::PSV::SemanticKind>::enumeration(
622 IO &IO, dxbc::PSV::SemanticKind &Value) {
623 for (const auto &E : dxbc::PSV::getSemanticKinds())
624 IO.enumCase(Value, E.Name, E.Value);
625}
626
627void ScalarEnumerationTraits<dxbc::PSV::ComponentType>::enumeration(
628 IO &IO, dxbc::PSV::ComponentType &Value) {
629 for (const auto &E : dxbc::PSV::getComponentTypes())
630 IO.enumCase(Value, E.Name, E.Value);
631}
632
633void ScalarEnumerationTraits<dxbc::PSV::InterpolationMode>::enumeration(
634 IO &IO, dxbc::PSV::InterpolationMode &Value) {
635 for (const auto &E : dxbc::PSV::getInterpolationModes())
636 IO.enumCase(Value, E.Name, E.Value);
637}
638
639void ScalarEnumerationTraits<dxbc::PSV::ResourceType>::enumeration(
640 IO &IO, dxbc::PSV::ResourceType &Value) {
641 for (const auto &E : dxbc::PSV::getResourceTypes())
642 IO.enumCase(Value, E.Name, E.Value);
643}
644
645void ScalarEnumerationTraits<dxbc::PSV::ResourceKind>::enumeration(
646 IO &IO, dxbc::PSV::ResourceKind &Value) {
647 for (const auto &E : dxbc::PSV::getResourceKinds())
648 IO.enumCase(Value, E.Name, E.Value);
649}
650
651void ScalarEnumerationTraits<dxbc::D3DSystemValue>::enumeration(
652 IO &IO, dxbc::D3DSystemValue &Value) {
653 for (const auto &E : dxbc::getD3DSystemValues())
654 IO.enumCase(Value, E.Name, E.Value);
655}
656
657void ScalarEnumerationTraits<dxbc::SigMinPrecision>::enumeration(
658 IO &IO, dxbc::SigMinPrecision &Value) {
659 for (const auto &E : dxbc::getSigMinPrecisions())
660 IO.enumCase(Value, E.Name, E.Value);
661}
662
663void ScalarEnumerationTraits<dxbc::SigComponentType>::enumeration(
664 IO &IO, dxbc::SigComponentType &Value) {
665 for (const auto &E : dxbc::getSigComponentTypes())
666 IO.enumCase(Value, E.Name, E.Value);
667}
668
669void ScalarEnumerationTraits<dxbc::RootParameterType>::enumeration(
670 IO &IO, dxbc::RootParameterType &Value) {
671 for (const auto &E : dxbc::getRootParameterTypes())
672 IO.enumCase(Value, E.Name, E.Value);
673}
674
675void ScalarEnumerationTraits<dxil::ResourceClass>::enumeration(
676 IO &IO, dxil::ResourceClass &Value) {
677 const EnumEntry<dxil::ResourceClass> ResourceClasses[] = {
678 {"CBuffer", dxil::ResourceClass::CBuffer},
679 {"SRV", dxil::ResourceClass::SRV},
680 {"UAV", dxil::ResourceClass::UAV},
681 {"Sampler", dxil::ResourceClass::Sampler},
682 };
683
684 for (const auto &E : ResourceClasses)
685 IO.enumCase(Value, E.Name, E.Value);
686}
687
688void ScalarEnumerationTraits<dxbc::SamplerFilter>::enumeration(
689 IO &IO, dxbc::SamplerFilter &Value) {
690 for (const auto &E : dxbc::getSamplerFilters())
691 IO.enumCase(Value, E.Name, E.Value);
692}
693
694void ScalarEnumerationTraits<dxbc::StaticBorderColor>::enumeration(
695 IO &IO, dxbc::StaticBorderColor &Value) {
696 for (const auto &E : dxbc::getStaticBorderColors())
697 IO.enumCase(Value, E.Name, E.Value);
698}
699
700void ScalarEnumerationTraits<dxbc::TextureAddressMode>::enumeration(
701 IO &IO, dxbc::TextureAddressMode &Value) {
702 for (const auto &E : dxbc::getTextureAddressModes())
703 IO.enumCase(Value, E.Name, E.Value);
704}
705
706void ScalarEnumerationTraits<dxbc::ShaderVisibility>::enumeration(
707 IO &IO, dxbc::ShaderVisibility &Value) {
708 for (const auto &E : dxbc::getShaderVisibility())
709 IO.enumCase(Value, E.Name, E.Value);
710}
711
712void ScalarEnumerationTraits<dxbc::ComparisonFunc>::enumeration(
713 IO &IO, dxbc::ComparisonFunc &Value) {
714 for (const auto &E : dxbc::getComparisonFuncs())
715 IO.enumCase(Value, E.Name, E.Value);
716}
717
718void ScalarEnumerationTraits<llvm::dxbc::SourceInfo::SectionType>::enumeration(
720 for (const auto &E : dxbc::SourceInfo::getSectionTypes())
721 IO.enumCase(Value, E.Name, E.Value);
722}
723
724void ScalarEnumerationTraits<
726 enumeration(IO &IO,
728 for (const auto &E : dxbc::SourceInfo::Contents::getCompressionTypes())
729 IO.enumCase(Value, E.Name, E.Value);
730}
731
732void MappingTraits<llvm::DXContainerYAML::SourceInfo::Header>::mapping(
733 IO &IO, llvm::DXContainerYAML::SourceInfo::Header &H) {
734 IO.mapOptional("AlignedSizeInBytes", H.AlignedSizeInBytes);
735 IO.mapOptional("Flags", H.Flags);
736 IO.mapOptional("SectionCount", H.SectionCount);
737}
738
739void MappingTraits<llvm::DXContainerYAML::SourceInfo::SectionHeader>::mapping(
740 IO &IO, llvm::DXContainerYAML::SourceInfo::SectionHeader &H) {
741 IO.mapOptional("AlignedSizeInBytes", H.AlignedSizeInBytes);
742 IO.mapOptional("Flags", H.Flags);
743 IO.mapOptional("Type", H.Type);
744}
745
746void MappingTraits<llvm::DXContainerYAML::SourceInfo::SourceNames::Header>::
747 mapping(IO &IO, llvm::DXContainerYAML::SourceInfo::SourceNames::Header &H) {
748 IO.mapOptional("Flags", H.Flags);
749 IO.mapOptional("Count", H.Count);
750 IO.mapOptional("EntriesSizeInBytes", H.EntriesSizeInBytes);
751}
752
753void MappingTraits<llvm::DXContainerYAML::SourceInfo::SourceNames::Entry>::
754 mapping(IO &IO, llvm::DXContainerYAML::SourceInfo::SourceNames::Entry &E) {
755 IO.mapOptional("AlignedSizeInBytes", E.AlignedSizeInBytes);
756 IO.mapOptional("Flags", E.Flags);
757 IO.mapOptional("NameSizeInBytes", E.NameSizeInBytes);
758 IO.mapOptional("ContentSizeInBytes", E.ContentSizeInBytes);
759 IO.mapRequired("FileName", E.FileName);
760}
761
762void MappingTraits<llvm::DXContainerYAML::SourceInfo::SourceNames>::mapping(
763 IO &IO, llvm::DXContainerYAML::SourceInfo::SourceNames &S) {
764 IO.mapRequired("SectionHeader", S.GenericHeader);
765 IO.mapRequired("Header", S.Parameters);
766 IO.mapRequired("Entries", S.Entries);
767}
768
769void MappingTraits<llvm::DXContainerYAML::SourceInfo::SourceContents::Header>::
770 mapping(IO &IO,
771 llvm::DXContainerYAML::SourceInfo::SourceContents::Header &H) {
772 IO.mapOptional("AlignedSizeInBytes", H.AlignedSizeInBytes);
773 IO.mapOptional("Flags", H.Flags);
774 IO.mapRequired("Type", H.Type);
775 IO.mapOptional("EntriesSizeInBytes", H.EntriesSizeInBytes);
776 IO.mapOptional("UncompressedEntriesSizeInBytes",
777 H.UncompressedEntriesSizeInBytes);
778 IO.mapOptional("Count", H.Count);
779}
780
781void MappingTraits<llvm::DXContainerYAML::SourceInfo::SourceContents::Entry>::
782 mapping(IO &IO,
783 llvm::DXContainerYAML::SourceInfo::SourceContents::Entry &E) {
784 IO.mapOptional("AlignedSizeInBytes", E.AlignedSizeInBytes);
785 IO.mapOptional("Flags", E.Flags);
786 IO.mapOptional("ContentSizeInBytes", E.ContentSizeInBytes);
787 IO.mapRequired("FileContent", E.FileContent);
788}
789
790void MappingTraits<llvm::DXContainerYAML::SourceInfo::SourceContents>::mapping(
791 IO &IO, llvm::DXContainerYAML::SourceInfo::SourceContents &S) {
792 IO.mapRequired("SectionHeader", S.GenericHeader);
793 IO.mapRequired("Header", S.Parameters);
794 IO.mapRequired("Entries", S.Entries);
795}
796
797void MappingTraits<llvm::DXContainerYAML::SourceInfo::ProgramArgs::Header>::
798 mapping(IO &IO, llvm::DXContainerYAML::SourceInfo::ProgramArgs::Header &H) {
799 IO.mapOptional("Flags", H.Flags);
800 IO.mapOptional("SizeInBytes", H.SizeInBytes);
801 IO.mapOptional("Count", H.Count);
802}
803
804void MappingTraits<mcdxbc::SourceInfo::ProgramArgs::Entry>::mapping(
805 IO &IO, mcdxbc::SourceInfo::ProgramArgs::Entry &E) {
806 IO.mapRequired("Arg", E.first);
807 IO.mapRequired("Value", E.second);
808}
809
810void MappingTraits<llvm::DXContainerYAML::SourceInfo::ProgramArgs>::mapping(
811 IO &IO, llvm::DXContainerYAML::SourceInfo::ProgramArgs &S) {
812 IO.mapRequired("SectionHeader", S.GenericHeader);
813 IO.mapRequired("Header", S.Parameters);
814 IO.mapRequired("Args", S.Args);
815}
816
817void MappingTraits<llvm::DXContainerYAML::SourceInfo>::mapping(
818 IO &IO, llvm::DXContainerYAML::SourceInfo &S) {
819 IO.mapRequired("Header", S.Parameters);
820 IO.mapRequired("Names", S.Names);
821 IO.mapRequired("Contents", S.Contents);
822 IO.mapRequired("Args", S.Args);
823}
824
825} // namespace yaml
826
828 dxbc::PipelinePSVInfo &StageInfo = Info.StageInfo;
830
831 switch (Stage) {
833 IO.mapRequired("DepthOutput", StageInfo.PS.DepthOutput);
834 IO.mapRequired("SampleFrequency", StageInfo.PS.SampleFrequency);
835 break;
837 IO.mapRequired("OutputPositionPresent", StageInfo.VS.OutputPositionPresent);
838 break;
840 IO.mapRequired("InputPrimitive", StageInfo.GS.InputPrimitive);
841 IO.mapRequired("OutputTopology", StageInfo.GS.OutputTopology);
842 IO.mapRequired("OutputStreamMask", StageInfo.GS.OutputStreamMask);
843 IO.mapRequired("OutputPositionPresent", StageInfo.GS.OutputPositionPresent);
844 break;
846 IO.mapRequired("InputControlPointCount",
847 StageInfo.HS.InputControlPointCount);
848 IO.mapRequired("OutputControlPointCount",
849 StageInfo.HS.OutputControlPointCount);
850 IO.mapRequired("TessellatorDomain", StageInfo.HS.TessellatorDomain);
851 IO.mapRequired("TessellatorOutputPrimitive",
853 break;
855 IO.mapRequired("InputControlPointCount",
856 StageInfo.DS.InputControlPointCount);
857 IO.mapRequired("OutputPositionPresent", StageInfo.DS.OutputPositionPresent);
858 IO.mapRequired("TessellatorDomain", StageInfo.DS.TessellatorDomain);
859 break;
861 IO.mapRequired("GroupSharedBytesUsed", StageInfo.MS.GroupSharedBytesUsed);
862 IO.mapRequired("GroupSharedBytesDependentOnViewID",
864 IO.mapRequired("PayloadSizeInBytes", StageInfo.MS.PayloadSizeInBytes);
865 IO.mapRequired("MaxOutputVertices", StageInfo.MS.MaxOutputVertices);
866 IO.mapRequired("MaxOutputPrimitives", StageInfo.MS.MaxOutputPrimitives);
867 break;
869 IO.mapRequired("PayloadSizeInBytes", StageInfo.AS.PayloadSizeInBytes);
870 break;
871 default:
872 break;
873 }
874
875 IO.mapRequired("MinimumWaveLaneCount", Info.MinimumWaveLaneCount);
876 IO.mapRequired("MaximumWaveLaneCount", Info.MaximumWaveLaneCount);
877
878 if (Version == 0)
879 return;
880
881 IO.mapRequired("UsesViewID", Info.UsesViewID);
882
883 switch (Stage) {
885 IO.mapRequired("MaxVertexCount", Info.GeomData.MaxVertexCount);
886 break;
889 IO.mapRequired("SigPatchConstOrPrimVectors",
890 Info.GeomData.SigPatchConstOrPrimVectors);
891 break;
893 IO.mapRequired("SigPrimVectors", Info.GeomData.MeshInfo.SigPrimVectors);
894 IO.mapRequired("MeshOutputTopology",
895 Info.GeomData.MeshInfo.MeshOutputTopology);
896 break;
897 default:
898 break;
899 }
900
901 IO.mapRequired("SigInputVectors", Info.SigInputVectors);
902 MutableArrayRef<uint8_t> Vec(Info.SigOutputVectors);
903 IO.mapRequired("SigOutputVectors", Vec);
904
905 if (Version == 1)
906 return;
907
908 IO.mapRequired("NumThreadsX", Info.NumThreadsX);
909 IO.mapRequired("NumThreadsY", Info.NumThreadsY);
910 IO.mapRequired("NumThreadsZ", Info.NumThreadsZ);
911
912 if (Version == 2)
913 return;
914
915 IO.mapRequired("EntryName", EntryName);
916}
917
921 for (auto Param : Sig)
922 YAML.Parameters.push_back(DXContainerYAML::SignatureParameter{
923 Param.Stream, Sig.getName(Param.NameOffset).str(), Param.Index,
924 Param.SystemValue, Param.CompType, Param.Register, Param.Mask,
925 Param.ExclusiveMask, Param.MinPrecision});
926 return YAML;
927}
928
931 Dst.AlignedSizeInBytes = Src.AlignedSizeInBytes;
932 Dst.Flags = Src.Flags;
933 Dst.Type = Src.Type;
934}
935
936Expected<std::unique_ptr<DXContainerYAML::Object>>
938 std::unique_ptr<DXContainerYAML::Object> Obj =
939 std::make_unique<DXContainerYAML::Object>();
940
941 for (uint8_t Byte : Container.getHeader().FileHash.Digest)
942 Obj->Header.Hash.push_back(Byte);
943 Obj->Header.Version.Major = Container.getHeader().Version.Major;
944 Obj->Header.Version.Minor = Container.getHeader().Version.Minor;
945 Obj->Header.FileSize = Container.getHeader().FileSize;
946 Obj->Header.PartCount = Container.getHeader().PartCount;
947
948 Obj->Header.PartOffsets = std::vector<uint32_t>();
949 for (const auto P : Container) {
950 Obj->Header.PartOffsets->push_back(P.Offset);
951 Obj->Parts.push_back(
952 DXContainerYAML::Part(P.Part.getName().str(), P.Part.Size));
953 DXContainerYAML::Part &NewPart = Obj->Parts.back();
954 dxbc::PartType PT = dxbc::parsePartType(P.Part.getName());
955 switch (PT) {
956 case dxbc::PartType::DXIL:
957 case dxbc::PartType::ILDB: {
958 std::optional<object::DXContainer::DXILData> DXIL =
959 Container.getDXIL(dxbc::isDebugProgramPart(PT));
960 assert(DXIL && "Since we are iterating and found a DXIL/ILDB part, "
961 "this should never not have a value");
963 DXIL->first.getMajorVersion(),
964 DXIL->first.getMinorVersion(),
965 DXIL->first.ShaderKind,
966 DXIL->first.Size,
967 DXIL->first.Bitcode.MajorVersion,
968 DXIL->first.Bitcode.MinorVersion,
969 DXIL->first.Bitcode.Offset,
970 DXIL->first.Bitcode.Size,
971 std::vector<llvm::yaml::Hex8>(
972 DXIL->second, DXIL->second + DXIL->first.Bitcode.Size)};
973 break;
974 }
975 case dxbc::PartType::ILDN: {
976 std::optional<mcdxbc::DebugName> DebugName = Container.getDebugName();
977 assert(DebugName && "Since we are iterating and found a ILDN part, this "
978 "should never not have a value");
980 DebugName->Parameters.Flags, DebugName->Parameters.NameLength,
981 DebugName->Filename.str()};
982 break;
983 }
984 case dxbc::PartType::SFI0: {
985 std::optional<uint64_t> Flags = Container.getShaderFeatureFlags();
986 // Omit the flags in the YAML if they are missing or zero.
987 if (Flags && *Flags > 0)
989 break;
990 }
991 case dxbc::PartType::HASH: {
992 std::optional<dxbc::ShaderHash> Hash = Container.getShaderHash();
993 if (Hash && Hash->isPopulated())
994 NewPart.Hash = DXContainerYAML::ShaderHash(*Hash);
995 break;
996 }
997 case dxbc::PartType::PSV0: {
998 const auto &PSVInfo = Container.getPSVInfo();
999 if (!PSVInfo)
1000 break;
1001 if (const auto *P =
1002 std::get_if<dxbc::PSV::v0::RuntimeInfo>(&PSVInfo->getInfo())) {
1003 std::optional<uint16_t> ShaderKind = Container.getShaderKind();
1004 if (!ShaderKind)
1005 break;
1006 NewPart.Info = DXContainerYAML::PSVInfo(P, *ShaderKind);
1007 } else if (const auto *P = std::get_if<dxbc::PSV::v1::RuntimeInfo>(
1008 &PSVInfo->getInfo()))
1009 NewPart.Info = DXContainerYAML::PSVInfo(P);
1010 else if (const auto *P =
1011 std::get_if<dxbc::PSV::v2::RuntimeInfo>(&PSVInfo->getInfo()))
1012 NewPart.Info = DXContainerYAML::PSVInfo(P);
1013 else if (const auto *P =
1014 std::get_if<dxbc::PSV::v3::RuntimeInfo>(&PSVInfo->getInfo()))
1015 NewPart.Info = DXContainerYAML::PSVInfo(P, PSVInfo->getStringTable());
1016 NewPart.Info->ResourceStride = PSVInfo->getResourceStride();
1017 NewPart.Info->RuntimeInfoSize = PSVInfo->getSize();
1018 if (PSVInfo->getVersion() > 0) {
1019 StringRef ST = PSVInfo->getStringTable();
1020 size_t Pos = 0;
1021 while (Pos < ST.size()) {
1022 size_t End = ST.find('\0', Pos);
1023 if (End == StringRef::npos)
1024 End = ST.size();
1025 if (End > Pos)
1026 NewPart.Info->StringTable.push_back(
1027 {ST.slice(Pos, End), static_cast<uint32_t>(Pos)});
1028 Pos = End + 1;
1029 }
1030 }
1031 for (auto Res : PSVInfo->getResources())
1032 NewPart.Info->Resources.push_back(Res);
1033
1034 for (auto El : PSVInfo->getSigInputElements())
1035 NewPart.Info->SigInputElements.push_back(
1037 El, PSVInfo->getStringTable(),
1038 PSVInfo->getSemanticIndexTable()));
1039 for (auto El : PSVInfo->getSigOutputElements())
1040 NewPart.Info->SigOutputElements.push_back(
1042 El, PSVInfo->getStringTable(),
1043 PSVInfo->getSemanticIndexTable()));
1044 for (auto El : PSVInfo->getSigPatchOrPrimElements())
1045 NewPart.Info->SigPatchOrPrimElements.push_back(
1047 El, PSVInfo->getStringTable(),
1048 PSVInfo->getSemanticIndexTable()));
1049
1050 if (PSVInfo->usesViewID()) {
1051 for (int I = 0; I < 4; ++I)
1052 for (auto Mask : PSVInfo->getOutputVectorMasks(I))
1053 NewPart.Info->OutputVectorMasks[I].push_back(Mask);
1054 for (auto Mask : PSVInfo->getPatchOrPrimMasks())
1055 NewPart.Info->PatchOrPrimMasks.push_back(Mask);
1056 }
1057
1058 for (int I = 0; I < 4; ++I)
1059 for (auto Mask : PSVInfo->getInputOutputMap(I))
1060 NewPart.Info->InputOutputMap[I].push_back(Mask);
1061
1062 for (auto Mask : PSVInfo->getInputPatchMap())
1063 NewPart.Info->InputPatchMap.push_back(Mask);
1064
1065 for (auto Mask : PSVInfo->getPatchOutputMap())
1066 NewPart.Info->PatchOutputMap.push_back(Mask);
1067
1068 break;
1069 }
1070 case dxbc::PartType::ISG1:
1071 NewPart.Signature = dumpSignature(Container.getInputSignature());
1072 break;
1073 case dxbc::PartType::OSG1:
1074 NewPart.Signature = dumpSignature(Container.getOutputSignature());
1075 break;
1076 case dxbc::PartType::PSG1:
1077 NewPart.Signature = dumpSignature(Container.getPatchConstantSignature());
1078 break;
1080 break;
1081 case dxbc::PartType::RTS0: {
1082 std::optional<object::DirectX::RootSignature> RS =
1083 Container.getRootSignature();
1084 if (RS.has_value()) {
1085 auto RootSigDescOrErr =
1087 if (Error E = RootSigDescOrErr.takeError())
1088 return std::move(E);
1089 NewPart.RootSignature = RootSigDescOrErr.get();
1090 }
1091 break;
1092 }
1093 case dxbc::PartType::SRCI: {
1094 std::optional<mcdxbc::SourceInfo> SourceInfo = Container.getSourceInfo();
1095 assert(SourceInfo && "Since we are iterating and found a SRCI part, this "
1096 "should never not have a value");
1097 auto &SourceInfoYAML = NewPart.SourceInfo.emplace();
1098 SourceInfoYAML.Parameters.AlignedSizeInBytes =
1100 SourceInfoYAML.Parameters.Flags = SourceInfo->Parameters.Flags;
1101 SourceInfoYAML.Parameters.SectionCount =
1103
1104 auto &NamesYAML = SourceInfoYAML.Names;
1105 auto &Names = SourceInfo->Names;
1106 assign(NamesYAML.GenericHeader, SourceInfo->Names.GenericHeader);
1107 NamesYAML.Parameters.Flags = Names.Parameters.Flags;
1108 NamesYAML.Parameters.Count = Names.Parameters.Count;
1109 NamesYAML.Parameters.EntriesSizeInBytes =
1110 Names.Parameters.EntriesSizeInBytes;
1111 NamesYAML.Entries.reserve(Names.Entries.size());
1112 for (const auto &NameEntry : Names.Entries) {
1114 NameEntryYAML.AlignedSizeInBytes =
1115 NameEntry.Parameters.AlignedSizeInBytes;
1116 NameEntryYAML.Flags = NameEntry.Parameters.Flags;
1117 NameEntryYAML.NameSizeInBytes = NameEntry.Parameters.NameSizeInBytes;
1118 NameEntryYAML.ContentSizeInBytes =
1119 NameEntry.Parameters.ContentSizeInBytes;
1120 NameEntryYAML.FileName = NameEntry.FileName;
1121 NamesYAML.Entries.emplace_back(NameEntryYAML);
1122 }
1123
1124 auto &ContentsYAML = SourceInfoYAML.Contents;
1125 auto &Contents = SourceInfo->Contents;
1126 assign(ContentsYAML.GenericHeader, Contents.GenericHeader);
1127 ContentsYAML.Parameters.AlignedSizeInBytes =
1128 Contents.Parameters.AlignedSizeInBytes;
1129 ContentsYAML.Parameters.Flags = Contents.Parameters.Flags;
1130 ContentsYAML.Parameters.Type = Contents.Parameters.Type;
1131 ContentsYAML.Parameters.EntriesSizeInBytes =
1132 Contents.Parameters.EntriesSizeInBytes;
1133 ContentsYAML.Parameters.UncompressedEntriesSizeInBytes =
1134 Contents.Parameters.UncompressedEntriesSizeInBytes;
1135 ContentsYAML.Parameters.Count = Contents.Parameters.Count;
1136 ContentsYAML.Entries.reserve(Contents.Entries.size());
1137 for (const auto &ContentEntry : Contents.Entries) {
1139 ContentEntryYAML.AlignedSizeInBytes =
1140 ContentEntry.Parameters.AlignedSizeInBytes;
1141 ContentEntryYAML.Flags = ContentEntry.Parameters.Flags;
1142 ContentEntryYAML.ContentSizeInBytes =
1143 ContentEntry.Parameters.ContentSizeInBytes;
1144 ContentEntryYAML.FileContent = ContentEntry.FileContent;
1145 ContentsYAML.Entries.emplace_back(ContentEntryYAML);
1146 }
1147
1148 auto &ArgsYAML = SourceInfoYAML.Args;
1149 auto &Args = SourceInfo->Args;
1150 assign(ArgsYAML.GenericHeader, Args.GenericHeader);
1151 ArgsYAML.Parameters.Flags = Args.Parameters.Flags;
1152 ArgsYAML.Parameters.SizeInBytes = Args.Parameters.SizeInBytes;
1153 ArgsYAML.Parameters.Count = Args.Parameters.Count;
1154 ArgsYAML.Args = Args.Args;
1155 break;
1156 }
1157 case dxbc::PartType::VERS: {
1158 std::optional<mcdxbc::CompilerVersion> Version =
1159 Container.getCompilerVersionInfo();
1160 assert(Version && "Since we are iterating and found a VERS part, this "
1161 "should never not have a value");
1163 Version->Parameters.Major, Version->Parameters.Minor,
1164 !!(Version->Parameters.Flags & dxbc::CompilerVersionFlags::Debug),
1165 !!(Version->Parameters.Flags & dxbc::CompilerVersionFlags::Internal),
1166 Version->Parameters.CommitCount,
1167 Version->Parameters.ContentSizeInBytes, Version->CommitSha.str(),
1168 Version->CustomVersionString.str()});
1169 break;
1170 }
1171 }
1172 }
1173 return std::move(Obj);
1174}
1175
1176} // namespace llvm
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 I(x, y, z)
Definition MD5.cpp:57
#define H(x, y, z)
Definition MD5.cpp:56
#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
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:294
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
static constexpr size_t npos
Definition StringRef.h:58
std::string str() const
Get the contents as an std::string.
Definition StringRef.h:222
@ Amplification
Definition Triple.h:322
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
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)
Definition YAMLTraits.h:790
#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)
bool isValidShaderVisibility(uint32_t V)
LLVM_ABI PartType parsePartType(StringRef S)
bool isValidSamplerFilter(uint32_t V)
Triple::EnvironmentType getShaderStage(uint32_t Kind)
Definition DXContainer.h:49
bool isDebugProgramPart(PartType PT)
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
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.
Definition Casting.h:643
scope_exit(Callable) -> scope_exit< Callable >
static void assign(DXContainerYAML::SourceInfo::SectionHeader &Dst, const dxbc::SourceInfo::SectionHeader &Src)
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< uint16_t > NameLength
std::optional< uint16_t > Flags
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< 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
RootDescriptorYaml & getOrInsertDescriptor(RootParameterLocationYaml &ParamDesc)
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
std::optional< uint32_t > AlignedSizeInBytes
SmallVector< mcdxbc::SourceInfo::ProgramArgs::Entry > Args
uint8_t Digest[16]
Definition DXContainer.h:56
ContainerVersion Version
Definition DXContainer.h:87
uint32_t TessellatorOutputPrimitive
uint32_t GroupSharedBytesDependentOnViewID
llvm::Expected< DescriptorTable< T > > read()
AmplificationPSVInfo AS