Przeglądaj źródła

Move pix pass into DxilPIXPasses. (#1605)

* Move pix pass into DxilPIXPasses.
Xiang Li 6 lat temu
rodzic
commit
016e70532e

+ 2 - 3
include/dxc/DXIL/DxilMetadataHelper.h

@@ -48,7 +48,6 @@ class DxilFieldAnnotation;
 class DxilFunctionAnnotation;
 class DxilParameterAnnotation;
 class RootSignatureHandle;
-class DxilViewIdState;
 struct DxilFunctionProps;
 
 /// Use this class to manipulate DXIL-spcific metadata.
@@ -353,8 +352,8 @@ public:
                                 uint32_t &autoBindingSpace);
 
   // ViewId state.
-  void EmitDxilViewIdState(DxilViewIdState &ViewIdState);
-  void LoadDxilViewIdState(DxilViewIdState &ViewIdState);
+  void EmitDxilViewIdState(std::vector<unsigned> &SerializedState);
+  void LoadDxilViewIdState(std::vector<unsigned> &SerializedState);
   // Control flow hints.
   static llvm::MDNode *EmitControlFlowHints(llvm::LLVMContext &Ctx, std::vector<DXIL::ControlFlowHint> &hints);
 

+ 4 - 5
include/dxc/DXIL/DxilModule.h

@@ -19,7 +19,6 @@
 #include "dxc/DXIL/DxilSignature.h"
 #include "dxc/DXIL/DxilConstants.h"
 #include "dxc/DXIL/DxilTypeSystem.h"
-#include "dxc/HLSL/ComputeViewIdState.h"
 
 #include <memory>
 #include <string>
@@ -161,8 +160,8 @@ public:
   void ClearLLVMUsed();
 
   // ViewId state.
-  DxilViewIdState &GetViewIdState();
-  const DxilViewIdState &GetViewIdState() const;
+  std::vector<unsigned> &GetSerializedViewIdState();
+  const std::vector<unsigned> &GetSerializedViewIdState() const;
 
   // DXIL metadata manipulation.
   /// Clear all DXIL data that exists in in-memory form.
@@ -312,8 +311,8 @@ private:
   // Keeps track of patch constant functions used by hull shaders
   std::unordered_set<const llvm::Function *>  m_PatchConstantFunctions;
 
-  // ViewId state.
-  std::unique_ptr<DxilViewIdState> m_pViewIdState;
+  // Serialized ViewId state.
+  std::vector<unsigned> m_SerializedState;
 
   // DXIL metadata serialization/deserialization.
   llvm::MDTuple *EmitDxilResources();

+ 2 - 0
include/dxc/HLSL/DxilPIXPasses.h → include/dxc/DxilPIXPasses/DxilPIXPasses.h

@@ -12,6 +12,8 @@
 #pragma once
 
 namespace llvm {
+class ModulePass;
+class PassRegistry;
 
 ModulePass *createDxilAddPixelHitInstrumentationPass();
 ModulePass *createDxilOutputColorBecomesConstantPass();

+ 2 - 3
include/dxc/HLSL/ComputeViewIdState.h

@@ -66,8 +66,6 @@ struct DxilViewIdStateData {
   InputsContributingToOutputType m_InputsContributingToPCOutputs; // HS PC only.
   InputsContributingToOutputType m_PCInputsContributingToOutputs; // DS only.
 
-  // Serialized form.
-  std::vector<unsigned> m_SerializedState;
   bool m_bUsesViewId = false;
 };
 
@@ -98,7 +96,8 @@ public:
 
 private:
   DxilModule *m_pModule;
-
+  // Serialized form.
+  std::vector<unsigned> m_SerializedState;
   void Clear();
 };
 

+ 1 - 0
lib/CMakeLists.txt

@@ -23,4 +23,5 @@ add_subdirectory(ProfileData)
 add_subdirectory(DxcSupport) # HLSL Change
 add_subdirectory(HLSL) # HLSL Change
 add_subdirectory(DXIL) # HLSL Change
+add_subdirectory(DxilPIXPasses) # HLSL Change
 add_subdirectory(DxrFallback) # HLSL Change

+ 8 - 5
lib/DXIL/DxilMetadataHelper.cpp

@@ -1273,8 +1273,8 @@ DxilMDHelper::EmitDxilFunctionProps(const hlsl::DxilFunctionProps *props,
   return MDTuple::get(m_Ctx, ArrayRef<llvm::Metadata *>(MDVals, valIdx));
 }
 
