@@ -114,15 +114,18 @@ static void reportOverlappingBinding(Module &M, DXILResourceMap &DRM) {
114
114
}
115
115
}
116
116
117
- static void
118
- reportRegNotBound ( Module &M, ResourceClass Class ,
119
- llvm::dxil::ResourceInfo::ResourceBinding Unbound ) {
117
+ static void reportOverlappingRegisters (
118
+ Module &M, const llvm::hlsl::BindingInfoBuilder::Binding &Reported ,
119
+ const llvm::hlsl::BindingInfoBuilder::Binding &Overlaping ) {
120
120
SmallString<128 > Message;
121
121
raw_svector_ostream OS (Message);
122
- OS << " register " << getResourceClassName (Class)
123
- << " (space=" << Unbound.Space << " , register=" << Unbound.LowerBound
124
- << " )"
125
- << " does not have a binding in the Root Signature" ;
122
+ OS << " register " << getResourceClassName (Reported.RC )
123
+ << " (space=" << Reported.Space << " , register=" << Reported.LowerBound
124
+ << " )" << " is overlapping with" << " register "
125
+ << getResourceClassName (Overlaping.RC ) << " (space=" << Overlaping.Space
126
+ << " , register=" << Overlaping.LowerBound << " )"
127
+ << " , verify your root signature definition." ;
128
+
126
129
M.getContext ().diagnose (DiagnosticInfoGeneric (Message));
127
130
}
128
131
@@ -173,8 +176,7 @@ static void trackRootSigDescBinding(hlsl::BindingInfoBuilder &Builder,
173
176
RSD.ParametersContainer .getConstant (Loc);
174
177
Builder.trackBinding (dxil::ResourceClass::CBuffer, Const.RegisterSpace ,
175
178
Const.ShaderRegister ,
176
- Const.ShaderRegister + Const.Num32BitValues ,
177
- nullptr );
179
+ Const.ShaderRegister + Const.Num32BitValues , &Const);
178
180
break ;
179
181
}
180
182
@@ -184,7 +186,7 @@ static void trackRootSigDescBinding(hlsl::BindingInfoBuilder &Builder,
184
186
dxbc::RTS0::v2::RootDescriptor Desc =
185
187
RSD.ParametersContainer .getRootDescriptor (Loc);
186
188
Builder.trackBinding (ParameterToResourceClass (Type), Desc.RegisterSpace ,
187
- Desc.ShaderRegister , Desc.ShaderRegister , nullptr );
189
+ Desc.ShaderRegister , Desc.ShaderRegister , &Desc );
188
190
189
191
break ;
190
192
}
@@ -195,13 +197,21 @@ static void trackRootSigDescBinding(hlsl::BindingInfoBuilder &Builder,
195
197
for (const dxbc::RTS0::v2::DescriptorRange &Range : Table.Ranges ) {
196
198
Builder.trackBinding (RangeToResourceClass (Range.RangeType ),
197
199
Range.RegisterSpace , Range.BaseShaderRegister ,
198
- Range.BaseShaderRegister + Range.NumDescriptors ,
199
- nullptr );
200
+ Range.NumDescriptors == ~0U
201
+ ? Range.NumDescriptors
202
+ : Range.BaseShaderRegister +
203
+ Range.NumDescriptors ,
204
+ &Range);
200
205
}
201
206
break ;
202
207
}
203
208
}
204
209
}
210
+
211
+ for (auto &S : RSD.StaticSamplers ) {
212
+ Builder.trackBinding (dxil::ResourceClass::Sampler, S.RegisterSpace ,
213
+ S.ShaderRegister , S.ShaderRegister , &S);
214
+ }
205
215
}
206
216
207
217
std::optional<mcdxbc::RootSignatureDesc>
@@ -234,24 +244,13 @@ static void reportErrors(Module &M, DXILResourceMap &DRM,
234
244
hlsl::BindingInfoBuilder Builder;
235
245
dxbc::ShaderVisibility Visibility = tripleToVisibility (MMI.ShaderProfile );
236
246
trackRootSigDescBinding (Builder, *RSD, Visibility);
237
-
238
- bool HasOverlap;
239
- hlsl::BindingInfo Info = Builder.calculateBindingInfo (HasOverlap);
240
-
241
- for (const auto &ResList :
242
- {std::make_pair (ResourceClass::SRV, DRM.srvs ()),
243
- std::make_pair (ResourceClass::UAV, DRM.uavs ()),
244
- std::make_pair (ResourceClass::CBuffer, DRM.cbuffers ()),
245
- std::make_pair (ResourceClass::Sampler, DRM.samplers ())}) {
246
- for (auto Res : ResList.second ) {
247
- llvm::dxil::ResourceInfo::ResourceBinding ResBinding = Res.getBinding ();
248
- llvm::hlsl::BindingInfo::BindingRange ResRange (
249
- ResBinding.LowerBound , ResBinding.LowerBound + ResBinding.Size );
250
-
251
- if (!Info.isBound (ResList.first , ResBinding.Space , ResRange))
252
- reportRegNotBound (M, ResList.first , ResBinding);
253
- }
254
- }
247
+ hlsl::BindingInfo Info = Builder.calculateBindingInfo (
248
+ [&M](const llvm::hlsl::BindingInfoBuilder &Builder,
249
+ const llvm::hlsl::BindingInfoBuilder::Binding &ReportedBinding) {
250
+ const llvm::hlsl::BindingInfoBuilder::Binding &Overlaping =
251
+ Builder.findOverlapping (ReportedBinding);
252
+ reportOverlappingRegisters (M, ReportedBinding, Overlaping);
253
+ });
255
254
}
256
255
}
257
256
} // namespace
0 commit comments