1 //===- DXContainerYAML.h - DXContainer YAMLIO implementation ----*- C++ -*-===//
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 /// \file
10 /// This file declares classes for handling the YAML representation
11 /// of DXContainer.
12 ///
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_OBJECTYAML_DXCONTAINERYAML_H
16 #define LLVM_OBJECTYAML_DXCONTAINERYAML_H
17 
18 #include "llvm/ADT/StringRef.h"
19 #include "llvm/BinaryFormat/DXContainer.h"
20 #include "llvm/ObjectYAML/YAML.h"
21 #include "llvm/Support/YAMLTraits.h"
22 #include <cstdint>
23 #include <optional>
24 #include <string>
25 #include <vector>
26 
27 namespace llvm {
28 namespace DXContainerYAML {
29 
30 struct VersionTuple {
31   uint16_t Major;
32   uint16_t Minor;
33 };
34 
35 // The optional header fields are required in the binary and will be populated
36 // when reading from binary, but can be omitted in the YAML text because the
37 // emitter can calculate them.
38 struct FileHeader {
39   std::vector<llvm::yaml::Hex8> Hash;
40   VersionTuple Version;
41   std::optional<uint32_t> FileSize;
42   uint32_t PartCount;
43   std::optional<std::vector<uint32_t>> PartOffsets;
44 };
45 
46 struct DXILProgram {
47   uint8_t MajorVersion;
48   uint8_t MinorVersion;
49   uint16_t ShaderKind;
50   std::optional<uint32_t> Size;
51   uint16_t DXILMajorVersion;
52   uint16_t DXILMinorVersion;
53   std::optional<uint32_t> DXILOffset;
54   std::optional<uint32_t> DXILSize;
55   std::optional<std::vector<llvm::yaml::Hex8>> DXIL;
56 };
57 
58 #define SHADER_FLAG(Num, Val, Str) bool Val = false;
59 struct ShaderFlags {
60   ShaderFlags() = default;
61   ShaderFlags(uint64_t FlagData);
62   uint64_t getEncodedFlags();
63 #include "llvm/BinaryFormat/DXContainerConstants.def"
64 };
65 
66 struct ShaderHash {
67   ShaderHash() = default;
68   ShaderHash(const dxbc::ShaderHash &Data);
69 
70   bool IncludesSource;
71   std::vector<llvm::yaml::Hex8> Digest;
72 };
73 
74 struct Part {
75   Part() = default;
76   Part(std::string N, uint32_t S) : Name(N), Size(S) {}
77   std::string Name;
78   uint32_t Size;
79   std::optional<DXILProgram> Program;
80   std::optional<ShaderFlags> Flags;
81   std::optional<ShaderHash> Hash;
82 };
83 
84 struct Object {
85   FileHeader Header;
86   std::vector<Part> Parts;
87 };
88 
89 } // namespace DXContainerYAML
90 } // namespace llvm
91 
92 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::Part)
93 namespace llvm {
94 
95 class raw_ostream;
96 
97 namespace yaml {
98 
99 template <> struct MappingTraits<DXContainerYAML::VersionTuple> {
100   static void mapping(IO &IO, DXContainerYAML::VersionTuple &Version);
101 };
102 
103 template <> struct MappingTraits<DXContainerYAML::FileHeader> {
104   static void mapping(IO &IO, DXContainerYAML::FileHeader &Header);
105 };
106 
107 template <> struct MappingTraits<DXContainerYAML::DXILProgram> {
108   static void mapping(IO &IO, DXContainerYAML::DXILProgram &Program);
109 };
110 
111 template <> struct MappingTraits<DXContainerYAML::ShaderFlags> {
112   static void mapping(IO &IO, DXContainerYAML::ShaderFlags &Flags);
113 };
114 
115 template <> struct MappingTraits<DXContainerYAML::ShaderHash> {
116   static void mapping(IO &IO, DXContainerYAML::ShaderHash &Hash);
117 };
118 
119 template <> struct MappingTraits<DXContainerYAML::Part> {
120   static void mapping(IO &IO, DXContainerYAML::Part &Version);
121 };
122 
123 template <> struct MappingTraits<DXContainerYAML::Object> {
124   static void mapping(IO &IO, DXContainerYAML::Object &Obj);
125 };
126 
127 } // namespace yaml
128 
129 } // namespace llvm
130 
131 #endif // LLVM_OBJECTYAML_DXCONTAINERYAML_H
132