-void DxilMDHelper::EmitDxilViewIdState(DxilViewIdState &ViewIdState) {
-  const vector<unsigned> &Data = ViewIdState.GetSerialized();
+void DxilMDHelper::EmitDxilViewIdState(std::vector<unsigned> &SerializedState) {
+  const vector<unsigned> &Data = SerializedState;
   // If all UINTs are zero, do not emit ViewIdState.
   if (!std::any_of(Data.begin(), Data.end(), [](unsigned e){return e!=0;}))
     return;
@@ -1286,7 +1286,7 @@ void DxilMDHelper::EmitDxilViewIdState(DxilViewIdState &ViewIdState) {
   pViewIdNamedMD->addOperand(MDNode::get(m_Ctx, {ConstantAsMetadata::get(V)}));
 }
 
-void DxilMDHelper::LoadDxilViewIdState(DxilViewIdState &ViewIdState) {
+void DxilMDHelper::LoadDxilViewIdState(std::vector<unsigned> &SerializedState) {
   NamedMDNode *pViewIdStateNamedMD = m_pModule->getNamedMetadata(kDxilViewIdStateMDName);
   if(!pViewIdStateNamedMD)
     return;
@@ -1307,8 +1307,11 @@ void DxilMDHelper::LoadDxilViewIdState(DxilViewIdState &ViewIdState) {
   IFTBOOL(pData->getRawDataValues().size() < UINT_MAX && 
           (pData->getRawDataValues().size() & 3) == 0, DXC_E_INCORRECT_DXIL_METADATA);
 
-  ViewIdState.Deserialize((const unsigned *)pData->getRawDataValues().begin(),
-                          (unsigned)pData->getRawDataValues().size() / 4);
+  SerializedState.clear();
+  unsigned size = (unsigned)pData->getRawDataValues().size() / 4;
+  SerializedState.resize(size);
+  const unsigned *Ptr = (const unsigned *)pData->getRawDataValues().begin();
+  memcpy(SerializedState.data(), Ptr, size * sizeof(unsigned));
 }
 
 MDNode *DxilMDHelper::EmitControlFlowHints(llvm::LLVMContext &Ctx, std::vector<DXIL::ControlFlowHint> &hints) {

+ 7 - 7
lib/DXIL/DxilModule.cpp

@@ -29,6 +29,7 @@
 #include "llvm/IR/DiagnosticInfo.h"
 #include "llvm/IR/DiagnosticPrinter.h"
 #include "llvm/Support/raw_ostream.h"
+#include "llvm/ADT/STLExtras.h"
 #include <unordered_set>
 
 using namespace llvm;
@@ -95,7 +96,6 @@ DxilModule::DxilModule(Module *pModule)
 , m_ValMinor(0)
 , m_pOP(llvm::make_unique<OP>(pModule->getContext(), pModule))
 , m_pTypeSystem(llvm::make_unique<DxilTypeSystem>(pModule))
-, m_pViewIdState(llvm::make_unique<DxilViewIdState>(this))
 , m_bDisableOptimizations(false)
 , m_bUseMinPrecision(true) // use min precision by default
 , m_bAllResourcesBound(false)
@@ -1054,11 +1054,11 @@ DxilTypeSystem &DxilModule::GetTypeSystem() {
   return *m_pTypeSystem;
 }
 
-DxilViewIdState &DxilModule::GetViewIdState() {
-  return *m_pViewIdState;
+std::vector<unsigned> &DxilModule::GetSerializedViewIdState() {
+  return m_SerializedState;
 }
-const DxilViewIdState &DxilModule::GetViewIdState() const {
-  return *m_pViewIdState;
+const std::vector<unsigned> &DxilModule::GetSerializedViewIdState() const {
+  return m_SerializedState;
 }
 
 void DxilModule::ResetTypeSystem(DxilTypeSystem *pValue) {
@@ -1183,7 +1183,7 @@ void DxilModule::EmitDxilMetadata() {
   if (!m_pSM->IsLib() && !m_pSM->IsCS() &&
       ((m_ValMajor == 0 &&  m_ValMinor == 0) ||
        (m_ValMajor > 1 || (m_ValMajor == 1 && m_ValMinor >= 1)))) {
-    m_pMDHelper->EmitDxilViewIdState(GetViewIdState());
+    m_pMDHelper->EmitDxilViewIdState(m_SerializedState);
   }
   EmitLLVMUsed();
   MDTuple *pEntry = m_pMDHelper->EmitDxilEntryPointTuple(GetEntryFunction(), m_EntryName, pMDSignatures, pMDResources, pMDProperties);
@@ -1320,7 +1320,7 @@ void DxilModule::LoadDxilMetadata() {
 
   m_pMDHelper->LoadRootSignature(*m_RootSignature.get());
 
-  m_pMDHelper->LoadDxilViewIdState(*m_pViewIdState.get());
+  m_pMDHelper->LoadDxilViewIdState(m_SerializedState);
 }
 
 MDTuple *DxilModule::EmitDxilResources() {

+ 1 - 0
lib/DXIL/DxilOperations.cpp

@@ -13,6 +13,7 @@
 #include "dxc/Support/Global.h"
 #include "dxc/DXIL/DxilModule.h"
 
+#include "llvm/Support/raw_ostream.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/IR/LLVMContext.h"
 #include "llvm/IR/Module.h"

+ 18 - 0
lib/DxilPIXPasses/CMakeLists.txt

@@ -0,0 +1,18 @@
+# Copyright (C) Microsoft Corporation. All rights reserved.
+# This file is distributed under the University of Illinois Open Source License. See LICENSE.TXT for details.
+add_llvm_library(LLVMDxilPIXPasses
+  DxilAddPixelHitInstrumentation.cpp
+  DxilDebugInstrumentation.cpp
+  DxilForceEarlyZ.cpp
+  DxilOutputColorBecomesConstant.cpp
+  DxilRemoveDiscards.cpp
+  DxilReduceMSAAToSingleSample.cpp
+  DxilShaderAccessTracking.cpp
+  DxilPIXPasses.cpp
+
+
+  ADDITIONAL_HEADER_DIRS
+  ${LLVM_MAIN_INCLUDE_DIR}/llvm/IR
+)
+
+add_dependencies(LLVMDxilPIXPasses intrinsics_gen)

+ 1 - 1
lib/HLSL/DxilAddPixelHitInstrumentation.cpp → lib/DxilPIXPasses/DxilAddPixelHitInstrumentation.cpp

@@ -14,7 +14,7 @@
 #include "dxc/DXIL/DxilOperations.h"
 #include "dxc/DXIL/DxilInstructions.h"
 #include "dxc/DXIL/DxilModule.h"
-#include "dxc/HLSL/DxilPIXPasses.h"
+#include "dxc/DxilPIXPasses/DxilPIXPasses.h"
 #include "dxc/DXIL/DxilUtil.h"
 
 #include "llvm/IR/PassManager.h"

+ 2 - 2
lib/HLSL/DxilDebugInstrumentation.cpp → lib/DxilPIXPasses/DxilDebugInstrumentation.cpp

@@ -12,14 +12,14 @@
 #include "dxc/HLSL/DxilGenerationPass.h"
 #include "dxc/DXIL/DxilModule.h"
 #include "dxc/DXIL/DxilOperations.h"
-#include "dxc/HLSL/DxilPIXPasses.h"
+#include "dxc/DxilPIXPasses/DxilPIXPasses.h"
 #include "dxc/DXIL/DxilUtil.h"
 
 #include "llvm/IR/Module.h"
 #include "llvm/IR/Constants.h"
 #include "llvm/IR/InstIterator.h"
 #include "llvm/IR/IRBuilder.h"
-
+#include "llvm/ADT/STLExtras.h"
 
 using namespace llvm;
 using namespace hlsl;

+ 1 - 1
lib/HLSL/DxilForceEarlyZ.cpp → lib/DxilPIXPasses/DxilForceEarlyZ.cpp

@@ -11,7 +11,7 @@
 
 #include "dxc/HLSL/DxilGenerationPass.h"
 #include "dxc/DXIL/DxilModule.h"
-#include "dxc/HLSL/DxilPIXPasses.h"
+#include "dxc/DxilPIXPasses/DxilPIXPasses.h"
 #include "llvm/IR/Module.h"
 
 using namespace llvm;

+ 1 - 1
lib/HLSL/DxilOutputColorBecomesConstant.cpp → lib/DxilPIXPasses/DxilOutputColorBecomesConstant.cpp

@@ -13,7 +13,7 @@
 #include "dxc/HLSL/DxilGenerationPass.h"
 #include "dxc/DXIL/DxilModule.h"
 #include "dxc/DXIL/DxilOperations.h"
-#include "dxc/HLSL/DxilPIXPasses.h"
+#include "dxc/DxilPIXPasses/DxilPIXPasses.h"
 #include "dxc/HLSL/DxilSpanAllocator.h"
 
 #include "llvm/IR/PassManager.h"

+ 46 - 0
lib/DxilPIXPasses/DxilPIXPasses.cpp

@@ -0,0 +1,46 @@
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// DxilPIXPasses.cpp                                                         //
+// Copyright (C) Microsoft Corporation. All rights reserved.                 //
+// This file is distributed under the University of Illinois Open Source     //
+// License. See LICENSE.TXT for details.                                     //
+//                                                                           //
+// Provides SetupRegistryPassForPIX.                                         //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+
+#include "dxc/Support/WinIncludes.h"
+#include "dxc/Support/Global.h"
+#include "dxc/DxilPIXPasses/DxilPIXPasses.h"
+
+#include "llvm/Pass.h"
+#include "llvm/PassInfo.h"
+#include "llvm/Support/SourceMgr.h"
+#include "llvm/IR/LegacyPassManager.h"
+#include "llvm/Transforms/IPO/PassManagerBuilder.h"
+
+using namespace llvm;
+using namespace hlsl;
+
+namespace hlsl {
+
+HRESULT SetupRegistryPassForPIX() {
+  try
+  {
+    PassRegistry &Registry = *PassRegistry::getPassRegistry();
+    /* <py::lines('INIT-PASSES')>hctdb_instrhelp.get_init_passes(set(["pix"]))</py>*/
+    // INIT-PASSES:BEGIN
+    initializeDxilAddPixelHitInstrumentationPass(Registry);
+    initializeDxilDebugInstrumentationPass(Registry);
+    initializeDxilForceEarlyZPass(Registry);
+    initializeDxilOutputColorBecomesConstantPass(Registry);
+    initializeDxilReduceMSAAToSingleSamplePass(Registry);
+    initializeDxilRemoveDiscardsPass(Registry);
+    initializeDxilShaderAccessTrackingPass(Registry);
+    // INIT-PASSES:END
+  }
+  CATCH_CPP_RETURN_HRESULT();
+  return S_OK;
+}
+
+}

+ 1 - 1
lib/HLSL/DxilReduceMSAAToSingleSample.cpp → lib/DxilPIXPasses/DxilReduceMSAAToSingleSample.cpp

@@ -13,7 +13,7 @@
 #include "dxc/DXIL/DxilOperations.h"
 #include "dxc/DXIL/DxilInstructions.h"
 #include "dxc/DXIL/DxilModule.h"
-#include "dxc/HLSL/DxilPIXPasses.h"
+#include "dxc/DxilPIXPasses/DxilPIXPasses.h"
 
 #include "llvm/IR/Instructions.h"
 #include "llvm/IR/PassManager.h"

+ 1 - 1
lib/HLSL/DxilRemoveDiscards.cpp → lib/DxilPIXPasses/DxilRemoveDiscards.cpp

@@ -12,7 +12,7 @@
 #include "dxc/HLSL/DxilGenerationPass.h"
 #include "dxc/DXIL/DxilModule.h"
 #include "dxc/DXIL/DxilOperations.h"
-#include "dxc/HLSL/DxilPIXPasses.h"
+#include "dxc/DxilPIXPasses/DxilPIXPasses.h"
 
 #include "llvm/IR/Instructions.h"
 #include "llvm/IR/PassManager.h"

+ 1 - 1
lib/HLSL/DxilShaderAccessTracking.cpp → lib/DxilPIXPasses/DxilShaderAccessTracking.cpp

@@ -14,7 +14,7 @@
 #include "dxc/DXIL/DxilOperations.h"
 #include "dxc/DXIL/DxilInstructions.h"
 #include "dxc/DXIL/DxilModule.h"
-#include "dxc/HLSL/DxilPIXPasses.h"
+#include "dxc/DxilPIXPasses/DxilPIXPasses.h"
 #include "dxc/HLSL/DxilSpanAllocator.h"
 
 #include "llvm/IR/PassManager.h"

+ 16 - 0
lib/DxilPIXPasses/LLVMBuild.txt

@@ -0,0 +1,16 @@
+; Copyright (C) Microsoft Corporation. All rights reserved.
+; This file is distributed under the University of Illinois Open Source License. See LICENSE.TXT for details.
+;
+; This is an LLVMBuild description file for the components in this subdirectory.
+;
+; For more information on the LLVMBuild system, please see:
+;
+;   http://llvm.org/docs/LLVMBuild.html
+;
+;===------------------------------------------------------------------------===;
+
+[component_0]
+type = Library
+name = DxilPIXPasses
+parent = Libraries
+required_libraries = BitReader Core DxcSupport IPA Support

+ 0 - 7
lib/HLSL/CMakeLists.txt

@@ -4,27 +4,20 @@ add_llvm_library(LLVMHLSL
   ComputeViewIdState.cpp
   ComputeViewIdStateBuilder.cpp
   ControlDependence.cpp
-  DxilAddPixelHitInstrumentation.cpp
   DxilCondenseResources.cpp
   DxilContainerAssembler.cpp
   DxilContainerReflection.cpp
   DxilConvergent.cpp
-  DxilDebugInstrumentation.cpp
   DxilEliminateOutputDynamicIndexing.cpp
   DxilExpandTrigIntrinsics.cpp
-  DxilForceEarlyZ.cpp
   DxilGenerationPass.cpp
   DxilLegalizeSampleOffsetPass.cpp
   DxilLinker.cpp
-  DxilOutputColorBecomesConstant.cpp
   DxilPreparePasses.cpp
-  DxilRemoveDiscards.cpp
-  DxilReduceMSAAToSingleSample.cpp
   DxilPackSignatureElement.cpp
   DxilPatchShaderRecordBindings.cpp
   DxilPreserveAllOutputs.cpp
   DxilRootSignature.cpp
-  DxilShaderAccessTracking.cpp
   DxilSignatureValidation.cpp
   DxilTargetLowering.cpp
   DxilTargetTransformInfo.cpp

+ 2 - 2
lib/HLSL/ComputeViewIdState.cpp

@@ -38,8 +38,8 @@ using std::unordered_map;
 
 #define DEBUG_TYPE "viewid"
 
-
-DxilViewIdState::DxilViewIdState(DxilModule *pDxilModule) : m_pModule(pDxilModule) {}
+DxilViewIdState::DxilViewIdState(DxilModule *pDxilModule)
+    : m_pModule(pDxilModule) {}
 unsigned DxilViewIdState::getNumInputSigScalars() const                   { return m_NumInputSigScalars; }
 unsigned DxilViewIdState::getNumOutputSigScalars(unsigned StreamId) const { return m_NumOutputSigScalars[StreamId]; }
 unsigned DxilViewIdState::getNumPCSigScalars() const                      { return m_NumPCSigScalars; }

+ 9 - 6
lib/HLSL/ComputeViewIdStateBuilder.cpp

@@ -60,7 +60,6 @@ public:
                                       DxilViewIdStateData::kNumStreams),
         m_InputsContributingToPCOutputs(state.m_InputsContributingToPCOutputs),
         m_PCInputsContributingToOutputs(state.m_PCInputsContributingToOutputs),
-        m_SerializedState(state.m_SerializedState),
         m_bUsesViewId(state.m_bUsesViewId) {}
 
   void Compute();
@@ -83,9 +82,6 @@ private:
   InputsContributingToOutputType &m_InputsContributingToPCOutputs; // HS PC only.
   InputsContributingToOutputType &m_PCInputsContributingToOutputs; // DS only.
 
-  // Serialized form.
-  std::vector<unsigned> &m_SerializedState;
-
   bool &m_bUsesViewId;
 
   // Members for build ViewIdState.
@@ -248,7 +244,6 @@ void DxilViewIdStateBuilder::Clear() {
   m_PCEntry.Clear();
   m_FuncInfo.clear();
   m_ReachingDeclsCache.clear();
-  m_SerializedState.clear();
 }
 
 void DxilViewIdStateBuilder::EntryInfo::Clear() {
@@ -860,9 +855,17 @@ bool ComputeViewIdState::runOnModule(Module &M) {
   DxilModule &DxilModule = M.GetOrCreateDxilModule();
   const ShaderModel *pSM = DxilModule.GetShaderModel();
   if (!pSM->IsCS() && !pSM->IsLib()) {
-    DxilViewIdState &ViewIdState = DxilModule.GetViewIdState();
+    DxilViewIdState ViewIdState(&DxilModule);
     DxilViewIdStateBuilder Builder(ViewIdState, &DxilModule);
     Builder.Compute();
+    // Serialize viewidstate.
+    ViewIdState.Serialize();
+    auto &TmpSerialized = ViewIdState.GetSerialized();
+    // Copy serilized viewidstate.
+    auto &SerializedViewIdState = DxilModule.GetSerializedViewIdState();
+    SerializedViewIdState.clear();
+    SerializedViewIdState.resize(TmpSerialized.size());
+    SerializedViewIdState.assign(TmpSerialized.begin(), TmpSerialized.end());
     return true;
   }
   return false;

+ 1 - 9
lib/HLSL/DxcOptimizer.cpp

@@ -16,7 +16,6 @@
 #include "dxc/DXIL/DxilContainer.h"
 #include "dxc/Support/FileIOHelper.h"
 #include "dxc/DXIL/DxilModule.h"
-#include "dxc/HLSL/DxilPIXPasses.h"
 #include "dxc/HLSL/ReducibilityAnalysis.h"
 #include "dxc/HLSL/HLMatrixLowerPass.h"
 #include "dxc/HLSL/DxilGenerationPass.h"
@@ -65,7 +64,7 @@ HRESULT SetupRegistryPassForHLSL() {
   try
   {
     PassRegistry &Registry = *PassRegistry::getPassRegistry();
-    /* <py::lines('INIT-PASSES')>hctdb_instrhelp.get_init_passes()</py>*/
+    /* <py::lines('INIT-PASSES')>hctdb_instrhelp.get_init_passes(set(["llvm", "dxil_gen"]))</py>*/
     // INIT-PASSES:BEGIN
     initializeADCEPass(Registry);
     initializeAddDiscriminatorsPass(Registry);
@@ -85,32 +84,25 @@ HRESULT SetupRegistryPassForHLSL() {
     initializeDCEPass(Registry);
     initializeDSEPass(Registry);
     initializeDeadInstEliminationPass(Registry);
-    initializeDxilAddPixelHitInstrumentationPass(Registry);
     initializeDxilAllocateResourcesForLibPass(Registry);
     initializeDxilCondenseResourcesPass(Registry);
     initializeDxilConvergentClearPass(Registry);
     initializeDxilConvergentMarkPass(Registry);
     initializeDxilDeadFunctionEliminationPass(Registry);
-    initializeDxilDebugInstrumentationPass(Registry);
     initializeDxilEliminateOutputDynamicIndexingPass(Registry);
     initializeDxilEmitMetadataPass(Registry);
     initializeDxilExpandTrigIntrinsicsPass(Registry);
     initializeDxilFinalizeModulePass(Registry);
-    initializeDxilForceEarlyZPass(Registry);
     initializeDxilGenerationPassPass(Registry);
     initializeDxilLegalizeEvalOperationsPass(Registry);
     initializeDxilLegalizeResourcesPass(Registry);
     initializeDxilLegalizeSampleOffsetPassPass(Registry);
     initializeDxilLoadMetadataPass(Registry);
     initializeDxilLowerCreateHandleForLibPass(Registry);
-    initializeDxilOutputColorBecomesConstantPass(Registry);
     initializeDxilPrecisePropagatePassPass(Registry);
     initializeDxilPreserveAllOutputsPass(Registry);
     initializeDxilPromoteLocalResourcesPass(Registry);
     initializeDxilPromoteStaticResourcesPass(Registry);
-    initializeDxilReduceMSAAToSingleSamplePass(Registry);
-    initializeDxilRemoveDiscardsPass(Registry);
-    initializeDxilShaderAccessTrackingPass(Registry);
     initializeDxilTranslateRawBufferPass(Registry);
     initializeDynamicIndexingVectorToArrayPass(Registry);
     initializeEarlyCSELegacyPassPass(Registry);

+ 2 - 1
lib/HLSL/DxilContainerAssembler.cpp

@@ -15,6 +15,7 @@
 #include "llvm/IR/DebugInfo.h"
 #include "llvm/Bitcode/ReaderWriter.h"
 #include "llvm/Support/MD5.h"
+#include "llvm/ADT/STLExtras.h"
 #include "dxc/DXIL/DxilContainer.h"
 #include "dxc/DXIL/DxilModule.h"
 #include "dxc/DXIL/DxilShaderModel.h"
@@ -692,7 +693,7 @@ public:
       }
 
       // Gather ViewID dependency information
-      auto &viewState = m_Module.GetViewIdState().GetSerialized();
+      auto &viewState = m_Module.GetSerializedViewIdState();
       if (!viewState.empty()) {
         const uint32_t *pSrc = viewState.data();
         const uint32_t InputScalars = *(pSrc++);

+ 1 - 0
lib/HLSL/DxilGenerationPass.cpp

@@ -39,6 +39,7 @@
 #include "llvm/Transforms/Utils/SSAUpdater.h"
 #include "llvm/Analysis/AssumptionCache.h"
 #include "llvm/Transforms/Utils/PromoteMemToReg.h"
+#include "llvm/IR/Dominators.h"
 #include <memory>
 #include <unordered_set>
 #include <iterator>

+ 3 - 0
lib/HLSL/DxilLinker.cpp

@@ -26,6 +26,8 @@
 #include "llvm/Transforms/Utils/Cloning.h"
 #include "llvm/ADT/StringMap.h"
 #include "llvm/ADT/SetVector.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/Support/raw_ostream.h"
 #include <memory>
 #include <vector>
 
@@ -40,6 +42,7 @@
 #include "llvm/Transforms/Scalar.h"
 
 #include "dxc/HLSL/DxilExportMap.h"
+#include "dxc/HLSL/ComputeViewIdState.h"
 
 using namespace llvm;
 using namespace hlsl;

+ 2 - 1
lib/LLVMBuild.txt

@@ -23,6 +23,7 @@ subdirectories =
  CodeGen
  DebugInfo
  DxcSupport
+ DxilPIXPasses
  ExecutionEngine
  Linker
  IR
@@ -41,7 +42,7 @@ subdirectories =
  DXIL
  DxrFallback
 
-; HLSL Change: remove LibDriver, LineEditor, add HLSL, add DxrtFallback, add DXIL
+; HLSL Change: remove LibDriver, LineEditor, add HLSL, add DxrtFallback, add DXIL, add DxilPIXPasses
 
 [component_0]
 type = Group

+ 1 - 0
tools/clang/tools/dxcompiler/CMakeLists.txt

@@ -18,6 +18,7 @@ set(LLVM_LINK_COMPONENTS
 #  debuginfopdb # no support for PDB files
   dxcsupport
   dxil
+  dxilpixpasses # for DxcOptimizerPass
   hlsl
   instcombine
   ipa

+ 5 - 1
tools/clang/tools/dxcompiler/DXCompiler.cpp

@@ -19,7 +19,10 @@
 #endif
 #include "dxillib.h"
 
-namespace hlsl { HRESULT SetupRegistryPassForHLSL(); }
+namespace hlsl {
+HRESULT SetupRegistryPassForHLSL();
+HRESULT SetupRegistryPassForPIX();
+} // namespace hlsl
 
 // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
 #pragma warning( disable : 4290 )
@@ -56,6 +59,7 @@ static HRESULT InitMaybeFail() throw() {
   }
   fsSetup = true;
   IFC(hlsl::SetupRegistryPassForHLSL());
+  IFC(hlsl::SetupRegistryPassForPIX());
   IFC(DxilLibInitialize());
   if (hlsl::options::initHlslOptTable()) {
     hr = E_FAIL;

+ 5 - 1
tools/clang/tools/dxcompiler/dxcdisassembler.cpp

@@ -26,6 +26,7 @@
 #include "llvm/Support/FormattedStream.h"
 #include "llvm/Support/Format.h"
 #include "dxc/HLSL/DxilPipelineStateValidation.h"
+#include "dxc/HLSL/ComputeViewIdState.h"
 #include "dxc/DXIL/DxilContainer.h"
 #include "dxc/DXIL/DxilUtil.h"
 #include "dxcutil.h"
@@ -509,7 +510,10 @@ void PrintViewIdState(DxilModule &M, raw_string_ostream &OS,
     return;
 
   const ShaderModel *pSM = M.GetShaderModel();
-  DxilViewIdState &VID = M.GetViewIdState();
+
+  DxilViewIdState VID(&M);
+  auto &SerializedVID = M.GetSerializedViewIdState();
+  VID.Deserialize(SerializedVID.data(), SerializedVID.size());
   OS << comment << "\n";
   OS << comment << " ViewId state:\n";
   OS << comment << "\n";

+ 46 - 35
utils/hct/hctdb.py

@@ -73,7 +73,7 @@ class db_dxil_inst(object):
             setattr(self, k, v)
         self.is_dxil_op = self.dxil_op != "" # whether this is a DXIL operation
         self.is_reserved = self.dxil_class == "Reserved"
-        self.shader_model_translated = None # minimum shader model required with translation by linker
+        self.shader_model_translated = () # minimum shader model required with translation by linker
 
     def __str__(self):
         return self.name
@@ -109,6 +109,7 @@ class db_dxil_pass(object):
         self.args = []              # modifiers for the option
         self.type_name = ""         # name of the class that implements the pass
         self.doc = ""               # documentation for the pass
+        self.category_lib = ""      # lib which pass belongs to
         for k,v in kwargs.items():
             setattr(self, k, v)
 
@@ -1403,12 +1404,15 @@ class db_dxil(object):
     def populate_passes(self):
         # Populate passes and their options.
         p = self.passes
+        category_lib = "set this before add_pass"
         def add_pass(name, type_name, doc, opts):
-            apass = db_dxil_pass(name, type_name=type_name, doc=doc)
+            apass = db_dxil_pass(name, type_name=type_name, doc=doc, category_lib=category_lib)
             for o in opts:
                 assert 'n' in o, "option in %s has no 'n' member" % name
                 apass.args.append(db_dxil_pass_arg(o['n'], ident=o.get('i'), type_name=o.get('t'), is_ctor_param=o.get('c'), doc=o.get('d')))
             p.append(apass)
+
+        category_lib = "llvm"
         # Add discriminators is a DWARF 4 thing, useful for the profiler.
         # Consider removing lib\Transforms\Utils\AddDiscriminators.cpp altogether
         add_pass("add-discriminators", "AddDiscriminators", "Add DWARF path discriminators",
@@ -1442,7 +1446,6 @@ class db_dxil(object):
         add_pass("scoped-noalias", "ScopedNoAliasAA", "Scoped NoAlias Alias Analysis", [
             {'n':"enable-scoped-noalias", 'i':'EnableScopedNoAlias', 't':'bool', 'd':'Use to disable scoped no-alias'}])
         add_pass("basicaa", "BasicAliasAnalysis", "Basic Alias Analysis (stateless AA impl)", [])
-        add_pass("reg2mem_hlsl", "RegToMemHlsl", "Demote values with phi-node usage to stack slots", [])
         add_pass("simplifycfg", "CFGSimplifyPass", "Simplify the CFG", [
             {'n':'Threshold', 't':'int', 'c':1},
             {'n':'Ftor', 't':'std::function<bool(const Function &)>', 'c':1},
@@ -1472,11 +1475,43 @@ class db_dxil(object):
         add_pass('rewrite-symbols', 'RewriteSymbols', 'Rewrite Symbols', [
             {'n':'DL', 't':'SymbolRewriter::RewriteDescriptorList', 'c':1},
             {'n':'rewrite-map-file', 'i':'RewriteMapFiles', 't':'string'}])
-        add_pass('hlsl-hlensure', 'HLEnsureMetadata', 'HLSL High-Level Metadata Ensure', [])
         add_pass('mergefunc', 'MergeFunctions', 'Merge Functions', [
             {'n':'mergefunc-sanity', 'i':'NumFunctionsForSanityCheck', 't':'unsigned', 'd':"How many functions in module could be used for MergeFunctions pass sanity check. '0' disables this check. Works only with '-debug' key."}])
         # Consider removing GlobalExtensions globals altogether.
         add_pass('barrier', 'BarrierNoop', 'A No-Op Barrier Pass', [])
+        add_pass('dce', 'DCE', 'Dead Code Elimination', [])
+        add_pass('die', 'DeadInstElimination', 'Dead Instruction Elimination', [])
+        add_pass('globaldce', 'GlobalDCE', 'Dead Global Elimination', [])
+        add_pass('mem2reg', 'PromotePass', 'Promote Memory to Register', [])
+        add_pass('scalarizer', 'Scalarizer', 'Scalarize vector operations', [])
+
+        category_lib="pix"
+        add_pass('hlsl-dxil-add-pixel-hit-instrmentation', 'DxilAddPixelHitInstrumentation', 'DXIL Count completed PS invocations and costs', [
+            {'n':'force-early-z','t':'int','c':1},
+            {'n':'add-pixel-cost','t':'int','c':1},
+            {'n':'rt-width','t':'int','c':1},
+            {'n':'sv-position-index','t':'int','c':1},
+            {'n':'num-pixels','t':'int','c':1}])
+        add_pass('hlsl-dxil-constantColor', 'DxilOutputColorBecomesConstant', 'DXIL Constant Color Mod', [
+            {'n':'mod-mode','t':'int','c':1},
+            {'n':'constant-red','t':'float','c':1},
+            {'n':'constant-green','t':'float','c':1},
+            {'n':'constant-blue','t':'float','c':1},
+            {'n':'constant-alpha','t':'float','c':1}])
+        add_pass('hlsl-dxil-remove-discards', 'DxilRemoveDiscards', 'HLSL DXIL Remove all discard instructions', [])
+        add_pass('hlsl-dxil-force-early-z', 'DxilForceEarlyZ', 'HLSL DXIL Force the early Z global flag, if shader has no discard calls', [])
+        add_pass('hlsl-dxil-pix-shader-access-instrumentation', 'DxilShaderAccessTracking', 'HLSL DXIL shader access tracking for PIX', [
+            {'n':'config','t':'int','c':1},
+            {'n':'checkForDynamicIndexing','t':'bool','c':1}])
+        add_pass('hlsl-dxil-debug-instrumentation', 'DxilDebugInstrumentation', 'HLSL DXIL debug instrumentation for PIX', [
+            {'n':'UAVSize','t':'int','c':1},
+            {'n':'parameter0','t':'int','c':1},
+            {'n':'parameter1','t':'int','c':1},
+            {'n':'parameter2','t':'int','c':1}])
+        add_pass('hlsl-dxil-reduce-msaa-to-single', 'DxilReduceMSAAToSingleSample', 'HLSL DXIL Reduce all MSAA reads to single-sample reads', [])
+
+        category_lib="dxil_gen"
+
         add_pass('hlsl-hlemit', 'HLEmitMetadata', 'HLSL High-Level Metadata Emit.', [])
         add_pass('scalarrepl-param-hlsl', 'SROA_Parameter_HLSL', 'Scalar Replacement of Aggregates HLSL (parameters)', [])
         add_pass('scalarreplhlsl', 'SROA_DT_HLSL', 'Scalar Replacement of Aggregates HLSL (DT)', [])
@@ -1484,9 +1519,7 @@ class db_dxil(object):
         add_pass('static-global-to-alloca', 'LowerStaticGlobalIntoAlloca', 'Lower static global into Alloca', [])
         add_pass('hlmatrixlower', 'HLMatrixLowerPass', 'HLSL High-Level Matrix Lower', [])
         add_pass('matrixbitcastlower', 'MatrixBitcastLowerPass', 'Matrix Bitcast lower', [])
-        add_pass('dce', 'DCE', 'Dead Code Elimination', [])
-        add_pass('die', 'DeadInstElimination', 'Dead Instruction Elimination', [])
-        add_pass('globaldce', 'GlobalDCE', 'Dead Global Elimination', [])
+        add_pass("reg2mem_hlsl", "RegToMemHlsl", "Demote values with phi-node usage to stack slots", [])
         add_pass('dynamic-vector-to-array', 'DynamicIndexingVectorToArray', 'Replace dynamic indexing vector with array', [
             {'n':'ReplaceAllVectors','t':'bool','c':1}])
         add_pass('hlsl-dxil-promote-local-resources', 'DxilPromoteLocalResources', 'DXIL promote local resource use', [])
@@ -1497,10 +1530,9 @@ class db_dxil(object):
             {'n':'NotOptimized','t':'bool','c':1}])
         add_pass('fail-undef-resource', 'FailUndefResource', 'Fail on undef resource use', [])
         add_pass('simplify-inst', 'SimplifyInst', 'Simplify Instructions', [])
-        add_pass('mem2reg', 'PromotePass', 'Promote Memory to Register', [])
         add_pass('hlsl-dxil-precise', 'DxilPrecisePropagatePass', 'DXIL precise attribute propagate', [])
         add_pass('dxil-legalize-sample-offset', 'DxilLegalizeSampleOffsetPass', 'DXIL legalize sample offset', [])
-        add_pass('scalarizer', 'Scalarizer', 'Scalarize vector operations', [])
+        add_pass('hlsl-hlensure', 'HLEnsureMetadata', 'HLSL High-Level Metadata Ensure', [])
         add_pass('multi-dim-one-dim', 'MultiDimArrayToOneDimArray', 'Flatten multi-dim array into one-dim array', [])
         add_pass('resource-handle', 'ResourceToHandle', 'Lower resource into handle', [])
         add_pass('hlsl-passes-nopause', 'NoPausePasses', 'Clears metadata used for pause and resume', [])
@@ -1512,29 +1544,6 @@ class db_dxil(object):
         add_pass('hlsl-dxil-convergent-mark', 'DxilConvergentMark', 'Mark convergent', [])
         add_pass('hlsl-dxil-convergent-clear', 'DxilConvergentClear', 'Clear convergent before dxil emit', [])
         add_pass('hlsl-dxil-eliminate-output-dynamic', 'DxilEliminateOutputDynamicIndexing', 'DXIL eliminate ouptut dynamic indexing', [])
-        add_pass('hlsl-dxil-add-pixel-hit-instrmentation', 'DxilAddPixelHitInstrumentation', 'DXIL Count completed PS invocations and costs', [
-            {'n':'force-early-z','t':'int','c':1},
-            {'n':'add-pixel-cost','t':'int','c':1},
-            {'n':'rt-width','t':'int','c':1},
-            {'n':'sv-position-index','t':'int','c':1},
-            {'n':'num-pixels','t':'int','c':1}])
-        add_pass('hlsl-dxil-constantColor', 'DxilOutputColorBecomesConstant', 'DXIL Constant Color Mod', [
-            {'n':'mod-mode','t':'int','c':1},
-            {'n':'constant-red','t':'float','c':1},
-            {'n':'constant-green','t':'float','c':1},
-            {'n':'constant-blue','t':'float','c':1},
-            {'n':'constant-alpha','t':'float','c':1}])
-        add_pass('hlsl-dxil-remove-discards', 'DxilRemoveDiscards', 'HLSL DXIL Remove all discard instructions', [])
-        add_pass('hlsl-dxil-force-early-z', 'DxilForceEarlyZ', 'HLSL DXIL Force the early Z global flag, if shader has no discard calls', [])
-        add_pass('hlsl-dxil-pix-shader-access-instrumentation', 'DxilShaderAccessTracking', 'HLSL DXIL shader access tracking for PIX', [
-            {'n':'config','t':'int','c':1},
-            {'n':'checkForDynamicIndexing','t':'bool','c':1}])
-        add_pass('hlsl-dxil-debug-instrumentation', 'DxilDebugInstrumentation', 'HLSL DXIL debug instrumentation for PIX', [
-            {'n':'UAVSize','t':'int','c':1},
-            {'n':'parameter0','t':'int','c':1},
-            {'n':'parameter1','t':'int','c':1},
-            {'n':'parameter2','t':'int','c':1}])
-        add_pass('hlsl-dxil-reduce-msaa-to-single', 'DxilReduceMSAAToSingleSample', 'HLSL DXIL Reduce all MSAA reads to single-sample reads', [])
         add_pass('hlsl-dxilfinalize', 'DxilFinalizeModule', 'HLSL DXIL Finalize Module', [])
         add_pass('hlsl-dxilemit', 'DxilEmitMetadata', 'HLSL DXIL Metadata Emit', [])
         add_pass('hlsl-dxilload', 'DxilLoadMetadata', 'HLSL DXIL Metadata Load', [])
@@ -1544,6 +1553,11 @@ class db_dxil(object):
         add_pass('hlsl-dxil-expand-trig', 'DxilExpandTrigIntrinsics', 'DXIL expand trig intrinsics', [])
         add_pass('hlsl-hca', 'HoistConstantArray', 'HLSL constant array hoisting', [])
         add_pass('hlsl-dxil-preserve-all-outputs', 'DxilPreserveAllOutputs', 'DXIL write to all outputs in signature', [])
+        add_pass('red', 'ReducibilityAnalysis', 'Reducibility Analysis', [])
+        add_pass('viewid-state', 'ComputeViewIdState', 'Compute information related to ViewID', [])
+        add_pass('hlsl-translate-dxil-opcode-version', 'DxilTranslateRawBuffer', 'Translates one version of dxil to another', [])
+
+        category_lib="llvm"
         add_pass('ipsccp', 'IPSCCP', 'Interprocedural Sparse Conditional Constant Propagation', [])
         add_pass('globalopt', 'GlobalOpt', 'Global Variable Optimizer', [])
         add_pass('deadargelim', 'DAE', 'Dead Argument Elimination', [])
@@ -1611,9 +1625,6 @@ class db_dxil(object):
         add_pass('constmerge', 'ConstantMerge', 'Merge Duplicate Global Constants', [])
         add_pass('lowerbitsets', 'LowerBitSets', 'Lower bitset metadata', [
             {'n':'lowerbitsets-avoid-reuse', 'i':'AvoidReuse', 't':'bool', 'd':'Try to avoid reuse of byte array addresses using aliases'}])
-        add_pass('red', 'ReducibilityAnalysis', 'Reducibility Analysis', [])
-        add_pass('viewid-state', 'ComputeViewIdState', 'Compute information related to ViewID', [])
-        add_pass('hlsl-translate-dxil-opcode-version', 'DxilTranslateRawBuffer', 'Translates one version of dxil to another', [])
         # TODO: turn STATISTICS macros into ETW events
         # assert no duplicate names
         self.pass_idx_args = set()

+ 10 - 5
utils/hct/hctdb_instrhelp.py

@@ -817,11 +817,15 @@ def get_instrs_rst():
             result += i.name + "\n" + ("~" * len(i.name)) + "\n\n" + i.remarks + "\n\n"
     return result + "\n"
 
-def get_init_passes():
+def get_init_passes(category_libs):
     "Create a series of statements to initialize passes in a registry."
     db = get_db_dxil()
     result = ""
     for p in sorted(db.passes, key=lambda p : p.type_name):
+        # Skip if not in target category.
+        if (p.category_lib not in category_libs):
+            continue
+
         result += "initialize%sPass(Registry);\n" % p.type_name
     return result
 
@@ -1139,16 +1143,17 @@ if __name__ == "__main__":
         pj = lambda *parts: os.path.abspath(os.path.join(*parts))
         files = [
             'docs/DXIL.rst',
-            'lib/HLSL/DXILOperations.cpp',
-            'include/dxc/HLSL/DXILConstants.h',
+            'lib/DXIL/DXILOperations.cpp',
+            'include/dxc/DXIL/DXILConstants.h',
             'include/dxc/HLSL/DxilValidation.h',
-            'include/dxc/HLSL/DxilInstructions.h',
+            'include/dxc/DXIL/DxilInstructions.h',
             'lib/HLSL/DxcOptimizer.cpp',
+            'lib/DxilPIXPasses/DxilPIXPasses.cpp',
             'lib/HLSL/DxilValidation.cpp',
             'tools/clang/lib/Sema/gen_intrin_main_tables_15.h',
             'include/dxc/HlslIntrinsicOp.h',
             'tools/clang/tools/dxcompiler/dxcdisassembler.cpp',
-            'include/dxc/HLSL/DxilSigPoint.inl',
+            'include/dxc/DXIL/DxilSigPoint.inl',
             ]
         for relative_file_path in files:
             RunCodeTagUpdate(pj(hlsl_src_dir, relative_file_path))