Skip to content

Commit a551253

Browse files
author
joaosaffran
committed
Merge branch 'validation/textures-not-bind-root-signatures' into validation/check-descriptors-are-bound
2 parents da42c0c + aea75da commit a551253

File tree

3 files changed

+57
-6
lines changed

3 files changed

+57
-6
lines changed

llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@
1212
#include "llvm/ADT/SmallString.h"
1313
#include "llvm/Analysis/DXILMetadataAnalysis.h"
1414
#include "llvm/Analysis/DXILResource.h"
15+
#include "llvm/IR/DerivedTypes.h"
1516
#include "llvm/IR/DiagnosticInfo.h"
1617
#include "llvm/IR/Instructions.h"
1718
#include "llvm/IR/IntrinsicsDirectX.h"
1819
#include "llvm/IR/Module.h"
1920
#include "llvm/InitializePasses.h"
21+
#include "llvm/Support/Casting.h"
2022

2123
#define DEBUG_TYPE "dxil-post-optimization-validation"
2224

@@ -84,6 +86,17 @@ static void reportOverlappingBinding(Module &M, DXILResourceMap &DRM) {
8486
}
8587
}
8688

89+
static void
90+
reportInvalidHandleTyBoundInRs(Module &M, Twine Type,
91+
ResourceInfo::ResourceBinding Binding) {
92+
SmallString<128> Message;
93+
raw_svector_ostream OS(Message);
94+
OS << "resource " << Type << " at register (space=" << Binding.Space
95+
<< ", register=" << Binding.LowerBound << ")"
96+
<< " is bound to a texture or typed buffer.";
97+
M.getContext().diagnose(DiagnosticInfoGeneric(Message));
98+
}
99+
87100
static void reportRegNotBound(Module &M, Twine Type,
88101
ResourceInfo::ResourceBinding Binding) {
89102
SmallString<128> Message;
@@ -197,7 +210,7 @@ getRootSignature(RootSignatureBindingInfo &RSBI,
197210
return RootSigDesc;
198211
}
199212

200-
static void reportUnboundRegisters(
213+
static void reportInvalidRegistersBinding(
201214
Module &M,
202215
const std::vector<llvm::dxil::ResourceInfo::ResourceBinding> &Bindings,
203216
iterator_range<SmallVector<dxil::ResourceInfo>::iterator> &Resources) {
@@ -214,6 +227,13 @@ static void reportUnboundRegisters(
214227
}
215228
if (!Bound) {
216229
reportRegNotBound(M, Res->getName(), Res->getBinding());
230+
} else {
231+
TargetExtType *Handle = Res->getHandleTy();
232+
auto *TypedBuffer = dyn_cast_or_null<TypedBufferExtType>(Handle);
233+
auto *Texture = dyn_cast_or_null<TextureExtType>(Handle);
234+
235+
if (TypedBuffer != nullptr || Texture != nullptr)
236+
reportInvalidHandleTyBoundInRs(M, Res->getName(), Res->getBinding());
217237
}
218238
}
219239
}
@@ -241,14 +261,14 @@ static void reportErrors(Module &M, DXILResourceMap &DRM,
241261
auto UAVs = DRM.uavs();
242262
auto Samplers = DRM.samplers();
243263

244-
reportUnboundRegisters(
264+
reportInvalidRegistersBinding(
245265
M, Validation.getBindingsOfType(dxbc::DescriptorRangeType::CBV), Cbufs);
246-
reportUnboundRegisters(
266+
reportInvalidRegistersBinding(
247267
M, Validation.getBindingsOfType(dxbc::DescriptorRangeType::UAV), UAVs);
248-
reportUnboundRegisters(
268+
reportInvalidRegistersBinding(
249269
M, Validation.getBindingsOfType(dxbc::DescriptorRangeType::Sampler),
250270
Samplers);
251-
reportUnboundRegisters(
271+
reportInvalidRegistersBinding(
252272
M, Validation.getBindingsOfType(dxbc::DescriptorRangeType::SRV), SRVs);
253273
}
254274
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
; RUN: not opt -S -passes='dxil-post-optimization-validation' -mtriple=dxil-pc-shadermodel6.6-compute %s 2>&1 | FileCheck %s
2+
; CHECK: error: resource TB at register (space=0, register=0) is bound to a texture or typed buffer.
3+
4+
5+
; Root Signature(
6+
; CBV(b3, space=1, visibility=SHADER_VISIBILITY_ALL)
7+
; DescriptorTable(SRV(t0, space=0, numDescriptors=1), visibility=SHADER_VISIBILITY_ALL)
8+
; DescriptorTable(Sampler(s0, numDescriptors=2), visibility=SHADER_VISIBILITY_VERTEX)
9+
; DescriptorTable(UAV(u0, numDescriptors=unbounded), visibility=SHADER_VISIBILITY_ALL)
10+
11+
@TB.str = private unnamed_addr constant [3 x i8] c"TB\00", align 1
12+
13+
define void @CSMain() "hlsl.shader"="compute" {
14+
entry:
15+
16+
%TB = tail call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 0, i32 1, i32 0, i1 false, ptr nonnull @TB.str)
17+
18+
ret void
19+
}
20+
21+
!dx.rootsignatures = !{!0}
22+
23+
!0 = !{ptr @CSMain, !1, i32 2}
24+
!1 = !{!2, !3, !5, !7}
25+
!2 = !{!"RootCBV", i32 0, i32 3, i32 1, i32 4}
26+
!3 = !{!"DescriptorTable", i32 0, !4}
27+
!4 = !{!"SRV", i32 1, i32 0, i32 0, i32 -1, i32 0}
28+
!5 = !{!"DescriptorTable", i32 0, !6}
29+
!6 = !{!"Sampler", i32 5, i32 3, i32 2, i32 -1, i32 0}
30+
!7 = !{!"DescriptorTable", i32 0, !8}
31+
!8 = !{!"UAV", i32 -1, i32 0, i32 0, i32 -1, i32 2}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ entry:
2121
%CB = tail call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 4, 0)) @llvm.dx.resource.handlefrombinding(i32 1, i32 3, i32 1, i32 0, i1 false, ptr nonnull @CB.str)
2222
%Sampler = call target("dx.Sampler", 0) @llvm.dx.resource.handlefrombinding(i32 2, i32 3, i32 1, i32 0, i1 false, ptr nonnull @Smp.str)
2323
%SB = tail call target("dx.RawBuffer", i32, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_0_0t(i32 0, i32 0, i32 1, i32 0, i1 false, ptr nonnull @SB.str)
24-
%RWB = tail call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 0, i32 1, i32 0, i1 false, ptr nonnull @RWB.str)
24+
%RWB = tail call target("dx.RawBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_1_0_0t(i32 0, i32 0, i32 1, i32 0, i1 false, ptr nonnull @RWB.str)
2525

2626
ret void
2727
}

0 commit comments

Comments
 (0)