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
14 #include "llvm/ObjectYAML/DXContainerYAML.h"
15 #include "llvm/BinaryFormat/DXContainer.h"
16
17 namespace llvm {
18
19 // This assert is duplicated here to leave a breadcrumb of the places that need
20 // to be updated if flags grow past 64-bits.
21 static_assert((uint64_t)dxbc::FeatureFlags::NextUnusedBit <= 1ull << 63,
22 "Shader flag bits exceed enum size.");
23
ShaderFlags(uint64_t FlagData)24 DXContainerYAML::ShaderFlags::ShaderFlags(uint64_t FlagData) {
25 #define SHADER_FLAG(Num, Val, Str) \
26 Val = (FlagData & (uint64_t)dxbc::FeatureFlags::Val) > 0;
27 #include "llvm/BinaryFormat/DXContainerConstants.def"
28 }
29
getEncodedFlags()30 uint64_t DXContainerYAML::ShaderFlags::getEncodedFlags() {
31 uint64_t Flag = 0;
32 #define SHADER_FLAG(Num, Val, Str) \
33 if (Val) \
34 Flag |= (uint64_t)dxbc::FeatureFlags::Val;
35 #include "llvm/BinaryFormat/DXContainerConstants.def"
36 return Flag;
37 }
38
ShaderHash(const dxbc::ShaderHash & Data)39 DXContainerYAML::ShaderHash::ShaderHash(const dxbc::ShaderHash &Data)
40 : IncludesSource((Data.Flags & static_cast<uint32_t>(
41 dxbc::HashFlags::IncludesSource)) != 0),
42 Digest(16, 0) {
43 memcpy(Digest.data(), &Data.Digest[0], 16);
44 }
45
46 namespace yaml {
47
mapping(IO & IO,DXContainerYAML::VersionTuple & Version)48 void MappingTraits<DXContainerYAML::VersionTuple>::mapping(
49 IO &IO, DXContainerYAML::VersionTuple &Version) {
50 IO.mapRequired("Major", Version.Major);
51 IO.mapRequired("Minor", Version.Minor);
52 }
53
mapping(IO & IO,DXContainerYAML::FileHeader & Header)54 void MappingTraits<DXContainerYAML::FileHeader>::mapping(
55 IO &IO, DXContainerYAML::FileHeader &Header) {
56 IO.mapRequired("Hash", Header.Hash);
57 IO.mapRequired("Version", Header.Version);
58 IO.mapOptional("FileSize", Header.FileSize);
59 IO.mapRequired("PartCount", Header.PartCount);
60 IO.mapOptional("PartOffsets", Header.PartOffsets);
61 }
62
mapping(IO & IO,DXContainerYAML::DXILProgram & Program)63 void MappingTraits<DXContainerYAML::DXILProgram>::mapping(
64 IO &IO, DXContainerYAML::DXILProgram &Program) {
65 IO.mapRequired("MajorVersion", Program.MajorVersion);
66 IO.mapRequired("MinorVersion", Program.MinorVersion);
67 IO.mapRequired("ShaderKind", Program.ShaderKind);
68 IO.mapOptional("Size", Program.Size);
69 IO.mapRequired("DXILMajorVersion", Program.DXILMajorVersion);
70 IO.mapRequired("DXILMinorVersion", Program.DXILMinorVersion);
71 IO.mapOptional("DXILSize", Program.DXILSize);
72 IO.mapOptional("DXIL", Program.DXIL);
73 }
74
mapping(IO & IO,DXContainerYAML::ShaderFlags & Flags)75 void MappingTraits<DXContainerYAML::ShaderFlags>::mapping(
76 IO &IO, DXContainerYAML::ShaderFlags &Flags) {
77 #define SHADER_FLAG(Num, Val, Str) IO.mapRequired(#Val, Flags.Val);
78 #include "llvm/BinaryFormat/DXContainerConstants.def"
79 }
80
mapping(IO & IO,DXContainerYAML::ShaderHash & Hash)81 void MappingTraits<DXContainerYAML::ShaderHash>::mapping(
82 IO &IO, DXContainerYAML::ShaderHash &Hash) {
83 IO.mapRequired("IncludesSource", Hash.IncludesSource);
84 IO.mapRequired("Digest", Hash.Digest);
85 }
86
mapping(IO & IO,DXContainerYAML::Part & P)87 void MappingTraits<DXContainerYAML::Part>::mapping(IO &IO,
88 DXContainerYAML::Part &P) {
89 IO.mapRequired("Name", P.Name);
90 IO.mapRequired("Size", P.Size);
91 IO.mapOptional("Program", P.Program);
92 IO.mapOptional("Flags", P.Flags);
93 IO.mapOptional("Hash", P.Hash);
94 }
95
mapping(IO & IO,DXContainerYAML::Object & Obj)96 void MappingTraits<DXContainerYAML::Object>::mapping(
97 IO &IO, DXContainerYAML::Object &Obj) {
98 IO.mapTag("!dxcontainer", true);
99 IO.mapRequired("Header", Obj.Header);
100 IO.mapRequired("Parts", Obj.Parts);
101 }
102
103 } // namespace yaml
104 } // namespace llvm
105