DxilSignature.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // //
  3. // DxilSignature.cpp //
  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. ///////////////////////////////////////////////////////////////////////////////
  9. #include "dxc/Support/Global.h"
  10. #include "dxc/DXIL/DxilSignature.h"
  11. #include "dxc/DXIL/DxilSigPoint.h"
  12. #include "llvm/ADT/STLExtras.h"
  13. using std::vector;
  14. using std::unique_ptr;
  15. namespace hlsl {
  16. //------------------------------------------------------------------------------
  17. //
  18. // Singnature methods.
  19. //
  20. DxilSignature::DxilSignature(DXIL::ShaderKind shaderKind,
  21. DXIL::SignatureKind sigKind,
  22. bool useMinPrecision)
  23. : m_sigPointKind(SigPoint::GetKind(shaderKind, sigKind,
  24. /*isPatchConstantFunction*/ false,
  25. /*isSpecialInput*/ false)),
  26. m_UseMinPrecision(useMinPrecision) {}
  27. DxilSignature::DxilSignature(DXIL::SigPointKind sigPointKind,
  28. bool useMinPrecision)
  29. : m_sigPointKind(sigPointKind),
  30. m_UseMinPrecision(useMinPrecision) {}
  31. DxilSignature::DxilSignature(const DxilSignature &src)
  32. : m_sigPointKind(src.m_sigPointKind),
  33. m_UseMinPrecision(src.m_UseMinPrecision) {
  34. const bool bSetID = false;
  35. for (auto &Elt : src.GetElements()) {
  36. std::unique_ptr<DxilSignatureElement> newElt = CreateElement();
  37. newElt->Initialize(Elt->GetName(), Elt->GetCompType(),
  38. Elt->GetInterpolationMode()->GetKind(), Elt->GetRows(),
  39. Elt->GetCols(), Elt->GetStartRow(), Elt->GetStartCol(),
  40. Elt->GetID(), Elt->GetSemanticIndexVec());
  41. AppendElement(std::move(newElt), bSetID);
  42. }
  43. }
  44. DxilSignature::~DxilSignature() {
  45. }
  46. bool DxilSignature::IsInput() const {
  47. return SigPoint::GetSigPoint(m_sigPointKind)->IsInput();
  48. }
  49. bool DxilSignature::IsOutput() const {
  50. return SigPoint::GetSigPoint(m_sigPointKind)->IsOutput();
  51. }
  52. unique_ptr<DxilSignatureElement> DxilSignature::CreateElement() {
  53. return llvm::make_unique<DxilSignatureElement>(m_sigPointKind);
  54. }
  55. unsigned DxilSignature::AppendElement(std::unique_ptr<DxilSignatureElement> pSE, bool bSetID) {
  56. DXASSERT_NOMSG((unsigned)m_Elements.size() < UINT_MAX);
  57. unsigned Id = (unsigned)m_Elements.size();
  58. if (bSetID) {
  59. pSE->SetID(Id);
  60. }
  61. m_Elements.emplace_back(std::move(pSE));
  62. return Id;
  63. }
  64. DxilSignatureElement &DxilSignature::GetElement(unsigned idx) {
  65. return *m_Elements[idx];
  66. }
  67. const DxilSignatureElement &DxilSignature::GetElement(unsigned idx) const {
  68. return *m_Elements[idx];
  69. }
  70. const std::vector<std::unique_ptr<DxilSignatureElement> > &DxilSignature::GetElements() const {
  71. return m_Elements;
  72. }
  73. bool DxilSignature::ShouldBeAllocated(DXIL::SemanticInterpretationKind Kind) {
  74. switch (Kind) {
  75. case DXIL::SemanticInterpretationKind::NA:
  76. case DXIL::SemanticInterpretationKind::NotInSig:
  77. case DXIL::SemanticInterpretationKind::NotPacked:
  78. case DXIL::SemanticInterpretationKind::Shadow:
  79. return false;
  80. default:
  81. break;
  82. }
  83. return true;
  84. }
  85. bool DxilSignature::IsFullyAllocated() const {
  86. for (auto &SE : m_Elements) {
  87. if (!ShouldBeAllocated(SE.get()->GetInterpretation()))
  88. continue;
  89. if (!SE->IsAllocated())
  90. return false;
  91. }
  92. return true;
  93. }
  94. unsigned DxilSignature::NumVectorsUsed(unsigned streamIndex) const {
  95. unsigned NumVectors = 0;
  96. for (auto &SE : m_Elements) {
  97. if (SE->IsAllocated() && SE->GetOutputStream() == streamIndex)
  98. NumVectors = std::max(NumVectors, (unsigned)SE->GetStartRow() + SE->GetRows());
  99. }
  100. return NumVectors;
  101. }
  102. unsigned DxilSignature::GetRowCount() const {
  103. unsigned maxRow = 0;
  104. for (auto &E : GetElements()) {
  105. unsigned endRow = E->GetStartRow() + E->GetRows();
  106. if (maxRow < endRow) {
  107. maxRow = endRow;
  108. }
  109. }
  110. return maxRow;
  111. }
  112. //------------------------------------------------------------------------------
  113. //
  114. // EntrySingnature methods.
  115. //
  116. DxilEntrySignature::DxilEntrySignature(const DxilEntrySignature &src)
  117. : InputSignature(src.InputSignature), OutputSignature(src.OutputSignature),
  118. PatchConstOrPrimSignature(src.PatchConstOrPrimSignature) {}
  119. } // namespace hlsl
  120. #include "dxc/DXIL/DxilSigPoint.inl"