Skip to content

Commit 6db6224

Browse files
author
joaosaffran
committed
update code
1 parent 9ee3a4b commit 6db6224

File tree

5 files changed

+69
-113
lines changed

5 files changed

+69
-113
lines changed

llvm/include/llvm/Frontend/HLSL/HLSLBinding.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "llvm/ADT/SmallVector.h"
1818
#include "llvm/Support/DXILABI.h"
1919
#include "llvm/Support/ErrorHandling.h"
20+
#include <cstdint>
2021

2122
namespace llvm {
2223
namespace hlsl {
@@ -57,6 +58,7 @@ class BindingInfo {
5758
}
5859
// Size == -1 means unbounded array
5960
LLVM_ABI std::optional<uint32_t> findAvailableBinding(int32_t Size);
61+
LLVM_ABI bool isBound(BindingRange B);
6062
};
6163

6264
struct BindingSpaces {
@@ -95,6 +97,8 @@ class BindingInfo {
9597
LLVM_ABI std::optional<uint32_t>
9698
findAvailableBinding(dxil::ResourceClass RC, uint32_t Space, int32_t Size);
9799

100+
LLVM_ABI bool isBound(dxil::ResourceClass RC, uint32_t Space, BindingRange B);
101+
98102
friend class BindingInfoBuilder;
99103
};
100104

llvm/include/llvm/Frontend/HLSL/RootSignatureValidations.h

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -148,51 +148,6 @@ struct OverlappingRanges {
148148
/// B: Check for overlap with any overlapping Visibility ResourceRange
149149
LLVM_ABI llvm::SmallVector<OverlappingRanges>
150150
findOverlappingRanges(ArrayRef<RangeInfo> Infos);
151-
152-
class RootSignatureBindingValidation {
153-
private:
154-
llvm::SmallVector<RangeInfo, 16> Bindings;
155-
struct TypeRange {
156-
uint32_t Start;
157-
uint32_t End;
158-
};
159-
std::unordered_map<dxil::ResourceClass, TypeRange> Ranges;
160-
161-
public:
162-
void addBinding(dxil::ResourceClass Type, const RangeInfo &Binding) {
163-
auto It = Ranges.find(Type);
164-
165-
if (It == Ranges.end()) {
166-
uint32_t InsertPos = Bindings.size();
167-
Bindings.push_back(Binding);
168-
Ranges[Type] = {InsertPos, InsertPos + 1};
169-
return;
170-
}
171-
uint32_t InsertPos = It->second.End;
172-
Bindings.insert(Bindings.begin() + InsertPos, Binding);
173-
174-
It->second.End++;
175-
176-
for (auto &[Type, Range] : Ranges) {
177-
if (Range.Start > InsertPos) {
178-
Range.Start++;
179-
Range.End++;
180-
}
181-
}
182-
}
183-
184-
llvm::ArrayRef<RangeInfo>
185-
getBindingsOfType(const dxil::ResourceClass &Type) const {
186-
auto It = Ranges.find(Type);
187-
if (It == Ranges.end())
188-
return {};
189-
return llvm::ArrayRef<RangeInfo>(Bindings.data() + It->second.Start,
190-
It->second.End - It->second.Start);
191-
}
192-
};
193-
llvm::SmallVector<RangeInfo>
194-
findUnboundRanges(const llvm::ArrayRef<RangeInfo> &Ranges,
195-
const llvm::ArrayRef<RangeInfo> &Bindings);
196151
} // namespace rootsig
197152
} // namespace hlsl
198153
} // namespace llvm

llvm/lib/Frontend/HLSL/HLSLBinding.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include "llvm/Frontend/HLSL/HLSLBinding.h"
1010
#include "llvm/ADT/STLExtras.h"
11+
#include <cstdint>
1112

1213
using namespace llvm;
1314
using namespace hlsl;
@@ -66,6 +67,22 @@ BindingInfo::RegisterSpace::findAvailableBinding(int32_t Size) {
6667
return std::nullopt;
6768
}
6869

