DxilSignatureElement.cpp 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // //
  3. // DxilSignatureElement.cpp //
  4. // Copyright (C) Microsoft Corporation. All rights reserved. //
  5. // Licensed under the MIT license. See COPYRIGHT in the project root for //
  6. // full license information. //
  7. // //
  8. // Representation of HLSL signature element. //
  9. // //
  10. ///////////////////////////////////////////////////////////////////////////////
  11. #include "dxc/Support/Global.h"
  12. #include "dxc/HLSL/DxilSignatureElement.h"
  13. #include "dxc/HLSL/DxilSemantic.h"
  14. #include "dxc/HLSL/DxilSigPoint.h"
  15. #include "dxc/HLSL/DxilShaderModel.h"
  16. #include "dxc/HLSL/DxilContainer.h"
  17. #include <memory>
  18. using std::string;
  19. using std::vector;
  20. using std::unique_ptr;
  21. namespace hlsl {
  22. //------------------------------------------------------------------------------
  23. //
  24. // DxilSignatureElement methods.
  25. //
  26. DxilSignatureElement::DxilSignatureElement(DXIL::SigPointKind sigPointKind)
  27. : m_sigPointKind(sigPointKind)
  28. , m_pSemantic(nullptr)
  29. , m_ID(kUndefinedID)
  30. , m_InterpMode(InterpolationMode::Kind::Invalid)
  31. , m_CompType(CompType::Kind::Invalid)
  32. , m_Rows(0)
  33. , m_Cols(0)
  34. , m_StartRow(Semantic::kUndefinedRow)
  35. , m_StartCol(Semantic::kUndefinedCol) {
  36. }
  37. DxilSignatureElement::~DxilSignatureElement() {
  38. }
  39. void DxilSignatureElement::Initialize(llvm::StringRef Name, const CompType &ElementType,
  40. const InterpolationMode &InterpMode,
  41. unsigned Rows, unsigned Cols,
  42. int StartRow, int StartCol,
  43. unsigned ID, const vector<unsigned> &IndexVector) {
  44. DXASSERT(m_pSemantic == nullptr, "an instance should be initiazed only once");
  45. m_ID = ID;
  46. m_Name = Name.str(); // creates a copy
  47. Semantic::DecomposeNameAndIndex(m_Name, &m_SemanticName, &m_SemanticStartIndex);
  48. if (!IndexVector.empty())
  49. m_SemanticStartIndex = IndexVector[0];
  50. // Find semantic in the table.
  51. m_pSemantic = Semantic::GetByName(m_SemanticName, m_sigPointKind);
  52. m_CompType = ElementType;
  53. m_InterpMode = InterpMode;
  54. m_SemanticIndex = IndexVector;
  55. m_Rows = Rows;
  56. m_Cols = Cols;
  57. m_StartRow = StartRow;
  58. m_StartCol = StartCol;
  59. m_OutputStream = 0;
  60. }
  61. unsigned DxilSignatureElement::GetID() const {
  62. return m_ID;
  63. }
  64. void DxilSignatureElement::SetID(unsigned ID) {
  65. DXASSERT_NOMSG(m_ID == kUndefinedID || m_ID == ID);
  66. m_ID = ID;
  67. }
  68. DXIL::ShaderKind DxilSignatureElement::GetShaderKind() const {
  69. return SigPoint::GetSigPoint(m_sigPointKind)->GetShaderKind();
  70. }
  71. bool DxilSignatureElement::IsInput() const {
  72. return SigPoint::GetSigPoint(m_sigPointKind)->IsInput();
  73. }
  74. bool DxilSignatureElement::IsOutput() const {
  75. return SigPoint::GetSigPoint(m_sigPointKind)->IsOutput();
  76. }
  77. bool DxilSignatureElement::IsPatchConstant() const {
  78. return SigPoint::GetSigPoint(m_sigPointKind)->IsPatchConstant();
  79. }
  80. const char *DxilSignatureElement::GetName() const {
  81. if (IsArbitrary())
  82. return m_Name.c_str();
  83. else if (!m_pSemantic->IsInvalid())
  84. return m_pSemantic->GetName();
  85. else
  86. return m_Name.c_str();
  87. }
  88. unsigned DxilSignatureElement::GetRows() const {
  89. return m_Rows;
  90. }
  91. void DxilSignatureElement::SetRows(unsigned Rows) {
  92. m_Rows = Rows;
  93. }
  94. unsigned DxilSignatureElement::GetCols() const {
  95. return m_Cols;
  96. }
  97. void DxilSignatureElement::SetCols(unsigned Cols) {
  98. m_Cols = Cols;
  99. }
  100. const InterpolationMode *DxilSignatureElement::GetInterpolationMode() const {
  101. return &m_InterpMode;
  102. }
  103. CompType DxilSignatureElement::GetCompType() const {
  104. return m_CompType;
  105. }
  106. unsigned DxilSignatureElement::GetOutputStream() const {
  107. return m_OutputStream;
  108. }
  109. void DxilSignatureElement::SetOutputStream(unsigned Stream) {
  110. m_OutputStream = Stream;
  111. }
  112. DXIL::SigPointKind DxilSignatureElement::GetSigPointKind() const {
  113. return m_sigPointKind;
  114. }
  115. void DxilSignatureElement::SetSigPointKind(DXIL::SigPointKind K) {
  116. m_sigPointKind = K;
  117. }
  118. //
  119. // Semantic-related properties.
  120. //
  121. const Semantic *DxilSignatureElement::GetSemantic() const {
  122. return m_pSemantic;
  123. }
  124. void DxilSignatureElement::SetKind(Semantic::Kind kind) {
  125. // recover the original SigPointKind if necessary (for Shadow element).
  126. m_sigPointKind = SigPoint::RecoverKind(kind, m_sigPointKind);
  127. m_pSemantic = Semantic::Get(kind, m_sigPointKind);
  128. }
  129. Semantic::Kind DxilSignatureElement::GetKind() const {
  130. return m_pSemantic->GetKind();
  131. }
  132. bool DxilSignatureElement::IsArbitrary() const {
  133. return m_pSemantic->IsArbitrary();
  134. }
  135. bool DxilSignatureElement::IsDepth() const {
  136. return m_pSemantic->GetKind() == Semantic::Kind::Depth;
  137. }
  138. bool DxilSignatureElement::IsDepthLE() const {
  139. return m_pSemantic->GetKind() == Semantic::Kind::DepthLessEqual;
  140. }
  141. bool DxilSignatureElement::IsDepthGE() const {
  142. return m_pSemantic->GetKind() == Semantic::Kind::DepthGreaterEqual;
  143. }
  144. bool DxilSignatureElement::IsAnyDepth() const {
  145. return IsDepth() || IsDepthLE() || IsDepthGE();
  146. }
  147. DXIL::SemanticInterpretationKind DxilSignatureElement::GetInterpretation() const {
  148. return SigPoint::GetInterpretation(m_pSemantic->GetKind(), m_sigPointKind, ShaderModel::kHighestMajor, ShaderModel::kHighestMinor);
  149. }
  150. llvm::StringRef DxilSignatureElement::GetSemanticName() const {
  151. return m_SemanticName;
  152. }
  153. unsigned DxilSignatureElement::GetSemanticStartIndex() const {
  154. return m_SemanticStartIndex;
  155. }
  156. //
  157. // Low-level properties.
  158. //
  159. int DxilSignatureElement::GetStartRow() const {
  160. return m_StartRow;
  161. }
  162. void DxilSignatureElement::SetStartRow(int StartRow) {
  163. m_StartRow = StartRow;
  164. }
  165. int DxilSignatureElement::GetStartCol() const {
  166. return m_StartCol;
  167. }
  168. void DxilSignatureElement::SetStartCol(int StartCol) {
  169. m_StartCol = StartCol;
  170. }
  171. const std::vector<unsigned> &DxilSignatureElement::GetSemanticIndexVec() const {
  172. return m_SemanticIndex;
  173. }
  174. void DxilSignatureElement::SetSemanticIndexVec(const std::vector<unsigned> &Vec) {
  175. m_SemanticIndex = Vec;
  176. }
  177. void DxilSignatureElement::AppendSemanticIndex(unsigned SemIdx) {
  178. m_SemanticIndex.emplace_back(SemIdx);
  179. }
  180. void DxilSignatureElement::SetCompType(CompType CT) {
  181. m_CompType = CT;
  182. }
  183. uint8_t DxilSignatureElement::GetColsAsMask() const {
  184. unsigned StartCol = IsAllocated() ? m_StartCol : 0;
  185. DXASSERT(StartCol + m_Cols <= 4, "else start %u and cols %u exceed limit", StartCol, m_Cols);
  186. DXASSERT(m_Cols >= 1, "else signature takes no space");
  187. switch (StartCol) {
  188. case 0: {
  189. switch (m_Cols) {
  190. case 1:
  191. return DxilProgramSigMaskX;
  192. case 2:
  193. return DxilProgramSigMaskX | DxilProgramSigMaskY;
  194. case 3:
  195. return DxilProgramSigMaskX | DxilProgramSigMaskY | DxilProgramSigMaskZ;
  196. default:
  197. return DxilProgramSigMaskX | DxilProgramSigMaskY | DxilProgramSigMaskZ | DxilProgramSigMaskW;
  198. }
  199. }
  200. case 1: {
  201. switch (m_Cols) {
  202. case 1:
  203. return DxilProgramSigMaskY;
  204. case 2:
  205. return DxilProgramSigMaskY | DxilProgramSigMaskZ;
  206. default:
  207. return DxilProgramSigMaskY | DxilProgramSigMaskZ | DxilProgramSigMaskW;
  208. }
  209. }
  210. case 2: return DxilProgramSigMaskZ | ((m_Cols == 1) ? 0 : DxilProgramSigMaskW);
  211. case 3:
  212. default:
  213. return DxilProgramSigMaskW;
  214. }
  215. }
  216. bool DxilSignatureElement::IsAllocated() const {
  217. return (m_StartRow != Semantic::kUndefinedRow) && (m_StartCol != Semantic::kUndefinedCol);
  218. }
  219. } // namespace hlsl