/////////////////////////////////////////////////////////////////////////////// // // // ComputeViewIdState.h // // Copyright (C) Microsoft Corporation. All rights reserved. // // This file is distributed under the University of Illinois Open Source // // License. See LICENSE.TXT for details. // // // // Computes output registers dependent on ViewID. // // Computes sets of input registers on which output registers depend. // // Computes which input/output shapes are dynamically indexed. // // // /////////////////////////////////////////////////////////////////////////////// #pragma once #include "llvm/Pass.h" #include "dxc/HLSL/ControlDependence.h" #include "llvm/Support/GenericDomTree.h" #include #include #include #include #include #include namespace llvm { class Module; class Function; class BasicBlock; class Instruction; class ReturnInst; class Value; class PHINode; class AnalysisUsage; class CallGraph; class CallGraphNode; class ModulePass; class raw_ostream; } namespace hlsl { class DxilModule; class DxilSignature; class DxilSignatureElement; struct DxilViewIdStateData { static const unsigned kNumComps = 4; static const unsigned kMaxSigScalars = 32*4; using OutputsDependentOnViewIdType = std::bitset; using InputsContributingToOutputType = std::map>; static const unsigned kNumStreams = 4; unsigned m_NumInputSigScalars = 0; unsigned m_NumOutputSigScalars[kNumStreams] = {0,0,0,0}; unsigned m_NumPCOrPrimSigScalars = 0; // Set of scalar outputs dependent on ViewID. OutputsDependentOnViewIdType m_OutputsDependentOnViewId[kNumStreams]; OutputsDependentOnViewIdType m_PCOrPrimOutputsDependentOnViewId; // Set of scalar inputs contributing to computation of scalar outputs. InputsContributingToOutputType m_InputsContributingToOutputs[kNumStreams]; InputsContributingToOutputType m_InputsContributingToPCOrPrimOutputs; // HS PC and MS Prim only. InputsContributingToOutputType m_PCInputsContributingToOutputs; // DS only. bool m_bUsesViewId = false; }; class DxilViewIdState : public DxilViewIdStateData { static const unsigned kNumComps = 4; static const unsigned kMaxSigScalars = 32*4; public: using OutputsDependentOnViewIdType = std::bitset; using InputsContributingToOutputType = std::map>; DxilViewIdState(DxilModule *pDxilModule); unsigned getNumInputSigScalars() const; unsigned getNumOutputSigScalars(unsigned StreamId) const; unsigned getNumPCSigScalars() const; const OutputsDependentOnViewIdType &getOutputsDependentOnViewId(unsigned StreamId) const; const OutputsDependentOnViewIdType &getPCOutputsDependentOnViewId() const; const InputsContributingToOutputType &getInputsContributingToOutputs(unsigned StreamId) const; const InputsContributingToOutputType &getInputsContributingToPCOutputs() const; const InputsContributingToOutputType &getPCInputsContributingToOutputs() const; void Serialize(); const std::vector &GetSerialized(); const std::vector & GetSerialized() const; // returns previously serialized data void Deserialize(const unsigned *pData, unsigned DataSizeInUINTs); void PrintSets(llvm::raw_ostream &OS); private: DxilModule *m_pModule; // Serialized form. std::vector m_SerializedState; void Clear(); }; } // end of hlsl namespace namespace llvm { void initializeComputeViewIdStatePass(llvm::PassRegistry &); llvm::ModulePass *createComputeViewIdStatePass(); } // end of llvm namespace