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 | |
23 | namespace llvm { |
24 | |
25 | class raw_ostream; |
26 | |
27 | namespace mcdxbc { |
28 | |
29 | struct 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. |
49 | struct 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 | |
80 | private: |
81 | SmallVector<uint32_t, 64> IndexBuffer; |
82 | SmallVector<llvm::dxbc::PSV::v0::SignatureElement, 32> SignatureElements; |
83 | StringTableBuilder DXConStrTabBuilder; |
84 | }; |
85 | |
86 | class 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 | |
101 | public: |
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 | |