181ad6265SDimitry Andric //===- DXILTranslateMetadata.cpp - Pass to emit DXIL metadata ---*- C++ -*-===// 281ad6265SDimitry Andric // 381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 681ad6265SDimitry Andric // 781ad6265SDimitry Andric //===----------------------------------------------------------------------===// 881ad6265SDimitry Andric /// 981ad6265SDimitry Andric //===----------------------------------------------------------------------===// 1081ad6265SDimitry Andric 11*bdd1243dSDimitry Andric #include "DXILMetadata.h" 12*bdd1243dSDimitry Andric #include "DXILResource.h" 13*bdd1243dSDimitry Andric #include "DXILResourceAnalysis.h" 14*bdd1243dSDimitry Andric #include "DXILShaderFlags.h" 1581ad6265SDimitry Andric #include "DirectX.h" 1681ad6265SDimitry Andric #include "llvm/ADT/StringSet.h" 1781ad6265SDimitry Andric #include "llvm/ADT/Triple.h" 1881ad6265SDimitry Andric #include "llvm/IR/Constants.h" 1981ad6265SDimitry Andric #include "llvm/IR/Metadata.h" 2081ad6265SDimitry Andric #include "llvm/IR/Module.h" 2181ad6265SDimitry Andric #include "llvm/Pass.h" 2281ad6265SDimitry Andric 2381ad6265SDimitry Andric using namespace llvm; 24*bdd1243dSDimitry Andric using namespace llvm::dxil; 2581ad6265SDimitry Andric 2681ad6265SDimitry Andric namespace { 2781ad6265SDimitry Andric class DXILTranslateMetadata : public ModulePass { 2881ad6265SDimitry Andric public: 2981ad6265SDimitry Andric static char ID; // Pass identification, replacement for typeid 30*bdd1243dSDimitry Andric explicit DXILTranslateMetadata() : ModulePass(ID) {} 3181ad6265SDimitry Andric 3281ad6265SDimitry Andric StringRef getPassName() const override { return "DXIL Metadata Emit"; } 3381ad6265SDimitry Andric 34*bdd1243dSDimitry Andric void getAnalysisUsage(AnalysisUsage &AU) const override { 35*bdd1243dSDimitry Andric AU.setPreservesAll(); 36*bdd1243dSDimitry Andric AU.addRequired<DXILResourceWrapper>(); 37*bdd1243dSDimitry Andric AU.addRequired<ShaderFlagsAnalysisWrapper>(); 38*bdd1243dSDimitry Andric } 3981ad6265SDimitry Andric 40*bdd1243dSDimitry Andric bool runOnModule(Module &M) override; 4181ad6265SDimitry Andric }; 4281ad6265SDimitry Andric 4381ad6265SDimitry Andric } // namespace 4481ad6265SDimitry Andric 4581ad6265SDimitry Andric bool DXILTranslateMetadata::runOnModule(Module &M) { 46*bdd1243dSDimitry Andric 47*bdd1243dSDimitry Andric dxil::ValidatorVersionMD ValVerMD(M); 48*bdd1243dSDimitry Andric if (ValVerMD.isEmpty()) 49*bdd1243dSDimitry Andric ValVerMD.update(VersionTuple(1, 0)); 50*bdd1243dSDimitry Andric dxil::createShaderModelMD(M); 51*bdd1243dSDimitry Andric 52*bdd1243dSDimitry Andric const dxil::Resources &Res = 53*bdd1243dSDimitry Andric getAnalysis<DXILResourceWrapper>().getDXILResource(); 54*bdd1243dSDimitry Andric Res.write(M); 55*bdd1243dSDimitry Andric 56*bdd1243dSDimitry Andric const uint64_t Flags = 57*bdd1243dSDimitry Andric (uint64_t)(getAnalysis<ShaderFlagsAnalysisWrapper>().getShaderFlags()); 58*bdd1243dSDimitry Andric dxil::createEntryMD(M, Flags); 59*bdd1243dSDimitry Andric 6081ad6265SDimitry Andric return false; 6181ad6265SDimitry Andric } 6281ad6265SDimitry Andric 6381ad6265SDimitry Andric char DXILTranslateMetadata::ID = 0; 6481ad6265SDimitry Andric 6581ad6265SDimitry Andric ModulePass *llvm::createDXILTranslateMetadataPass() { 6681ad6265SDimitry Andric return new DXILTranslateMetadata(); 6781ad6265SDimitry Andric } 6881ad6265SDimitry Andric 69*bdd1243dSDimitry Andric INITIALIZE_PASS_BEGIN(DXILTranslateMetadata, "dxil-metadata-emit", 70*bdd1243dSDimitry Andric "DXIL Metadata Emit", false, false) 71*bdd1243dSDimitry Andric INITIALIZE_PASS_DEPENDENCY(DXILResourceWrapper) 72*bdd1243dSDimitry Andric INITIALIZE_PASS_DEPENDENCY(ShaderFlagsAnalysisWrapper) 73*bdd1243dSDimitry Andric INITIALIZE_PASS_END(DXILTranslateMetadata, "dxil-metadata-emit", 7481ad6265SDimitry Andric "DXIL Metadata Emit", false, false) 75