13
13
#include " DXILShaderFlags.h"
14
14
#include " DirectX.h"
15
15
#include " llvm/ADT/StringSet.h"
16
+ #include " llvm/Analysis/DXILResource.h"
16
17
#include " llvm/IR/Constants.h"
17
18
#include " llvm/IR/Metadata.h"
18
19
#include " llvm/IR/Module.h"
20
+ #include " llvm/InitializePasses.h"
19
21
#include " llvm/Pass.h"
20
22
#include " llvm/TargetParser/Triple.h"
21
23
22
24
using namespace llvm ;
23
25
using namespace llvm ::dxil;
24
26
25
- static void emitResourceMetadata (Module &M,
27
+ static void emitResourceMetadata (Module &M, const DXILResourceMap &DRM,
26
28
const dxil::Resources &MDResources) {
27
- Metadata *SRVMD = nullptr , *UAVMD = nullptr , *CBufMD = nullptr ,
28
- *SmpMD = nullptr ;
29
- bool HasResources = false ;
29
+ LLVMContext &Context = M.getContext ();
30
+
31
+ SmallVector<Metadata *> SRVs, UAVs, CBufs, Smps;
32
+ for (const ResourceInfo &RI : DRM.srvs ())
33
+ SRVs.push_back (RI.getAsMetadata (Context));
34
+ for (const ResourceInfo &RI : DRM.uavs ())
35
+ UAVs.push_back (RI.getAsMetadata (Context));
36
+ for (const ResourceInfo &RI : DRM.cbuffers ())
37
+ CBufs.push_back (RI.getAsMetadata (Context));
38
+ for (const ResourceInfo &RI : DRM.samplers ())
39
+ Smps.push_back (RI.getAsMetadata (Context));
40
+
41
+ Metadata *SRVMD = SRVs.empty () ? nullptr : MDNode::get (Context, SRVs);
42
+ Metadata *UAVMD = UAVs.empty () ? nullptr : MDNode::get (Context, UAVs);
43
+ Metadata *CBufMD = CBufs.empty () ? nullptr : MDNode::get (Context, CBufs);
44
+ Metadata *SmpMD = Smps.empty () ? nullptr : MDNode::get (Context, Smps);
45
+ bool HasResources = !DRM.empty ();
30
46
31
47
if (MDResources.hasUAVs ()) {
48
+ assert (!UAVMD && " Old and new UAV representations can't coexist" );
32
49
UAVMD = MDResources.writeUAVs (M);
33
50
HasResources = true ;
34
51
}
35
52
36
53
if (MDResources.hasCBuffers ()) {
54
+ assert (!CBufMD && " Old and new cbuffer representations can't coexist" );
37
55
CBufMD = MDResources.writeCBuffers (M);
38
56
HasResources = true ;
39
57
}
@@ -46,26 +64,28 @@ static void emitResourceMetadata(Module &M,
46
64
MDNode::get (M.getContext (), {SRVMD, UAVMD, CBufMD, SmpMD}));
47
65
}
48
66
49
- static void translateMetadata (Module &M, const dxil::Resources &MDResources,
67
+ static void translateMetadata (Module &M, const DXILResourceMap &DRM,
68
+ const dxil::Resources &MDResources,
50
69
const ComputedShaderFlags &ShaderFlags) {
51
70
dxil::ValidatorVersionMD ValVerMD (M);
52
71
if (ValVerMD.isEmpty ())
53
72
ValVerMD.update (VersionTuple (1 , 0 ));
54
73
dxil::createShaderModelMD (M);
55
74
dxil::createDXILVersionMD (M);
56
75
57
- emitResourceMetadata (M, MDResources);
76
+ emitResourceMetadata (M, DRM, MDResources);
58
77
59
78
dxil::createEntryMD (M, static_cast <uint64_t >(ShaderFlags));
60
79
}
61
80
62
81
PreservedAnalyses DXILTranslateMetadata::run (Module &M,
63
82
ModuleAnalysisManager &MAM) {
83
+ const DXILResourceMap &DRM = MAM.getResult <DXILResourceAnalysis>(M);
64
84
const dxil::Resources &MDResources = MAM.getResult <DXILResourceMDAnalysis>(M);
65
85
const ComputedShaderFlags &ShaderFlags =
66
86
MAM.getResult <ShaderFlagsAnalysis>(M);
67
87
68
- translateMetadata (M, MDResources, ShaderFlags);
88
+ translateMetadata (M, DRM, MDResources, ShaderFlags);
69
89
70
90
return PreservedAnalyses::all ();
71
91
}
@@ -80,17 +100,20 @@ class DXILTranslateMetadataLegacy : public ModulePass {
80
100
81
101
void getAnalysisUsage (AnalysisUsage &AU) const override {
82
102
AU.setPreservesAll ();
103
+ AU.addRequired <DXILResourceWrapperPass>();
83
104
AU.addRequired <DXILResourceMDWrapper>();
84
105
AU.addRequired <ShaderFlagsAnalysisWrapper>();
85
106
}
86
107
87
108
bool runOnModule (Module &M) override {
109
+ const DXILResourceMap &DRM =
110
+ getAnalysis<DXILResourceWrapperPass>().getResourceMap ();
88
111
const dxil::Resources &MDResources =
89
112
getAnalysis<DXILResourceMDWrapper>().getDXILResource ();
90
113
const ComputedShaderFlags &ShaderFlags =
91
114
getAnalysis<ShaderFlagsAnalysisWrapper>().getShaderFlags ();
92
115
93
- translateMetadata (M, MDResources, ShaderFlags);
116
+ translateMetadata (M, DRM, MDResources, ShaderFlags);
94
117
return true ;
95
118
}
96
119
};
@@ -105,6 +128,7 @@ ModulePass *llvm::createDXILTranslateMetadataLegacyPass() {
105
128
106
129
INITIALIZE_PASS_BEGIN (DXILTranslateMetadataLegacy, " dxil-translate-metadata" ,
107
130
" DXIL Translate Metadata" , false , false )
131
+ INITIALIZE_PASS_DEPENDENCY(DXILResourceWrapperPass)
108
132
INITIALIZE_PASS_DEPENDENCY(DXILResourceMDWrapper)
109
133
INITIALIZE_PASS_DEPENDENCY(ShaderFlagsAnalysisWrapper)
110
134
INITIALIZE_PASS_END(DXILTranslateMetadataLegacy, " dxil-translate-metadata" ,
0 commit comments