DxilSignatureElement.cpp 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  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/DXIL/DxilSignatureElement.h"
  13. #include "dxc/DXIL/DxilSemantic.h"
  14. #include "dxc/DXIL/DxilSigPoint.h"
  15. #include "dxc/DXIL/DxilShaderModel.h"
  16. #include <memory>
  17. using std::string;
  18. using std::vector;
  19. using std::unique_ptr;
  20. namespace hlsl {
  21. //------------------------------------------------------------------------------
  22. //
  23. // DxilSignatureElement methods.
  24. //
  25. DxilSignatureElement::DxilSignatureElement(DXIL::SigPointKind sigPointKind)
  26. : m_sigPointKind(sigPointKind)
  27. , m_pSemantic(nullptr)
  28. , m_ID(kUndefinedID)
  29. , m_CompType(CompType::Kind::Invalid)
  30. , m_InterpMode(InterpolationMode::Kind::Invalid)
  31. , m_Rows(0)
  32. , m_Cols(0)
  33. , m_StartRow(Semantic::kUndefinedRow)
  34. , m_StartCol(Semantic::kUndefinedCol)
  35. , m_DynIdxCompMask(0)
  36. , m_UsageMask(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. SetCompType(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::IsPatchConstOrPrim() const {
  79. return SigPoint::GetSigPoint(m_sigPointKind)->IsPatchConstOrPrim();
  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. // Translate packed types to u32
  183. switch(CT.GetKind()) {
  184. case CompType::Kind::PackedS8x32:
  185. case CompType::Kind::PackedU8x32:
  186. m_CompType = CompType::getU32();
  187. break;
  188. default:
  189. m_CompType = CT;
  190. break;
  191. }
  192. }
  193. uint8_t DxilSignatureElement::GetColsAsMask() const {
  194. unsigned StartCol = IsAllocated() ? m_StartCol : 0;
  195. DXASSERT_ARGS(StartCol + m_Cols <= 4, "else start %u and cols %u exceed limit", StartCol, m_Cols);
  196. DXASSERT(m_Cols >= 1, "else signature takes no space");
  197. switch (StartCol) {
  198. case 0: {
  199. switch (m_Cols) {
  200. case 1:
  201. return hlsl::DXIL::DxilProgramSigMaskX;
  202. case 2:
  203. return hlsl::DXIL::DxilProgramSigMaskX | hlsl::DXIL::DxilProgramSigMaskY;
  204. case 3:
  205. return hlsl::DXIL::DxilProgramSigMaskX | hlsl::DXIL::DxilProgramSigMaskY |
  206. hlsl::DXIL::DxilProgramSigMaskZ;
  207. default:
  208. return hlsl::DXIL::DxilProgramSigMaskX | hlsl::DXIL::DxilProgramSigMaskY |
  209. hlsl::DXIL::DxilProgramSigMaskZ | hlsl::DXIL::DxilProgramSigMaskW;
  210. }
  211. }
  212. case 1: {
  213. switch (m_Cols) {
  214. case 1:
  215. return hlsl::DXIL::DxilProgramSigMaskY;
  216. case 2:
  217. return hlsl::DXIL::DxilProgramSigMaskY | hlsl::DXIL::DxilProgramSigMaskZ;
  218. default:
  219. return hlsl::DXIL::DxilProgramSigMaskY | hlsl::DXIL::DxilProgramSigMaskZ |
  220. hlsl::DXIL::DxilProgramSigMaskW;
  221. }
  222. }
  223. case 2:
  224. return hlsl::DXIL::DxilProgramSigMaskZ |
  225. ((m_Cols == 1) ? 0 : hlsl::DXIL::DxilProgramSigMaskW);
  226. case 3:
  227. default:
  228. return hlsl::DXIL::DxilProgramSigMaskW;
  229. }
  230. }
  231. bool DxilSignatureElement::IsAllocated() const {
  232. return (m_StartRow != Semantic::kUndefinedRow) && (m_StartCol != Semantic::kUndefinedCol);
  233. }
  234. unsigned DxilSignatureElement::GetDynIdxCompMask() const {
  235. DXASSERT_NOMSG(m_DynIdxCompMask <= 0xF);
  236. return m_DynIdxCompMask;
  237. }
  238. void DxilSignatureElement::SetDynIdxCompMask(unsigned DynIdxCompMask) {
  239. DXASSERT_NOMSG(DynIdxCompMask <= 0xF);
  240. m_DynIdxCompMask = DynIdxCompMask;
  241. }
  242. uint8_t DxilSignatureElement::GetUsageMask() const {
  243. DXASSERT_NOMSG(m_UsageMask <= 0xF);
  244. return (uint8_t)m_UsageMask;
  245. }
  246. void DxilSignatureElement::SetUsageMask(unsigned UsageMask) {
  247. DXASSERT_NOMSG(UsageMask <= 0xF);
  248. m_UsageMask = UsageMask;
  249. }
  250. } // namespace hlsl