[llvm] [DirectX] Add Range Overlap validation (PR #152229)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 8 11:03:11 PDT 2025
================
@@ -157,73 +152,80 @@ tripleToVisibility(llvm::Triple::EnvironmentType ET) {
}
}
-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;
+static void validateRootSignature(Module &M,
+ const mcdxbc::RootSignatureDesc &RSD,
+ dxil::ModuleMetadataInfo &MMI) {
- switch (Type) {
- case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): {
+ hlsl::BindingInfoBuilder Builder;
+ dxbc::ShaderVisibility Visibility = tripleToVisibility(MMI.ShaderProfile);
+
+ for (const mcdxbc::RootParameterInfo &ParamInfo : RSD.ParametersContainer) {
+ dxbc::ShaderVisibility ParamVisibility =
+ static_cast<dxbc::ShaderVisibility>(ParamInfo.Header.ShaderVisibility);
+ if (ParamVisibility != dxbc::ShaderVisibility::All &&
+ ParamVisibility != Visibility)
+ continue;
+ dxbc::RootParameterType ParamType =
+ static_cast<dxbc::RootParameterType>(ParamInfo.Header.ParameterType);
+ switch (ParamType) {
+ case dxbc::RootParameterType::Constants32Bit: {
dxbc::RTS0::v1::RootConstants Const =
- RSD.ParametersContainer.getConstant(Loc);
+ RSD.ParametersContainer.getConstant(ParamInfo.Location);
Builder.trackBinding(dxil::ResourceClass::CBuffer, Const.RegisterSpace,
- Const.ShaderRegister,
- Const.ShaderRegister + Const.Num32BitValues, &Const);
+ Const.ShaderRegister, Const.ShaderRegister, nullptr);
break;
}
- case llvm::to_underlying(dxbc::RootParameterType::SRV):
- case llvm::to_underlying(dxbc::RootParameterType::UAV):
- case llvm::to_underlying(dxbc::RootParameterType::CBV): {
+ case dxbc::RootParameterType::SRV:
+ case dxbc::RootParameterType::UAV:
+ case dxbc::RootParameterType::CBV: {
dxbc::RTS0::v2::RootDescriptor Desc =
- RSD.ParametersContainer.getRootDescriptor(Loc);
- Builder.trackBinding(ParameterToResourceClass(Type), Desc.RegisterSpace,
- Desc.ShaderRegister, Desc.ShaderRegister, &Desc);
+ RSD.ParametersContainer.getRootDescriptor(ParamInfo.Location);
+ Builder.trackBinding(toResourceClass(static_cast<dxbc::RootParameterType>(
+ ParamInfo.Header.ParameterType)),
+ Desc.RegisterSpace, Desc.ShaderRegister,
+ Desc.ShaderRegister, nullptr);
break;
}
- case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): {
+ case dxbc::RootParameterType::DescriptorTable: {
const mcdxbc::DescriptorTable &Table =
- RSD.ParametersContainer.getDescriptorTable(Loc);
+ RSD.ParametersContainer.getDescriptorTable(ParamInfo.Location);
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);
+ uint32_t UpperBound =
+ Range.NumDescriptors == ~0U
+ ? Range.BaseShaderRegister
+ : Range.BaseShaderRegister + Range.NumDescriptors - 1;
+ Builder.trackBinding(
+ toResourceClass(
+ static_cast<dxbc::DescriptorRangeType>(Range.RangeType)),
+ Range.RegisterSpace, Range.BaseShaderRegister, UpperBound, nullptr);
}
break;
}
}
}
- for (auto &S : RSD.StaticSamplers) {
+ for (const dxbc::RTS0::v1::StaticSampler &S : RSD.StaticSamplers)
Builder.trackBinding(dxil::ResourceClass::Sampler, S.RegisterSpace,
- S.ShaderRegister, S.ShaderRegister, &S);
- }
+ S.ShaderRegister, S.ShaderRegister, nullptr);
----------------
joaosaffran wrote:
Using `nullptr` is wrong actually, we need a cookie here, so I've added a new solution for this.
https://github.com/llvm/llvm-project/pull/152229
More information about the llvm-commits
mailing list