Skip to content

Commit af6aa53

Browse files
Joao SaffranJoao Saffran
authored andcommitted
add tests
1 parent c95ce68 commit af6aa53

10 files changed

+87
-177
lines changed

llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -114,15 +114,18 @@ static void reportOverlappingBinding(Module &M, DXILResourceMap &DRM) {
114114
}
115115
}
116116

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) {
120120
SmallString<128> Message;
121121
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+
126129
M.getContext().diagnose(DiagnosticInfoGeneric(Message));
127130
}
128131

@@ -173,8 +176,7 @@ static void trackRootSigDescBinding(hlsl::BindingInfoBuilder &Builder,
173176
RSD.ParametersContainer.getConstant(Loc);
174177
Builder.trackBinding(dxil::ResourceClass::CBuffer, Const.RegisterSpace,
175178
Const.ShaderRegister,
176-
Const.ShaderRegister + Const.Num32BitValues,
177-
nullptr);
179+
Const.ShaderRegister + Const.Num32BitValues, &Const);
178180
break;
179181
}
180182

@@ -184,7 +186,7 @@ static void trackRootSigDescBinding(hlsl::BindingInfoBuilder &Builder,
184186
dxbc::RTS0::v2::RootDescriptor Desc =
185187
RSD.ParametersContainer.getRootDescriptor(Loc);
186188
Builder.trackBinding(ParameterToResourceClass(Type), Desc.RegisterSpace,
187-
Desc.ShaderRegister, Desc.ShaderRegister, nullptr);
189+
Desc.ShaderRegister, Desc.ShaderRegister, &Desc);
188190

189191
break;
190192
}
@@ -195,13 +197,21 @@ static void trackRootSigDescBinding(hlsl::BindingInfoBuilder &Builder,
195197
for (const dxbc::RTS0::v2::DescriptorRange &Range : Table.Ranges) {
196198
Builder.trackBinding(RangeToResourceClass(Range.RangeType),
197199
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);
200205
}
201206
break;
202207
}
203208
}
204209
}
210+
211+
for (auto &S : RSD.StaticSamplers) {
212+
Builder.trackBinding(dxil::ResourceClass::Sampler, S.RegisterSpace,
213+
S.ShaderRegister, S.ShaderRegister, &S);
214+
}
205215
}
206216

207217
std::optional<mcdxbc::RootSignatureDesc>
@@ -234,24 +244,13 @@ static void reportErrors(Module &M, DXILResourceMap &DRM,
234244
hlsl::BindingInfoBuilder Builder;
235245
dxbc::ShaderVisibility Visibility = tripleToVisibility(MMI.ShaderProfile);
236246
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+
});
255254
}
256255
}
257256
} // namespace
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
; RUN: not opt -S -passes='dxil-post-optimization-validation' -mtriple=dxil-pc-shadermodel6.6-compute %s 2>&1 | FileCheck %s
2+
; CHECK: error: register CBuffer (space=0, register=2) is overlapping with register CBuffer (space=0, register=0), verify your root signature definition.
3+
4+
define void @CSMain() "hlsl.shader"="compute" {
5+
entry:
6+
ret void
7+
}
8+
9+
; RootConstants(num32BitConstants=4, b2), DescriptorTable(CBV(b0, numDescriptors=3))
10+
!dx.rootsignatures = !{!0}
11+
!0 = !{ptr @CSMain, !1, i32 2}
12+
!1 = !{!2, !3}
13+
!2 = !{!"RootConstants", i32 0, i32 2, i32 0, i32 4}
14+
!3 = !{!"DescriptorTable", i32 0, !4}
15+
!4 = !{!"CBV", i32 3, i32 0, i32 0, i32 -1, i32 4}

llvm/test/CodeGen/DirectX/rootsignature-validation-fail-cbuffer.ll

Lines changed: 0 additions & 34 deletions
This file was deleted.

llvm/test/CodeGen/DirectX/rootsignature-validation-fail-constants.ll

Lines changed: 0 additions & 22 deletions
This file was deleted.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
; RUN: not opt -S -passes='dxil-post-optimization-validation' -mtriple=dxil-pc-shadermodel6.6-compute %s 2>&1 | FileCheck %s
2+
; CHECK: error: register UAV (space=10, register=4294967295) is overlapping with register UAV (space=10, register=4294967295), verify your root signature definition.
3+
define void @CSMain() "hlsl.shader"="compute" {
4+
entry:
5+
ret void
6+
}
7+
8+
; DescriptorTable(UAV(u0, numDescriptors=unbounded), visibility = SHADER_VISIBILITY_HULL), DescriptorTable(UAV(u2, numDescriptors=4))
9+
!dx.rootsignatures = !{!0}
10+
!0 = !{ptr @CSMain, !1, i32 2}
11+
!1 = !{!2, !4}
12+
!2 = !{!"DescriptorTable", i32 0, !3}
13+
!3 = !{!"UAV", i32 -1, i32 -1, i32 10, i32 -1, i32 2}
14+
!4 = !{!"DescriptorTable", i32 0, !5}
15+
!5 = !{ !"UAV", i32 -1, i32 -1, i32 10, i32 5, i32 2 }
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
; RUN: not opt -S -passes='dxil-post-optimization-validation' -mtriple=dxil-pc-shadermodel6.6-compute %s 2>&1 | FileCheck %s
2+
; CHECK: error: register UAV (space=1, register=3) is overlapping with register UAV (space=1, register=0), verify your root signature definition.
3+
4+
define void @CSMain() "hlsl.shader"="compute" {
5+
entry:
6+
ret void
7+
}
8+
9+
; DescriptorTable(UAV(u0, numDescriptors=unbounded), visibility = SHADER_VISIBILITY_HULL), UAV(u3, space=1)
10+
!dx.rootsignatures = !{!0}
11+
!0 = !{ptr @CSMain, !1, i32 2}
12+
!1 = !{!2, !4}
13+
!2 = !{!"RootUAV", i32 0, i32 3, i32 1, i32 4}
14+
!4 = !{!"DescriptorTable", i32 0, !5}
15+
!5 = !{!"UAV", i32 3, i32 0, i32 1, i32 -1, i32 2}

llvm/test/CodeGen/DirectX/rootsignature-validation-fail-sampler.ll

Lines changed: 0 additions & 31 deletions
This file was deleted.

llvm/test/CodeGen/DirectX/rootsignature-validation-fail-srv.ll

Lines changed: 0 additions & 30 deletions
This file was deleted.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
; RUN: not opt -S -passes='dxil-post-optimization-validation' -mtriple=dxil-pc-shadermodel6.6-compute %s 2>&1 | FileCheck %s
2+
; CHECK: error: register Sampler (space=0, register=42) is overlapping with register Sampler (space=0, register=42), verify your root signature definition.
3+
4+
define void @CSMain() "hlsl.shader"="compute" {
5+
entry:
6+
ret void
7+
}
8+
9+
!dx.rootsignatures = !{!0}
10+
!0 = !{ptr @CSMain, !1, i32 2}
11+
!1 = !{!2, !3}
12+
!2 = !{ !"StaticSampler", i32 5, i32 4, i32 5, i32 3, float 0x3FF7CCCCC0000000, i32 10, i32 2, i32 1, float -1.270000e+02, float 1.220000e+02, i32 42, i32 0, i32 0 }
13+
!3 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }

llvm/test/CodeGen/DirectX/rootsignature-validation-fail-uav.ll

Lines changed: 0 additions & 30 deletions
This file was deleted.

0 commit comments

Comments
 (0)