70+
bool BindingInfo::RegisterSpace::isBound(BindingRange B) {
71+
for (BindingRange &R : FreeRanges) {
72+
if (B.LowerBound >= R.LowerBound && B.LowerBound < R.UpperBound &&
73+
B.UpperBound > R.LowerBound && B.UpperBound <= R.UpperBound)
74+
return false;
75+
}
76+
return true;
77+
}
78+
79+
bool BindingInfo::isBound(dxil::ResourceClass RC, uint32_t Space,
80+
BindingRange B) {
81+
BindingSpaces &BS = getBindingSpaces(RC);
82+
RegisterSpace &RS = BS.getOrInsertSpace(Space);
83+
return RS.isBound(B);
84+
}
85+
6986
BindingInfo BindingInfoBuilder::calculateBindingInfo(
7087
llvm::function_ref<void(const BindingInfoBuilder &Builder,
7188
const Binding &Overlapping)>

llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp

Lines changed: 44 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,16 @@
1414
#include "llvm/ADT/StringRef.h"
1515
#include "llvm/Analysis/DXILMetadataAnalysis.h"
1616
#include "llvm/Analysis/DXILResource.h"
17+
#include "llvm/BinaryFormat/DXContainer.h"
18+
#include "llvm/Frontend/HLSL/HLSLBinding.h"
1719
#include "llvm/Frontend/HLSL/RootSignatureValidations.h"
1820
#include "llvm/IR/DiagnosticInfo.h"
1921
#include "llvm/IR/Instructions.h"
2022
#include "llvm/IR/IntrinsicsDirectX.h"
2123
#include "llvm/IR/Module.h"
2224
#include "llvm/InitializePasses.h"
25+
#include "llvm/Support/DXILABI.h"
26+
#include <utility>
2327

2428
#define DEBUG_TYPE "dxil-post-optimization-validation"
2529

@@ -116,11 +120,12 @@ static void reportOverlappingBinding(Module &M, DXILResourceMap &DRM) {
116120
}
117121
}
118122

