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;
PartPart76 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
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::Part)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