DxilSignatureElement.cpp 7.8 KB

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