119-
static void reportRegNotBound(Module &M,
120-
llvm::hlsl::rootsig::RangeInfo Unbound) {
123+
static void
124+
reportRegNotBound(Module &M, ResourceClass Class,
125+
llvm::dxil::ResourceInfo::ResourceBinding Unbound) {
121126
SmallString<128> Message;
122127
raw_svector_ostream OS(Message);
123-
OS << "register " << getResourceClassName(Unbound.Class)
128+
OS << "register " << getResourceClassName(Class)
124129
<< " (space=" << Unbound.Space << ", register=" << Unbound.LowerBound
125130
<< ")"
126131
<< " does not have a binding in the Root Signature";
@@ -155,12 +160,9 @@ tripleToVisibility(llvm::Triple::EnvironmentType ET) {
155160
}
156161
}
157162

158-
static hlsl::rootsig::RootSignatureBindingValidation
159-
initRSBindingValidation(const mcdxbc::RootSignatureDesc &RSD,
160-
dxbc::ShaderVisibility Visibility) {
161-
162-
hlsl::rootsig::RootSignatureBindingValidation Validation;
163-
163+
static void trackRootSigDescBinding(hlsl::BindingInfoBuilder &Builder,
164+
const mcdxbc::RootSignatureDesc &RSD,
165+
dxbc::ShaderVisibility Visibility) {
164166
for (size_t I = 0; I < RSD.ParametersContainer.size(); I++) {
165167
const auto &[Type, Loc] =
166168
RSD.ParametersContainer.getTypeAndLocForParameter(I);
@@ -175,15 +177,10 @@ initRSBindingValidation(const mcdxbc::RootSignatureDesc &RSD,
175177
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): {
176178
dxbc::RTS0::v1::RootConstants Const =
177179
RSD.ParametersContainer.getConstant(Loc);
178-
179-
hlsl::rootsig::RangeInfo Binding;
180-
Binding.LowerBound = Const.ShaderRegister;
181-
Binding.Space = Const.RegisterSpace;
182-
Binding.UpperBound = Binding.LowerBound;
183-
184-
// Root Constants Bind to CBuffers
185-
Validation.addBinding(ResourceClass::CBuffer, Binding);
186-
180+
Builder.trackBinding(dxil::ResourceClass::CBuffer, Const.RegisterSpace,
181+
Const.ShaderRegister,
182+
Const.ShaderRegister + Const.Num32BitValues,
183+
nullptr);
187184
break;
188185
}
189186

@@ -192,32 +189,25 @@ initRSBindingValidation(const mcdxbc::RootSignatureDesc &RSD,
192189
case llvm::to_underlying(dxbc::RootParameterType::CBV): {
193190
dxbc::RTS0::v2::RootDescriptor Desc =
194191
RSD.ParametersContainer.getRootDescriptor(Loc);
192+
Builder.trackBinding(ParameterToResourceClass(Type), Desc.RegisterSpace,
193+
Desc.ShaderRegister, Desc.ShaderRegister, nullptr);
195194

196-
hlsl::rootsig::RangeInfo Binding;
197-
Binding.LowerBound = Desc.ShaderRegister;
198-
Binding.Space = Desc.RegisterSpace;
199-
Binding.UpperBound = Binding.LowerBound;
200-
201-
Validation.addBinding(ParameterToResourceClass(Type), Binding);
202195
break;
203196
}
204197
case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): {
205198
const mcdxbc::DescriptorTable &Table =
206199
RSD.ParametersContainer.getDescriptorTable(Loc);
207200

208201
for (const dxbc::RTS0::v2::DescriptorRange &Range : Table.Ranges) {
209-
hlsl::rootsig::RangeInfo Binding;
210-
Binding.LowerBound = Range.BaseShaderRegister;
211-
Binding.Space = Range.RegisterSpace;
212-
Binding.UpperBound = Binding.LowerBound + Range.NumDescriptors - 1;
213-
Validation.addBinding(RangeToResourceClass(Range.RangeType), Binding);
202+
Builder.trackBinding(RangeToResourceClass(Range.RangeType),
203+
Range.RegisterSpace, Range.BaseShaderRegister,
204+
Range.BaseShaderRegister + Range.NumDescriptors,
205+
nullptr);
214206
}
215207
break;
216208
}
217209
}
218210
}
219-
220-
return Validation;
221211
}
222212

223213
std::optional<mcdxbc::RootSignatureDesc>
@@ -232,30 +222,6 @@ getRootSignature(RootSignatureBindingInfo &RSBI,
232222
return RootSigDesc;
233223
}
234224

235-
static void reportUnboundRegisters(
236-
Module &M,
237-
const llvm::hlsl::rootsig::RootSignatureBindingValidation &Validation,
238-
ResourceClass Class,
239-
const iterator_range<SmallVectorImpl<dxil::ResourceInfo>::iterator>
240-
&Resources) {
241-
SmallVector<hlsl::rootsig::RangeInfo> Ranges;
242-
for (auto Res = Resources.begin(), End = Resources.end(); Res != End; Res++) {
243-
ResourceInfo::ResourceBinding ResBinding = Res->getBinding();
244-
hlsl::rootsig::RangeInfo Range;
245-
Range.Space = ResBinding.Space;
246-
Range.LowerBound = ResBinding.LowerBound;
247-
Range.UpperBound = Range.LowerBound + ResBinding.Size - 1;
248-
Range.Class = Class;
249-
Ranges.push_back(Range);
250-
}
251-
252-
SmallVector<hlsl::rootsig::RangeInfo> Unbounds =
253-
hlsl::rootsig::findUnboundRanges(Ranges,
254-
Validation.getBindingsOfType(Class));
255-
for (const auto &Unbound : Unbounds)
256-
reportRegNotBound(M, Unbound);
257-
}
258-
259225
static void reportErrors(Module &M, DXILResourceMap &DRM,
260226
DXILResourceBindingInfo &DRBI,
261227
RootSignatureBindingInfo &RSBI,
@@ -271,15 +237,29 @@ static void reportErrors(Module &M, DXILResourceMap &DRM,
271237

272238
if (auto RSD = getRootSignature(RSBI, MMI)) {
273239

274-
llvm::hlsl::rootsig::RootSignatureBindingValidation Validation =
275-
initRSBindingValidation(*RSD, tripleToVisibility(MMI.ShaderProfile));
276-
277-
reportUnboundRegisters(M, Validation, ResourceClass::CBuffer,
278-
DRM.cbuffers());
279-
reportUnboundRegisters(M, Validation, ResourceClass::UAV, DRM.uavs());
280-
reportUnboundRegisters(M, Validation, ResourceClass::Sampler,
281-
DRM.samplers());
282-
reportUnboundRegisters(M, Validation, ResourceClass::SRV, DRM.srvs());
240+
hlsl::BindingInfoBuilder Builder;
241+
dxbc::ShaderVisibility Visibility = tripleToVisibility(MMI.ShaderProfile);
242+
trackRootSigDescBinding(Builder, *RSD, Visibility);
243+
244+
bool HasOverlap;
245+
hlsl::BindingInfo Info = Builder.calculateBindingInfo(HasOverlap);
246+
247+
for (const auto &ResList :
248+
{std::make_pair(ResourceClass::SRV, DRM.srvs()),
249+
std::make_pair(ResourceClass::UAV, DRM.uavs()),
250+
std::make_pair(ResourceClass::CBuffer, DRM.cbuffers()),
251+
std::make_pair(ResourceClass::Sampler, DRM.samplers())}) {
252+
for (auto Res : ResList.second) {
253+
llvm::dxil::ResourceInfo::ResourceBinding ResBinding = Res.getBinding();
254+
llvm::hlsl::BindingInfo::BindingRange ResRange(
255+
ResBinding.LowerBound, ResBinding.LowerBound + ResBinding.Size);
256+
257+
auto IsBound = Info.isBound(ResList.first, ResBinding.Space, ResRange);
258+
if (!IsBound) {
259+
reportRegNotBound(M, ResList.first, ResBinding);
260+
}
261+
}
262+
}
283263
}
284264
}
285265
} // namespace

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
; RUN: not opt -S -passes='dxil-post-optimization-validation' -mtriple=dxil-pc-shadermodel6.6-compute %s 2>&1 | FileCheck %s
22

3-
; CHECK: error: register UAV (space=0, register=4294967295) does not have a binding in the Root Signature
3+
; CHECK: error: register UAV (space=0, register=4294967294) does not have a binding in the Root Signature
44

55
; Root Signature(
66
; CBV(b3, space=666, visibility=SHADER_VISIBILITY_ALL)
@@ -12,8 +12,8 @@
1212

1313
define void @CSMain() "hlsl.shader"="compute" {
1414
entry:
15-
; RWBuffer<float> UAV : register(u4294967295);
16-
%RWB = tail call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 -1, i32 1, i32 0, i1 false, ptr nonnull @RWB.str)
15+
; RWBuffer<float> UAV : register(4294967294);
16+
%RWB = tail call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 4294967294, i32 1, i32 0, i1 false, ptr nonnull @RWB.str)
1717
ret void
1818
}
1919

@@ -27,4 +27,4 @@ entry:
2727
!5 = !{!"DescriptorTable", i32 0, !6}
2828
!6 = !{!"Sampler", i32 2, i32 0, i32 0, i32 -1, i32 0}
2929
!7 = !{!"DescriptorTable", i32 0, !8}
30-
!8 = !{!"UAV", i32 -1, i32 0, i32 0, i32 -1, i32 2}
30+
!8 = !{!"UAV", i32 10, i32 0, i32 0, i32 -1, i32 2}

0 commit comments

Comments
 (0)