LLVM 20.0.0git
DXContainerYAML.h
Go to the documentation of this file.
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"
22#include <array>
23#include <cstdint>
24#include <optional>
25#include <string>
26#include <vector>
27
28namespace llvm {
29namespace DXContainerYAML {
30
34};
35
36// The optional header fields are required in the binary and will be populated
37// when reading from binary, but can be omitted in the YAML text because the
38// emitter can calculate them.
39struct FileHeader {
40 std::vector<llvm::yaml::Hex8> Hash;
42 std::optional<uint32_t> FileSize;
44 std::optional<std::vector<uint32_t>> PartOffsets;
45};
46
51 std::optional<uint32_t> Size;
54 std::optional<uint32_t> DXILOffset;
55 std::optional<uint32_t> DXILSize;
56 std::optional<std::vector<llvm::yaml::Hex8>> DXIL;
57};
58
59#define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str) bool Val = false;
61 ShaderFeatureFlags() = default;
64#include "llvm/BinaryFormat/DXContainerConstants.def"
65};
66
67struct ShaderHash {
68 ShaderHash() = default;
70
72 std::vector<llvm::yaml::Hex8> Digest;
73};
74
77
79 SignatureElement() = default;
80
82 ArrayRef<uint32_t> IdxTable)
83 : Name(StringTable.substr(El.NameOffset,
84 StringTable.find('\0', El.NameOffset) -
85 El.NameOffset)),
86 Indices(IdxTable.slice(El.IndicesOffset, El.Rows)),
88 Allocated(El.Allocated != 0), Kind(El.Kind), Type(El.Type),
92
98
101 llvm::yaml::Hex8 DynamicMask;
103};
104
105struct PSVInfo {
106 // The version field isn't actually encoded in the file, but it is inferred by
107 // the size of data regions. We include it in the yaml because it simplifies
108 // the format.
110
117
119 std::array<MaskVector, 4> OutputVectorMasks;
121 std::array<MaskVector, 4> InputOutputMap;
124
126
127 void mapInfoForVersion(yaml::IO &IO);
128
129 PSVInfo();
134};
135
138 std::string Name;
146};
147
148struct Signature {
150};
151
152struct Part {
153 Part() = default;
154 Part(std::string N, uint32_t S) : Name(N), Size(S) {}
155 std::string Name;
157 std::optional<DXILProgram> Program;
158 std::optional<ShaderFeatureFlags> Flags;
159 std::optional<ShaderHash> Hash;
160 std::optional<PSVInfo> Info;
161 std::optional<DXContainerYAML::Signature> Signature;
162};
163
164struct Object {
166 std::vector<Part> Parts;
167};
168
169} // namespace DXContainerYAML
170} // namespace llvm
171
185
186namespace llvm {
187
188class raw_ostream;
189
190namespace yaml {
191
192template <> struct MappingTraits<DXContainerYAML::VersionTuple> {
193 static void mapping(IO &IO, DXContainerYAML::VersionTuple &Version);
194};
195
196template <> struct MappingTraits<DXContainerYAML::FileHeader> {
197 static void mapping(IO &IO, DXContainerYAML::FileHeader &Header);
198};
199
200template <> struct MappingTraits<DXContainerYAML::DXILProgram> {
201 static void mapping(IO &IO, DXContainerYAML::DXILProgram &Program);
202};
203
204template <> struct MappingTraits<DXContainerYAML::ShaderFeatureFlags> {
205 static void mapping(IO &IO, DXContainerYAML::ShaderFeatureFlags &Flags);
206};
207
208template <> struct MappingTraits<DXContainerYAML::ShaderHash> {
209 static void mapping(IO &IO, DXContainerYAML::ShaderHash &Hash);
210};
211
212template <> struct MappingTraits<DXContainerYAML::PSVInfo> {
213 static void mapping(IO &IO, DXContainerYAML::PSVInfo &PSV);
214};
215
216template <> struct MappingTraits<DXContainerYAML::Part> {
217 static void mapping(IO &IO, DXContainerYAML::Part &Version);
218};
219
220template <> struct MappingTraits<DXContainerYAML::Object> {
221 static void mapping(IO &IO, DXContainerYAML::Object &Obj);
222};
223
224template <> struct MappingTraits<DXContainerYAML::ResourceFlags> {
225 static void mapping(IO &IO, DXContainerYAML::ResourceFlags &Flags);
226};
227
228template <> struct MappingTraits<DXContainerYAML::ResourceBindInfo> {
229 static void mapping(IO &IO, DXContainerYAML::ResourceBindInfo &Res);
230};
231
232template <> struct MappingTraits<DXContainerYAML::SignatureElement> {
233 static void mapping(IO &IO, llvm::DXContainerYAML::SignatureElement &El);
234};
235
236template <> struct MappingTraits<DXContainerYAML::SignatureParameter> {
237 static void mapping(IO &IO, llvm::DXContainerYAML::SignatureParameter &El);
238};
239
240template <> struct MappingTraits<DXContainerYAML::Signature> {
241 static void mapping(IO &IO, llvm::DXContainerYAML::Signature &El);
242};
243
244} // namespace yaml
245
246} // namespace llvm
247
248#endif // LLVM_OBJECTYAML_DXCONTAINERYAML_H
#define P(N)
static StringRef substr(StringRef Str, uint64_t Len)
#define LLVM_YAML_IS_SEQUENCE_VECTOR(type)
#define LLVM_YAML_DECLARE_ENUM_TRAITS(Type)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1196
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
A table of densely packed, null-terminated strings indexed by offset.
Definition: StringTable.h:31
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
Represents a version number in the form major[.minor[.subminor[.build]]].
Definition: VersionTuple.h:29
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
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:1759
#define N
std::optional< uint32_t > DXILOffset
std::optional< uint32_t > Size
std::optional< std::vector< llvm::yaml::Hex8 > > DXIL
std::optional< uint32_t > DXILSize
std::vector< llvm::yaml::Hex8 > Hash
std::optional< uint32_t > FileSize
std::optional< std::vector< uint32_t > > PartOffsets
std::array< MaskVector, 4 > InputOutputMap
SmallVector< SignatureElement > SigOutputElements
SmallVector< SignatureElement > SigPatchOrPrimElements
SmallVector< ResourceBindInfo > Resources
SmallVector< SignatureElement > SigInputElements
void mapInfoForVersion(yaml::IO &IO)
dxbc::PSV::v3::RuntimeInfo Info
std::array< MaskVector, 4 > OutputVectorMasks
std::optional< PSVInfo > Info
std::optional< DXILProgram > Program
std::optional< DXContainerYAML::Signature > Signature
std::optional< ShaderHash > Hash
std::optional< ShaderFeatureFlags > Flags
Part(std::string N, uint32_t S)
std::vector< llvm::yaml::Hex8 > Digest
SignatureElement(dxbc::PSV::v0::SignatureElement El, StringRef StringTable, ArrayRef< uint32_t > IdxTable)
dxbc::PSV::InterpolationMode Mode
llvm::SmallVector< SignatureParameter > Parameters