Skip to content

Commit b4a0e16

Browse files
author
joaosaffran
committed
moving code arround
1 parent 578a03b commit b4a0e16

10 files changed

+164
-111
lines changed

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

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include "llvm/ADT/IntervalMap.h"
1818
#include "llvm/Frontend/HLSL/HLSLRootSignature.h"
19+
#include "llvm/Support/DXILABI.h"
1920

2021
namespace llvm {
2122
namespace hlsl {
@@ -136,6 +137,51 @@ struct OverlappingRanges {
136137
llvm::SmallVector<OverlappingRanges>
137138
findOverlappingRanges(llvm::SmallVector<RangeInfo> &Infos);
138139

140+
class RootSignatureBindingValidation {
141+
private:
142+
llvm::SmallVector<RangeInfo, 16> Bindings;
143+
struct TypeRange {
144+
uint32_t Start;
145+
uint32_t End;
146+
};
147+
std::unordered_map<dxil::ResourceClass, TypeRange> Ranges;
148+
149+
public:
150+
void addBinding(dxil::ResourceClass Type, const RangeInfo &Binding) {
151+
auto It = Ranges.find(Type);
152+
153+
if (It == Ranges.end()) {
154+
uint32_t InsertPos = Bindings.size();
155+
Bindings.push_back(Binding);
156+
Ranges[Type] = {InsertPos, InsertPos + 1};
157+
} else {
158+
uint32_t InsertPos = It->second.End;
159+
Bindings.insert(Bindings.begin() + InsertPos, Binding);
160+
161+
It->second.End++;
162+
163+
for (auto &[Type, Range] : Ranges) {
164+
if (Range.Start > InsertPos) {
165+
Range.Start++;
166+
Range.End++;
167+
}
168+
}
169+
}
170+
}
171+
172+
llvm::ArrayRef<RangeInfo>
173+
getBindingsOfType(const dxil::ResourceClass &Type) const {
174+
auto It = Ranges.find(Type);
175+
if (It == Ranges.end()) {
176+
return {};
177+
}
178+
return llvm::ArrayRef<RangeInfo>(Bindings.data() + It->second.Start,
179+
It->second.End - It->second.Start);
180+
}
181+
};
182+
llvm::SmallVector<RangeInfo>
183+
findUnboundRanges(const llvm::SmallVectorImpl<RangeInfo> &Ranges,
184+
const llvm::ArrayRef<RangeInfo> &Bindings);
139185
} // namespace rootsig
140186
} // namespace hlsl
141187
} // namespace llvm

llvm/include/llvm/MC/DXContainerRootSignature.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66
//
77
//===----------------------------------------------------------------------===//
8+
#ifndef LLVM_MC_DXCONTAINERROOTSIGNATURE_H
9+
#define LLVM_MC_DXCONTAINERROOTSIGNATURE_H
810

911
#include "llvm/BinaryFormat/DXContainer.h"
1012
#include <cstdint>
@@ -116,3 +118,4 @@ struct RootSignatureDesc {
116118
};
117119
} // namespace mcdxbc
118120
} // namespace llvm
121+
#endif // LLVM_MC_DXCONTAINERROOTSIGNATURE_H

llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,32 @@ findOverlappingRanges(llvm::SmallVector<RangeInfo> &Infos) {
316316
return Overlaps;
317317
}
318318

319+
llvm::SmallVector<RangeInfo>
320+
findUnboundRanges(const llvm::SmallVectorImpl<RangeInfo> &Ranges,
321+
const llvm::ArrayRef<RangeInfo> &Bindings) {
322+
llvm::SmallVector<RangeInfo> Unbounds;
323+
for (const auto &Range : Ranges) {
324+
bool Bound = false;
325+
// hlsl::rootsig::RangeInfo Range;
326+
// Range.Space = ResBinding.Space;
327+
// Range.LowerBound = ResBinding.LowerBound;
328+
// Range.UpperBound = Range.LowerBound + ResBinding.Size - 1;
329+
330+
for (const auto &Binding : Bindings) {
331+
if (Range.Space == Binding.Space &&
332+
Range.LowerBound >= Binding.LowerBound &&
333+
Range.UpperBound <= Binding.UpperBound) {
334+
Bound = true;
335+
break;
336+
}
337+
}
338+
if (!Bound) {
339+
Unbounds.push_back(Range);
340+
}
341+
}
342+
return Unbounds;
343+
}
344+
319345
} // namespace rootsig
320346
} // namespace hlsl
321347
} // namespace llvm

llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp

Lines changed: 84 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "DXILPostOptimizationValidation.h"
10+
#include "DXILRootSignature.h"
1011
#include "DXILShaderFlags.h"
1112
#include "DirectX.h"
1213
#include "llvm/ADT/STLForwardCompat.h"
@@ -15,18 +16,63 @@
1516
#include "llvm/Analysis/DXILMetadataAnalysis.h"
1617
#include "llvm/Analysis/DXILResource.h"
1718
#include "llvm/BinaryFormat/DXContainer.h"
19+
#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/MC/DXContainerRootSignature.h"
26+
#include "llvm/Support/DXILABI.h"
2327

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

2630
using namespace llvm;
2731
using namespace llvm::dxil;
2832

2933
namespace {
34+
static const char *ResourceClassToString(llvm::dxil::ResourceClass Class) {
35+
switch (Class) {
36+
case ResourceClass::SRV:
37+
return "SRV";
38+
case ResourceClass::UAV:
39+
return "UAV";
40+
case ResourceClass::CBuffer:
41+
return "CBuffer";
42+
case ResourceClass::Sampler:
43+
return "Sampler";
44+
}
45+
}
46+
47+
static ResourceClass RangeToResourceClass(uint32_t RangeType) {
48+
using namespace dxbc;
49+
switch (static_cast<DescriptorRangeType>(RangeType)) {
50+
case DescriptorRangeType::SRV:
51+
return ResourceClass::SRV;
52+
case DescriptorRangeType::UAV:
53+
return ResourceClass::UAV;
54+
case DescriptorRangeType::CBV:
55+
return ResourceClass::CBuffer;
56+
case DescriptorRangeType::Sampler:
57+
return ResourceClass::Sampler;
58+
}
59+
}
60+
61+
ResourceClass ParameterToResourceClass(uint32_t Type) {
62+
using namespace dxbc;
63+
switch (Type) {
64+
case llvm::to_underlying(RootParameterType::Constants32Bit):
65+
return ResourceClass::CBuffer;
66+
case llvm::to_underlying(RootParameterType::SRV):
67+
return ResourceClass::SRV;
68+
case llvm::to_underlying(RootParameterType::UAV):
69+
return ResourceClass::UAV;
70+
case llvm::to_underlying(RootParameterType::CBV):
71+
return ResourceClass::CBuffer;
72+
default:
73+
llvm_unreachable("Unknown RootParameterType");
74+
}
75+
}
3076

3177
static void reportInvalidDirection(Module &M, DXILResourceMap &DRM) {
3278
for (const auto &UAV : DRM.uavs()) {
@@ -87,12 +133,13 @@ static void reportOverlappingBinding(Module &M, DXILResourceMap &DRM) {
87133
}
88134
}
89135

90-
static void reportRegNotBound(Module &M, Twine Type,
91-
ResourceInfo::ResourceBinding Binding) {
136+
static void reportRegNotBound(Module &M,
137+
llvm::hlsl::rootsig::RangeInfo Unbound) {
92138
SmallString<128> Message;
93139
raw_svector_ostream OS(Message);
94-
OS << "register " << Type << " (space=" << Binding.Space
95-
<< ", register=" << Binding.LowerBound << ")"
140+
OS << "register " << ResourceClassToString(Unbound.Class)
141+
<< " (space=" << Unbound.Space << ", register=" << Unbound.LowerBound
142+
<< ")"
96143
<< " is not defined in Root Signature";
97144
M.getContext().diagnose(DiagnosticInfoGeneric(Message));
98145
}
@@ -125,24 +172,11 @@ tripleToVisibility(llvm::Triple::EnvironmentType ET) {
125172
}
126173
}
127174

128-
static uint32_t parameterToRangeType(uint32_t Type) {
129-
switch (Type) {
130-
case llvm::to_underlying(dxbc::RootParameterType::CBV):
131-
return llvm::to_underlying(dxbc::DescriptorRangeType::CBV);
132-
case llvm::to_underlying(dxbc::RootParameterType::SRV):
133-
return llvm::to_underlying(dxbc::DescriptorRangeType::SRV);
134-
case llvm::to_underlying(dxbc::RootParameterType::UAV):
135-
return llvm::to_underlying(dxbc::DescriptorRangeType::UAV);
136-
default:
137-
llvm_unreachable("Root Parameter Type has no Range Type equivalent");
138-
}
139-
}
140-
141-
static RootSignatureBindingValidation
175+
static hlsl::rootsig::RootSignatureBindingValidation
142176
initRSBindingValidation(const mcdxbc::RootSignatureDesc &RSD,
143177
dxbc::ShaderVisibility Visibility) {
144178

145-
RootSignatureBindingValidation Validation;
179+
hlsl::rootsig::RootSignatureBindingValidation Validation;
146180

147181
for (size_t I = 0; I < RSD.ParametersContainer.size(); I++) {
148182
const auto &[Type, Loc] =
@@ -159,14 +193,13 @@ initRSBindingValidation(const mcdxbc::RootSignatureDesc &RSD,
159193
dxbc::RTS0::v1::RootConstants Const =
160194
RSD.ParametersContainer.getConstant(Loc);
161195

162-
llvm::dxil::ResourceInfo::ResourceBinding Binding;
196+
hlsl::rootsig::RangeInfo Binding;
163197
Binding.LowerBound = Const.ShaderRegister;
164198
Binding.Space = Const.RegisterSpace;
165-
Binding.Size = 1;
199+
Binding.UpperBound = Binding.LowerBound;
166200

167201
// Root Constants Bind to CBuffers
168-
Validation.addBinding(llvm::to_underlying(dxbc::DescriptorRangeType::CBV),
169-
Binding);
202+
Validation.addBinding(ResourceClass::CBuffer, Binding);
170203

171204
break;
172205
}
@@ -177,24 +210,24 @@ initRSBindingValidation(const mcdxbc::RootSignatureDesc &RSD,
177210
dxbc::RTS0::v2::RootDescriptor Desc =
178211
RSD.ParametersContainer.getRootDescriptor(Loc);
179212

180-
llvm::dxil::ResourceInfo::ResourceBinding Binding;
213+
hlsl::rootsig::RangeInfo Binding;
181214
Binding.LowerBound = Desc.ShaderRegister;
182215
Binding.Space = Desc.RegisterSpace;
183-
Binding.Size = 1;
216+
Binding.UpperBound = Binding.LowerBound;
184217

185-
Validation.addBinding(parameterToRangeType(Type), Binding);
218+
Validation.addBinding(ParameterToResourceClass(Type), Binding);
186219
break;
187220
}
188221
case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): {
189222
const mcdxbc::DescriptorTable &Table =
190223
RSD.ParametersContainer.getDescriptorTable(Loc);
191224

192225
for (const dxbc::RTS0::v2::DescriptorRange &Range : Table.Ranges) {
193-
llvm::dxil::ResourceInfo::ResourceBinding Binding;
226+
hlsl::rootsig::RangeInfo Binding;
194227
Binding.LowerBound = Range.BaseShaderRegister;
195228
Binding.Space = Range.RegisterSpace;
196-
Binding.Size = Range.NumDescriptors;
197-
Validation.addBinding(Range.RangeType, Binding);
229+
Binding.UpperBound = Binding.LowerBound + Range.NumDescriptors - 1;
230+
Validation.addBinding(RangeToResourceClass(Range.RangeType), Binding);
198231
}
199232
break;
200233
}
@@ -218,25 +251,26 @@ getRootSignature(RootSignatureBindingInfo &RSBI,
218251

219252
static void reportUnboundRegisters(
220253
Module &M,
221-
const llvm::ArrayRef<llvm::dxil::ResourceInfo::ResourceBinding> &Bindings,
254+
const llvm::hlsl::rootsig::RootSignatureBindingValidation &Validation,
255+
ResourceClass Class,
222256
const iterator_range<SmallVectorImpl<dxil::ResourceInfo>::iterator>
223257
&Resources) {
258+
SmallVector<hlsl::rootsig::RangeInfo> Ranges;
224259
for (auto Res = Resources.begin(), End = Resources.end(); Res != End; Res++) {
225-
bool Bound = false;
226260
ResourceInfo::ResourceBinding ResBinding = Res->getBinding();
227-
for (const auto &Binding : Bindings) {
228-
if (ResBinding.Space == Binding.Space &&
229-
ResBinding.LowerBound >= Binding.LowerBound &&
230-
ResBinding.LowerBound + ResBinding.Size - 1 <
231-
Binding.LowerBound + Binding.Size) {
232-
Bound = true;
233-
break;
234-
}
235-
}
236-
if (!Bound) {
237-
reportRegNotBound(M, Res->getName(), Res->getBinding());
238-
}
261+
hlsl::rootsig::RangeInfo Range;
262+
Range.Space = ResBinding.Space;
263+
Range.LowerBound = ResBinding.LowerBound;
264+
Range.UpperBound = Range.LowerBound + ResBinding.Size - 1;
265+
Range.Class = Class;
266+
Ranges.push_back(Range);
239267
}
268+
269+
SmallVector<hlsl::rootsig::RangeInfo> Unbounds =
270+
hlsl::rootsig::findUnboundRanges(Ranges,
271+
Validation.getBindingsOfType(Class));
272+
for (const auto &Unbound : Unbounds)
273+
reportRegNotBound(M, Unbound);
240274
}
241275

242276
static void reportErrors(Module &M, DXILResourceMap &DRM,
@@ -254,21 +288,15 @@ static void reportErrors(Module &M, DXILResourceMap &DRM,
254288

255289
if (auto RSD = getRootSignature(RSBI, MMI)) {
256290

257-
RootSignatureBindingValidation Validation =
291+
llvm::hlsl::rootsig::RootSignatureBindingValidation Validation =
258292
initRSBindingValidation(*RSD, tripleToVisibility(MMI.ShaderProfile));
259293

260-
reportUnboundRegisters(
261-
M, Validation.getBindingsOfType(dxbc::DescriptorRangeType::CBV),
262-
DRM.cbuffers());
263-
reportUnboundRegisters(
264-
M, Validation.getBindingsOfType(dxbc::DescriptorRangeType::UAV),
265-
DRM.uavs());
266-
reportUnboundRegisters(
267-
M, Validation.getBindingsOfType(dxbc::DescriptorRangeType::Sampler),
268-
DRM.samplers());
269-
reportUnboundRegisters(
270-
M, Validation.getBindingsOfType(dxbc::DescriptorRangeType::SRV),
271-
DRM.srvs());
294+
reportUnboundRegisters(M, Validation, ResourceClass::CBuffer,
295+
DRM.cbuffers());
296+
reportUnboundRegisters(M, Validation, ResourceClass::UAV, DRM.uavs());
297+
reportUnboundRegisters(M, Validation, ResourceClass::Sampler,
298+
DRM.samplers());
299+
reportUnboundRegisters(M, Validation, ResourceClass::SRV, DRM.srvs());
272300
}
273301
}
274302
} // namespace

0 commit comments

Comments
 (0)