Skip to content

Commit 981bb9d

Browse files
authored
[DirectX] generate resource table for PSV part (#106607)
Use DXILResourceWrapperPass to build the resource table. Since DXILResourceWrapperPass operates on LLVM intrinsics rather than DXIL operations, add addPreserved for DXILResourceWrapperPass in the passes before DXContainerGlobals Fixes #103275
1 parent 6d859c1 commit 981bb9d

File tree

8 files changed

+164
-2
lines changed

8 files changed

+164
-2
lines changed

llvm/lib/Target/DirectX/DXContainerGlobals.cpp

+56
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "llvm/ADT/StringExtras.h"
1717
#include "llvm/ADT/StringRef.h"
1818
#include "llvm/Analysis/DXILMetadataAnalysis.h"
19+
#include "llvm/Analysis/DXILResource.h"
1920
#include "llvm/BinaryFormat/DXContainer.h"
2021
#include "llvm/CodeGen/Passes.h"
2122
#include "llvm/IR/Constants.h"
@@ -40,6 +41,7 @@ class DXContainerGlobals : public llvm::ModulePass {
4041
GlobalVariable *buildSignature(Module &M, Signature &Sig, StringRef Name,
4142
StringRef SectionName);
4243
void addSignature(Module &M, SmallVector<GlobalValue *> &Globals);
44+
void addResourcesForPSV(Module &M, PSVRuntimeInfo &PSV);
4345
void addPipelineStateValidationInfo(Module &M,
4446
SmallVector<GlobalValue *> &Globals);
4547

@@ -59,6 +61,7 @@ class DXContainerGlobals : public llvm::ModulePass {
5961
AU.setPreservesAll();
6062
AU.addRequired<ShaderFlagsAnalysisWrapper>();
6163
AU.addRequired<DXILMetadataAnalysisWrapperPass>();
64+
AU.addRequired<DXILResourceWrapperPass>();
6265
}
6366
};
6467

@@ -140,6 +143,56 @@ void DXContainerGlobals::addSignature(Module &M,
140143
Globals.emplace_back(buildSignature(M, OutputSig, "dx.osg1", "OSG1"));
141144
}
142145

146+
void DXContainerGlobals::addResourcesForPSV(Module &M, PSVRuntimeInfo &PSV) {
147+
const DXILResourceMap &ResMap =
148+
getAnalysis<DXILResourceWrapperPass>().getResourceMap();
149+
150+
for (const dxil::ResourceInfo &ResInfo : ResMap) {
151+
const dxil::ResourceInfo::ResourceBinding &Binding = ResInfo.getBinding();
152+
dxbc::PSV::v2::ResourceBindInfo BindInfo;
153+
BindInfo.LowerBound = Binding.LowerBound;
154+
BindInfo.UpperBound = Binding.LowerBound + Binding.Size - 1;
155+
BindInfo.Space = Binding.Space;
156+
157+
dxbc::PSV::ResourceType ResType = dxbc::PSV::ResourceType::Invalid;
158+
bool IsUAV = ResInfo.getResourceClass() == dxil::ResourceClass::UAV;
159+
switch (ResInfo.getResourceKind()) {
160+
case dxil::ResourceKind::Sampler:
161+
ResType = dxbc::PSV::ResourceType::Sampler;
162+
break;
163+
case dxil::ResourceKind::CBuffer:
164+
ResType = dxbc::PSV::ResourceType::CBV;
165+
break;
166+
case dxil::ResourceKind::StructuredBuffer:
167+
ResType = IsUAV ? dxbc::PSV::ResourceType::UAVStructured
168+
: dxbc::PSV::ResourceType::SRVStructured;
169+
if (IsUAV && ResInfo.getUAV().HasCounter)
170+
ResType = dxbc::PSV::ResourceType::UAVStructuredWithCounter;
171+
break;
172+
case dxil::ResourceKind::RTAccelerationStructure:
173+
ResType = dxbc::PSV::ResourceType::SRVRaw;
174+
break;
175+
case dxil::ResourceKind::RawBuffer:
176+
ResType = IsUAV ? dxbc::PSV::ResourceType::UAVRaw
177+
: dxbc::PSV::ResourceType::SRVRaw;
178+
break;
179+
default:
180+
ResType = IsUAV ? dxbc::PSV::ResourceType::UAVTyped
181+
: dxbc::PSV::ResourceType::SRVTyped;
182+
break;
183+
}
184+
BindInfo.Type = ResType;
185+
186+
BindInfo.Kind =
187+
static_cast<dxbc::PSV::ResourceKind>(ResInfo.getResourceKind());
188+
// TODO: Add support for dxbc::PSV::ResourceFlag::UsedByAtomic64, tracking
189+
// with https://github.com/llvm/llvm-project/issues/104392
190+
BindInfo.Flags.Flags = 0u;
191+
192+
PSV.Resources.emplace_back(BindInfo);
193+
}
194+
}
195+
143196
void DXContainerGlobals::addPipelineStateValidationInfo(
144197
Module &M, SmallVector<GlobalValue *> &Globals) {
145198
SmallString<256> Data;
@@ -155,6 +208,8 @@ void DXContainerGlobals::addPipelineStateValidationInfo(
155208
PSV.BaseData.ShaderStage =
156209
static_cast<uint8_t>(MMI.ShaderStage - Triple::Pixel);
157210

211+
addResourcesForPSV(M, PSV);
212+
158213
// Hardcoded values here to unblock loading the shader into D3D.
159214
//
160215
// TODO: Lots more stuff to do here!
@@ -185,6 +240,7 @@ INITIALIZE_PASS_BEGIN(DXContainerGlobals, "dxil-globals",
185240
"DXContainer Global Emitter", false, true)
186241
INITIALIZE_PASS_DEPENDENCY(ShaderFlagsAnalysisWrapper)
187242
INITIALIZE_PASS_DEPENDENCY(DXILMetadataAnalysisWrapperPass)
243+
INITIALIZE_PASS_DEPENDENCY(DXILResourceWrapperPass)
188244
INITIALIZE_PASS_END(DXContainerGlobals, "dxil-globals",
189245
"DXContainer Global Emitter", false, true)
190246

llvm/lib/Target/DirectX/DXILFinalizeLinkage.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include "DXILFinalizeLinkage.h"
1010
#include "DirectX.h"
11+
#include "llvm/Analysis/DXILResource.h"
1112
#include "llvm/IR/Function.h"
1213
#include "llvm/IR/GlobalValue.h"
1314
#include "llvm/IR/Metadata.h"
@@ -48,6 +49,10 @@ bool DXILFinalizeLinkageLegacy::runOnModule(Module &M) {
4849
return finalizeLinkage(M);
4950
}
5051

52+
void DXILFinalizeLinkageLegacy::getAnalysisUsage(AnalysisUsage &AU) const {
53+
AU.addPreserved<DXILResourceWrapperPass>();
54+
}
55+
5156
char DXILFinalizeLinkageLegacy::ID = 0;
5257

5358
INITIALIZE_PASS_BEGIN(DXILFinalizeLinkageLegacy, DEBUG_TYPE,

llvm/lib/Target/DirectX/DXILFinalizeLinkage.h

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class DXILFinalizeLinkageLegacy : public ModulePass {
3232
DXILFinalizeLinkageLegacy() : ModulePass(ID) {}
3333
bool runOnModule(Module &M) override;
3434

35+
void getAnalysisUsage(AnalysisUsage &AU) const override;
3536
static char ID; // Pass identification.
3637
};
3738
} // namespace llvm

llvm/lib/Target/DirectX/DXILIntrinsicExpansion.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "DirectX.h"
1515
#include "llvm/ADT/STLExtras.h"
1616
#include "llvm/ADT/SmallVector.h"
17+
#include "llvm/Analysis/DXILResource.h"
1718
#include "llvm/CodeGen/Passes.h"
1819
#include "llvm/IR/IRBuilder.h"
1920
#include "llvm/IR/InstrTypes.h"
@@ -495,6 +496,10 @@ bool DXILIntrinsicExpansionLegacy::runOnModule(Module &M) {
495496
return expansionIntrinsics(M);
496497
}
497498

499+
void DXILIntrinsicExpansionLegacy::getAnalysisUsage(AnalysisUsage &AU) const {
500+
AU.addPreserved<DXILResourceWrapperPass>();
501+
}
502+
498503
char DXILIntrinsicExpansionLegacy::ID = 0;
499504

500505
INITIALIZE_PASS_BEGIN(DXILIntrinsicExpansionLegacy, DEBUG_TYPE,

llvm/lib/Target/DirectX/DXILIntrinsicExpansion.h

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class DXILIntrinsicExpansionLegacy : public ModulePass {
2626
bool runOnModule(Module &M) override;
2727
DXILIntrinsicExpansionLegacy() : ModulePass(ID) {}
2828

29+
void getAnalysisUsage(AnalysisUsage &AU) const override;
2930
static char ID; // Pass identification.
3031
};
3132
} // namespace llvm

llvm/lib/Target/DirectX/DXILPrepare.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "llvm/ADT/SmallVector.h"
2121
#include "llvm/ADT/StringSet.h"
2222
#include "llvm/Analysis/DXILMetadataAnalysis.h"
23+
#include "llvm/Analysis/DXILResource.h"
2324
#include "llvm/CodeGen/Passes.h"
2425
#include "llvm/IR/AttributeMask.h"
2526
#include "llvm/IR/IRBuilder.h"
@@ -249,6 +250,7 @@ class DXILPrepareModule : public ModulePass {
249250
AU.addPreserved<ShaderFlagsAnalysisWrapper>();
250251
AU.addPreserved<DXILResourceMDWrapper>();
251252
AU.addPreserved<DXILMetadataAnalysisWrapperPass>();
253+
AU.addPreserved<DXILResourceWrapperPass>();
252254
}
253255
static char ID; // Pass identification.
254256
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s
2+
3+
; Make sure resource table is created correctly.
4+
; CHECK: Resources:
5+
target triple = "dxil-unknown-shadermodel6.0-compute"
6+
7+
define void @main() #0 {
8+
9+
; ByteAddressBuffer Buf : register(t8, space1)
10+
; CHECK: - Type: SRVRaw
11+
; CHECK: Space: 1
12+
; CHECK: LowerBound: 8
13+
; CHECK: UpperBound: 8
14+
; CHECK: Kind: RawBuffer
15+
; CHECK: Flags:
16+
; CHECK: UsedByAtomic64: false
17+
%srv0 = call target("dx.RawBuffer", i8, 0, 0)
18+
@llvm.dx.handle.fromBinding.tdx.RawBuffer_i8_0_0t(
19+
i32 1, i32 8, i32 1, i32 0, i1 false)
20+
21+
; struct S { float4 a; uint4 b; };
22+
; StructuredBuffer<S> Buf : register(t2, space4)
23+
; CHECK: - Type: SRVStructured
24+
; CHECK: Space: 4
25+
; CHECK: LowerBound: 2
26+
; CHECK: UpperBound: 2
27+
; CHECK: Kind: StructuredBuffer
28+
; CHECK: Flags:
29+
; CHECK: UsedByAtomic64: false
30+
%srv1 = call target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 0, 0)
31+
@llvm.dx.handle.fromBinding.tdx.RawBuffer_sl_v4f32v4i32s_0_0t(
32+
i32 4, i32 2, i32 1, i32 0, i1 false)
33+
34+
; Buffer<uint4> Buf[24] : register(t3, space5)
35+
; CHECK: - Type: SRVTyped
36+
; CHECK: Space: 5
37+
; CHECK: LowerBound: 3
38+
; CHECK: UpperBound: 26
39+
; CHECK: Kind: TypedBuffer
40+
; CHECK: Flags:
41+
; CHECK: UsedByAtomic64: false
42+
%srv2 = call target("dx.TypedBuffer", <4 x i32>, 0, 0, 0)
43+
@llvm.dx.handle.fromBinding.tdx.TypedBuffer_i32_0_0t(
44+
i32 5, i32 3, i32 24, i32 0, i1 false)
45+
46+
; RWBuffer<int> Buf : register(u7, space2)
47+
; CHECK: - Type: UAVTyped
48+
; CHECK: Space: 2
49+
; CHECK: LowerBound: 7
50+
; CHECK: UpperBound: 7
51+
; CHECK: Kind: TypedBuffer
52+
; CHECK: Flags:
53+
; CHECK: UsedByAtomic64: false
54+
%uav0 = call target("dx.TypedBuffer", i32, 1, 0, 1)
55+
@llvm.dx.handle.fromBinding.tdx.TypedBuffer_i32_1_0t(
56+
i32 2, i32 7, i32 1, i32 0, i1 false)
57+
58+
; RWBuffer<float4> Buf : register(u5, space3)
59+
; CHECK: - Type: UAVTyped
60+
; CHECK: Space: 3
61+
; CHECK: LowerBound: 5
62+
; CHECK: UpperBound: 5
63+
; CHECK: Kind: TypedBuffer
64+
; CHECK: Flags:
65+
; CHECK: UsedByAtomic64: false
66+
%uav1 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0)
67+
@llvm.dx.handle.fromBinding.tdx.TypedBuffer_f32_1_0(
68+
i32 3, i32 5, i32 1, i32 0, i1 false)
69+
70+
; RWBuffer<float4> BufferArray[10] : register(u0, space4)
71+
; CHECK: - Type: UAVTyped
72+
; CHECK: Space: 4
73+
; CHECK: LowerBound: 0
74+
; CHECK: UpperBound: 9
75+
; CHECK: Kind: TypedBuffer
76+
; CHECK: Flags:
77+
; CHECK: UsedByAtomic64: false
78+
; RWBuffer<float4> Buf = BufferArray[0]
79+
%uav2_1 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0)
80+
@llvm.dx.handle.fromBinding.tdx.TypedBuffer_f32_1_0(
81+
i32 4, i32 0, i32 10, i32 0, i1 false)
82+
; RWBuffer<float4> Buf = BufferArray[5]
83+
%uav2_2 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0)
84+
@llvm.dx.handle.fromBinding.tdx.TypedBuffer_f32_1_0(
85+
i32 4, i32 0, i32 10, i32 5, i1 false)
86+
ret void
87+
}
88+
89+
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
90+
91+
!dx.valver = !{!0}
92+
93+
!0 = !{i32 1, i32 7}

llvm/test/CodeGen/DirectX/llc-pipeline.ll

+1-2
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,11 @@
1414
; CHECK-NEXT: DXIL Resource analysis
1515
; CHECK-NEXT: DXIL Op Lowering
1616
; CHECK-NEXT: DXIL Finalize Linkage
17-
; CHECK-NEXT: DXIL Resource analysis
1817
; CHECK-NEXT: DXIL resource Information
1918
; CHECK-NEXT: DXIL Shader Flag Analysis
19+
; CHECK-NEXT: DXIL Module Metadata analysis
2020
; CHECK-NEXT: DXIL Translate Metadata
2121
; CHECK-NEXT: DXIL Prepare Module
22-
; CHECK-NEXT: DXIL Resource analysis
2322
; CHECK-NEXT: DXIL Metadata Pretty Printer
2423
; CHECK-NEXT: Print Module IR
2524

0 commit comments

Comments
 (0)