[llvm] [DirectX] Add Range Overlap validation (PR #152229)
Finn Plummer via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 6 08:42:47 PDT 2025
================
@@ -84,8 +114,122 @@ static void reportOverlappingBinding(Module &M, DXILResourceMap &DRM) {
}
}
+static void reportOverlappingRegisters(
+ Module &M, const llvm::hlsl::BindingInfoBuilder::Binding &Reported,
+ const llvm::hlsl::BindingInfoBuilder::Binding &Overlaping) {
+ SmallString<128> Message;
+ raw_svector_ostream OS(Message);
+ OS << "register " << getResourceClassName(Reported.RC)
+ << " (space=" << Reported.Space << ", register=" << Reported.LowerBound
+ << ")" << " is overlapping with" << " register "
+ << getResourceClassName(Overlaping.RC) << " (space=" << Overlaping.Space
+ << ", register=" << Overlaping.LowerBound << ")"
+ << ", verify your root signature definition.";
+
+ M.getContext().diagnose(DiagnosticInfoGeneric(Message));
+}
+
+static dxbc::ShaderVisibility
+tripleToVisibility(llvm::Triple::EnvironmentType ET) {
+ assert((ET == Triple::Pixel || ET == Triple::Vertex ||
+ ET == Triple::Geometry || ET == Triple::Hull ||
+ ET == Triple::Domain || ET == Triple::Mesh ||
+ ET == Triple::Compute) &&
+ "Invalid Triple to shader stage conversion");
+
+ switch (ET) {
+ case Triple::Pixel:
+ return dxbc::ShaderVisibility::Pixel;
+ case Triple::Vertex:
+ return dxbc::ShaderVisibility::Vertex;
+ case Triple::Geometry:
+ return dxbc::ShaderVisibility::Geometry;
+ case Triple::Hull:
+ return dxbc::ShaderVisibility::Hull;
+ case Triple::Domain:
+ return dxbc::ShaderVisibility::Domain;
+ case Triple::Mesh:
+ return dxbc::ShaderVisibility::Mesh;
+ case Triple::Compute:
+ return dxbc::ShaderVisibility::All;
+ default:
+ llvm_unreachable("Invalid triple to shader stage conversion");
+ }
+}
+
+static void trackRootSigDescBinding(hlsl::BindingInfoBuilder &Builder,
+ const mcdxbc::RootSignatureDesc &RSD,
+ dxbc::ShaderVisibility Visibility) {
+ for (size_t I = 0; I < RSD.ParametersContainer.size(); I++) {
+ const auto &[Type, Loc] =
+ RSD.ParametersContainer.getTypeAndLocForParameter(I);
+
+ const auto &Header = RSD.ParametersContainer.getHeader(I);
+ if (Header.ShaderVisibility !=
+ llvm::to_underlying(dxbc::ShaderVisibility::All) &&
+ Header.ShaderVisibility != llvm::to_underlying(Visibility))
+ continue;
+
+ switch (Type) {
+ case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): {
+ dxbc::RTS0::v1::RootConstants Const =
+ RSD.ParametersContainer.getConstant(Loc);
+ Builder.trackBinding(dxil::ResourceClass::CBuffer, Const.RegisterSpace,
+ Const.ShaderRegister,
+ Const.ShaderRegister + Const.Num32BitValues, &Const);
+ break;
+ }
+
+ case llvm::to_underlying(dxbc::RootParameterType::SRV):
+ case llvm::to_underlying(dxbc::RootParameterType::UAV):
+ case llvm::to_underlying(dxbc::RootParameterType::CBV): {
+ dxbc::RTS0::v2::RootDescriptor Desc =
+ RSD.ParametersContainer.getRootDescriptor(Loc);
+ Builder.trackBinding(ParameterToResourceClass(Type), Desc.RegisterSpace,
+ Desc.ShaderRegister, Desc.ShaderRegister, &Desc);
+
+ break;
+ }
+ case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): {
+ const mcdxbc::DescriptorTable &Table =
+ RSD.ParametersContainer.getDescriptorTable(Loc);
+
+ for (const dxbc::RTS0::v2::DescriptorRange &Range : Table.Ranges) {
+ Builder.trackBinding(RangeToResourceClass(Range.RangeType),
+ Range.RegisterSpace, Range.BaseShaderRegister,
+ Range.NumDescriptors == ~0U
+ ? Range.NumDescriptors
+ : Range.BaseShaderRegister +
+ Range.NumDescriptors,
+ &Range);
+ }
+ break;
+ }
+ }
+ }
+
+ for (auto &S : RSD.StaticSamplers) {
+ Builder.trackBinding(dxil::ResourceClass::Sampler, S.RegisterSpace,
+ S.ShaderRegister, S.ShaderRegister, &S);
+ }
----------------
inbelic wrote:
nit:
```suggestion
for (auto &S : RSD.StaticSamplers)
Builder.trackBinding(dxil::ResourceClass::Sampler, S.RegisterSpace,
S.ShaderRegister, S.ShaderRegister, &S);
```
https://github.com/llvm/llvm-project/pull/152229
More information about the llvm-commits
mailing list