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