7
7
// ===----------------------------------------------------------------------===//
8
8
9
9
#include " DXILPostOptimizationValidation.h"
10
+ #include " DXILRootSignature.h"
10
11
#include " DXILShaderFlags.h"
11
12
#include " DirectX.h"
13
+ #include " llvm/ADT/STLForwardCompat.h"
12
14
#include " llvm/ADT/SmallString.h"
13
15
#include " llvm/Analysis/DXILMetadataAnalysis.h"
14
16
#include " llvm/Analysis/DXILResource.h"
17
+ #include " llvm/BinaryFormat/DXContainer.h"
15
18
#include " llvm/IR/DiagnosticInfo.h"
16
19
#include " llvm/IR/Instructions.h"
17
20
#include " llvm/IR/IntrinsicsDirectX.h"
@@ -85,7 +88,9 @@ static void reportOverlappingBinding(Module &M, DXILResourceMap &DRM) {
85
88
}
86
89
87
90
static void reportErrors (Module &M, DXILResourceMap &DRM,
88
- DXILResourceBindingInfo &DRBI) {
91
+ DXILResourceBindingInfo &DRBI,
92
+ RootSignatureBindingInfo &RSBI,
93
+ dxil::ModuleMetadataInfo &MMI) {
89
94
if (DRM.hasInvalidCounterDirection ())
90
95
reportInvalidDirection (M, DRM);
91
96
@@ -94,14 +99,41 @@ static void reportErrors(Module &M, DXILResourceMap &DRM,
94
99
95
100
assert (!DRBI.hasImplicitBinding () && " implicit bindings should be handled in "
96
101
" DXILResourceImplicitBinding pass" );
102
+ // Assuming this is used to validate only the root signature assigned to the
103
+ // entry function.
104
+ std::optional<mcdxbc::RootSignatureDesc> RootSigDesc =
105
+ RSBI.getDescForFunction (MMI.EntryPropertyVec [0 ].Entry );
106
+ if (!RootSigDesc)
107
+ return ;
108
+
109
+ for (const mcdxbc::RootParameterInfo &Info :
110
+ RootSigDesc->ParametersContainer ) {
111
+ const auto &[Type, Loc] =
112
+ RootSigDesc->ParametersContainer .getTypeAndLocForParameter (
113
+ Info.Location );
114
+ switch (Type) {
115
+ case llvm::to_underlying (dxbc::RootParameterType::CBV):
116
+ dxbc::RTS0::v2::RootDescriptor Desc =
117
+ RootSigDesc->ParametersContainer .getRootDescriptor (Loc);
118
+
119
+ llvm::dxil::ResourceInfo::ResourceBinding Binding;
120
+ Binding.LowerBound = Desc.ShaderRegister ;
121
+ Binding.Space = Desc.RegisterSpace ;
122
+ Binding.Size = 1 ;
123
+ break ;
124
+ }
125
+ }
97
126
}
98
127
} // namespace
99
128
100
129
PreservedAnalyses
101
130
DXILPostOptimizationValidation::run (Module &M, ModuleAnalysisManager &MAM) {
102
131
DXILResourceMap &DRM = MAM.getResult <DXILResourceAnalysis>(M);
103
132
DXILResourceBindingInfo &DRBI = MAM.getResult <DXILResourceBindingAnalysis>(M);
104
- reportErrors (M, DRM, DRBI);
133
+ RootSignatureBindingInfo &RSBI = MAM.getResult <RootSignatureAnalysis>(M);
134
+ ModuleMetadataInfo &MMI = MAM.getResult <DXILMetadataAnalysis>(M);
135
+
136
+ reportErrors (M, DRM, DRBI, RSBI, MMI);
105
137
return PreservedAnalyses::all ();
106
138
}
107
139
@@ -113,7 +145,13 @@ class DXILPostOptimizationValidationLegacy : public ModulePass {
113
145
getAnalysis<DXILResourceWrapperPass>().getResourceMap ();
114
146
DXILResourceBindingInfo &DRBI =
115
147
getAnalysis<DXILResourceBindingWrapperPass>().getBindingInfo ();
116
- reportErrors (M, DRM, DRBI);
148
+
149
+ RootSignatureBindingInfo &RSBI =
150
+ getAnalysis<RootSignatureAnalysisWrapper>().getRSInfo ();
151
+ dxil::ModuleMetadataInfo &MMI =
152
+ getAnalysis<DXILMetadataAnalysisWrapperPass>().getModuleMetadata ();
153
+
154
+ reportErrors (M, DRM, DRBI, RSBI, MMI);
117
155
return false ;
118
156
}
119
157
StringRef getPassName () const override {
@@ -125,10 +163,13 @@ class DXILPostOptimizationValidationLegacy : public ModulePass {
125
163
void getAnalysisUsage (llvm::AnalysisUsage &AU) const override {
126
164
AU.addRequired <DXILResourceWrapperPass>();
127
165
AU.addRequired <DXILResourceBindingWrapperPass>();
166
+ AU.addRequired <RootSignatureAnalysisWrapper>();
167
+ AU.addRequired <DXILMetadataAnalysisWrapperPass>();
128
168
AU.addPreserved <DXILResourceWrapperPass>();
129
169
AU.addPreserved <DXILResourceBindingWrapperPass>();
130
170
AU.addPreserved <DXILMetadataAnalysisWrapperPass>();
131
171
AU.addPreserved <ShaderFlagsAnalysisWrapper>();
172
+ AU.addPreserved <RootSignatureAnalysisWrapper>();
132
173
}
133
174
};
134
175
char DXILPostOptimizationValidationLegacy::ID = 0 ;
0 commit comments