1313#include " DXILShaderFlags.h"
1414#include " DirectX.h"
1515#include " llvm/ADT/StringSet.h"
16+ #include " llvm/Analysis/DXILResource.h"
1617#include " llvm/IR/Constants.h"
1718#include " llvm/IR/Metadata.h"
1819#include " llvm/IR/Module.h"
20+ #include " llvm/InitializePasses.h"
1921#include " llvm/Pass.h"
2022#include " llvm/TargetParser/Triple.h"
2123
2224using namespace llvm ;
2325using namespace llvm ::dxil;
2426
25- static void emitResourceMetadata (Module &M,
27+ static void emitResourceMetadata (Module &M, const DXILResourceMap &DRM,
2628 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 ();
3046
3147 if (MDResources.hasUAVs ()) {
48+ assert (!UAVMD && " Old and new UAV representations can't coexist" );
3249 UAVMD = MDResources.writeUAVs (M);
3350 HasResources = true ;
3451 }
3552
3653 if (MDResources.hasCBuffers ()) {
54+ assert (!CBufMD && " Old and new cbuffer representations can't coexist" );
3755 CBufMD = MDResources.writeCBuffers (M);
3856 HasResources = true ;
3957 }
@@ -46,26 +64,28 @@ static void emitResourceMetadata(Module &M,
4664 MDNode::get (M.getContext (), {SRVMD, UAVMD, CBufMD, SmpMD}));
4765}
4866
49- static void translateMetadata (Module &M, const dxil::Resources &MDResources,
67+ static void translateMetadata (Module &M, const DXILResourceMap &DRM,
68+ const dxil::Resources &MDResources,
5069 const ComputedShaderFlags &ShaderFlags) {
5170 dxil::ValidatorVersionMD ValVerMD (M);
5271 if (ValVerMD.isEmpty ())
5372 ValVerMD.update (VersionTuple (1 , 0 ));
5473 dxil::createShaderModelMD (M);
5574 dxil::createDXILVersionMD (M);
5675
57- emitResourceMetadata (M, MDResources);
76+ emitResourceMetadata (M, DRM, MDResources);
5877
5978 dxil::createEntryMD (M, static_cast <uint64_t >(ShaderFlags));
6079}
6180
6281PreservedAnalyses DXILTranslateMetadata::run (Module &M,
6382 ModuleAnalysisManager &MAM) {
83+ const DXILResourceMap &DRM = MAM.getResult <DXILResourceAnalysis>(M);
6484 const dxil::Resources &MDResources = MAM.getResult <DXILResourceMDAnalysis>(M);
6585 const ComputedShaderFlags &ShaderFlags =
6686 MAM.getResult <ShaderFlagsAnalysis>(M);
6787
68- translateMetadata (M, MDResources, ShaderFlags);
88+ translateMetadata (M, DRM, MDResources, ShaderFlags);
6989
7090 return PreservedAnalyses::all ();
7191}
@@ -80,17 +100,20 @@ class DXILTranslateMetadataLegacy : public ModulePass {
80100
81101 void getAnalysisUsage (AnalysisUsage &AU) const override {
82102 AU.setPreservesAll ();
103+ AU.addRequired <DXILResourceWrapperPass>();
83104 AU.addRequired <DXILResourceMDWrapper>();
84105 AU.addRequired <ShaderFlagsAnalysisWrapper>();
85106 }
86107
87108 bool runOnModule (Module &M) override {
109+ const DXILResourceMap &DRM =
110+ getAnalysis<DXILResourceWrapperPass>().getResourceMap ();
88111 const dxil::Resources &MDResources =
89112 getAnalysis<DXILResourceMDWrapper>().getDXILResource ();
90113 const ComputedShaderFlags &ShaderFlags =
91114 getAnalysis<ShaderFlagsAnalysisWrapper>().getShaderFlags ();
92115
93- translateMetadata (M, MDResources, ShaderFlags);
116+ translateMetadata (M, DRM, MDResources, ShaderFlags);
94117 return true ;
95118 }
96119};
@@ -105,6 +128,7 @@ ModulePass *llvm::createDXILTranslateMetadataLegacyPass() {
105128
106129INITIALIZE_PASS_BEGIN (DXILTranslateMetadataLegacy, " dxil-translate-metadata" ,
107130 " DXIL Translate Metadata" , false , false )
131+ INITIALIZE_PASS_DEPENDENCY(DXILResourceWrapperPass)
108132INITIALIZE_PASS_DEPENDENCY(DXILResourceMDWrapper)
109133INITIALIZE_PASS_DEPENDENCY(ShaderFlagsAnalysisWrapper)
110134INITIALIZE_PASS_END(DXILTranslateMetadataLegacy, " dxil-translate-metadata" ,
0 commit comments