1//===- llvm/MC/DXContainerPSVInfo.h - DXContainer PSVInfo -*- 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#ifndef LLVM_MC_DXCONTAINERPSVINFO_H
10#define LLVM_MC_DXCONTAINERPSVINFO_H
11
12#include "llvm/ADT/ArrayRef.h"
13#include "llvm/ADT/SmallVector.h"
14#include "llvm/ADT/StringRef.h"
15#include "llvm/BinaryFormat/DXContainer.h"
16#include "llvm/MC/StringTableBuilder.h"
17#include "llvm/TargetParser/Triple.h"
18
19#include <array>
20#include <numeric>
21#include <stdint.h>
22
23namespace llvm {
24
25class raw_ostream;
26
27namespace mcdxbc {
28
29struct PSVSignatureElement {
30 StringRef Name;
31 SmallVector<uint32_t> Indices;
32 uint8_t StartRow;
33 uint8_t Cols;
34 uint8_t StartCol;
35 bool Allocated;
36 dxbc::PSV::SemanticKind Kind;
37 dxbc::PSV::ComponentType Type;
38 dxbc::PSV::InterpolationMode Mode;
39 uint8_t DynamicMask;
40 uint8_t Stream;
41};
42
43// This data structure is a helper for reading and writing PSV RuntimeInfo data.
44// It is implemented in the BinaryFormat library so that it can be used by both
45// the MC layer and Object tools.
46// This structure is used to represent the extracted data in an inspectable and
47// modifiable format, and can be used to serialize the data back into valid PSV
48// RuntimeInfo.
49struct PSVRuntimeInfo {
50 PSVRuntimeInfo() : DXConStrTabBuilder(StringTableBuilder::DXContainer) {}
51 bool IsFinalized = false;
52 dxbc::PSV::v3::RuntimeInfo BaseData;
53 SmallVector<dxbc::PSV::v2::ResourceBindInfo> Resources;
54 SmallVector<PSVSignatureElement> InputElements;
55 SmallVector<PSVSignatureElement> OutputElements;
56 SmallVector<PSVSignatureElement> PatchOrPrimElements;
57
58 // TODO: Make this interface user-friendly.
59 // The interface here is bad, and we'll want to change this in the future. We
60 // probably will want to build out these mask vectors as vectors of bools and
61 // have this utility object convert them to the bit masks. I don't want to
62 // over-engineer this API now since we don't know what the data coming in to
63 // feed it will look like, so I kept it extremely simple for the immediate use
64 // case.
65 std::array<SmallVector<uint32_t>, 4> OutputVectorMasks;
66 SmallVector<uint32_t> PatchOrPrimMasks;
67 std::array<SmallVector<uint32_t>, 4> InputOutputMap;
68 SmallVector<uint32_t> InputPatchMap;
69 SmallVector<uint32_t> PatchOutputMap;
70 llvm::StringRef EntryName;
71
72 // Serialize PSVInfo into the provided raw_ostream. The version field
73 // specifies the data version to encode, the default value specifies encoding
74 // the highest supported version.
75 void write(raw_ostream &OS,
76 uint32_t Version = std::numeric_limits<uint32_t>::max()) const;
77
78 void finalize(Triple::EnvironmentType Stage);
79
80private:
81 SmallVector<uint32_t, 64> IndexBuffer;
82 SmallVector<llvm::dxbc::PSV::v0::SignatureElement, 32> SignatureElements;
83 StringTableBuilder DXConStrTabBuilder;
84};
85
86class Signature {
87 struct Parameter {
88 uint32_t Stream;
89 StringRef Name;
90 uint32_t Index;
91 dxbc::D3DSystemValue SystemValue;
92 dxbc::SigComponentType CompType;
93 uint32_t Register;
94 uint8_t Mask;
95 uint8_t ExclusiveMask;
96 dxbc::SigMinPrecision MinPrecision;
97 };
98
99 SmallVector<Parameter> Params;
100
101public:
102 void addParam(uint32_t Stream, StringRef Name, uint32_t Index,
103 dxbc::D3DSystemValue SystemValue,
104 dxbc::SigComponentType CompType, uint32_t Register,
105 uint8_t Mask, uint8_t ExclusiveMask,
106 dxbc::SigMinPrecision MinPrecision) {
107 Params.push_back(Elt: Parameter{.Stream: Stream, .Name: Name, .Index: Index, .SystemValue: SystemValue, .CompType: CompType,
108 .Register: Register, .Mask: Mask, .ExclusiveMask: ExclusiveMask, .MinPrecision: MinPrecision});
109 }
110
111 void write(raw_ostream &OS);
112};
113
114} // namespace mcdxbc
115} // namespace llvm
116
117#endif // LLVM_MC_DXCONTAINERPSVINFO_H
118

source code of llvm/include/llvm/MC/DXContainerPSVInfo.h