ComputeViewIdState.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // //
  3. // ComputeViewIdState.h //
  4. // Copyright (C) Microsoft Corporation. All rights reserved. //
  5. // This file is distributed under the University of Illinois Open Source //
  6. // License. See LICENSE.TXT for details. //
  7. // //
  8. // Computes output registers dependent on ViewID. //
  9. // Computes sets of input registers on which output registers depend. //
  10. // Computes which input/output shapes are dynamically indexed. //
  11. // //
  12. ///////////////////////////////////////////////////////////////////////////////
  13. #pragma once
  14. #include "llvm/Pass.h"
  15. #include "dxc/HLSL/ControlDependence.h"
  16. #include "llvm/Support/GenericDomTree.h"
  17. #include <memory>
  18. #include <bitset>
  19. #include <unordered_set>
  20. #include <unordered_map>
  21. #include <set>
  22. #include <map>
  23. namespace llvm {
  24. class Module;
  25. class Function;
  26. class BasicBlock;
  27. class Instruction;
  28. class ReturnInst;
  29. class Value;
  30. class PHINode;
  31. class AnalysisUsage;
  32. class CallGraph;
  33. class CallGraphNode;
  34. class ModulePass;
  35. class raw_ostream;
  36. }
  37. namespace hlsl {
  38. class DxilModule;
  39. class DxilSignature;
  40. class DxilSignatureElement;
  41. struct DxilViewIdStateData {
  42. static const unsigned kNumComps = 4;
  43. static const unsigned kMaxSigScalars = 32*4;
  44. using OutputsDependentOnViewIdType = std::bitset<kMaxSigScalars>;
  45. using InputsContributingToOutputType = std::map<unsigned, std::set<unsigned>>;
  46. static const unsigned kNumStreams = 4;
  47. unsigned m_NumInputSigScalars = 0;
  48. unsigned m_NumOutputSigScalars[kNumStreams] = {0,0,0,0};
  49. unsigned m_NumPCOrPrimSigScalars = 0;
  50. // Set of scalar outputs dependent on ViewID.
  51. OutputsDependentOnViewIdType m_OutputsDependentOnViewId[kNumStreams];
  52. OutputsDependentOnViewIdType m_PCOrPrimOutputsDependentOnViewId;
  53. // Set of scalar inputs contributing to computation of scalar outputs.
  54. InputsContributingToOutputType m_InputsContributingToOutputs[kNumStreams];
  55. InputsContributingToOutputType m_InputsContributingToPCOrPrimOutputs; // HS PC and MS Prim only.
  56. InputsContributingToOutputType m_PCInputsContributingToOutputs; // DS only.
  57. bool m_bUsesViewId = false;
  58. };
  59. class DxilViewIdState : public DxilViewIdStateData {
  60. static const unsigned kNumComps = 4;
  61. static const unsigned kMaxSigScalars = 32*4;
  62. public:
  63. using OutputsDependentOnViewIdType = std::bitset<kMaxSigScalars>;
  64. using InputsContributingToOutputType = std::map<unsigned, std::set<unsigned>>;
  65. DxilViewIdState(DxilModule *pDxilModule);
  66. unsigned getNumInputSigScalars() const;
  67. unsigned getNumOutputSigScalars(unsigned StreamId) const;
  68. unsigned getNumPCSigScalars() const;
  69. const OutputsDependentOnViewIdType &getOutputsDependentOnViewId(unsigned StreamId) const;
  70. const OutputsDependentOnViewIdType &getPCOutputsDependentOnViewId() const;
  71. const InputsContributingToOutputType &getInputsContributingToOutputs(unsigned StreamId) const;
  72. const InputsContributingToOutputType &getInputsContributingToPCOutputs() const;
  73. const InputsContributingToOutputType &getPCInputsContributingToOutputs() const;
  74. void Serialize();
  75. const std::vector<unsigned> &GetSerialized();
  76. const std::vector<unsigned> &
  77. GetSerialized() const; // returns previously serialized data
  78. void Deserialize(const unsigned *pData, unsigned DataSizeInUINTs);
  79. void PrintSets(llvm::raw_ostream &OS);
  80. private:
  81. DxilModule *m_pModule;
  82. // Serialized form.
  83. std::vector<unsigned> m_SerializedState;
  84. void Clear();
  85. };
  86. } // end of hlsl namespace
  87. namespace llvm {
  88. void initializeComputeViewIdStatePass(llvm::PassRegistry &);
  89. llvm::ModulePass *createComputeViewIdStatePass();
  90. } // end of llvm namespace