DxilSemantic.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // //
  3. // DxilSemantic.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/DXIL/DxilSigPoint.h"
  10. #include "dxc/DXIL/DxilSemantic.h"
  11. #include "dxc/DXIL/DxilSignature.h"
  12. #include "dxc/DXIL/DxilShaderModel.h"
  13. #include "dxc/Support/Global.h"
  14. #include <string>
  15. using std::string;
  16. namespace hlsl {
  17. //------------------------------------------------------------------------------
  18. //
  19. // Semantic class methods.
  20. //
  21. Semantic::Semantic(Kind Kind,
  22. const char *pszName)
  23. : m_Kind(Kind)
  24. , m_pszName(pszName)
  25. {
  26. }
  27. const Semantic *Semantic::GetByName(llvm::StringRef name) {
  28. if (!HasSVPrefix(name))
  29. return GetArbitrary();
  30. // The search is a simple linear scan as it is fairly infrequent operation and the list is short.
  31. // The search can be improved if linear traversal has inadequate performance.
  32. for (unsigned i = (unsigned)Kind::Arbitrary + 1; i < (unsigned)Kind::Invalid; i++) {
  33. if (name.compare_lower(ms_SemanticTable[i].m_pszName) == 0)
  34. return &ms_SemanticTable[i];
  35. }
  36. return GetInvalid();
  37. }
  38. const Semantic *Semantic::GetByName(llvm::StringRef Name, DXIL::SigPointKind sigPointKind,
  39. unsigned MajorVersion, unsigned MinorVersion) {
  40. return Get(GetByName(Name)->GetKind(), sigPointKind, MajorVersion, MinorVersion);
  41. }
  42. const Semantic *Semantic::Get(Kind kind) {
  43. if (kind < Kind::Invalid)
  44. return &Semantic::ms_SemanticTable[(unsigned)kind];
  45. return GetInvalid();
  46. }
  47. const Semantic *Semantic::Get(Kind kind, DXIL::SigPointKind sigPointKind,
  48. unsigned MajorVersion, unsigned MinorVersion) {
  49. if (sigPointKind == DXIL::SigPointKind::Invalid)
  50. return GetInvalid();
  51. const Semantic* pSemantic = Get(kind);
  52. DXIL::SemanticInterpretationKind SI = SigPoint::GetInterpretation(pSemantic->GetKind(), sigPointKind, MajorVersion, MinorVersion);
  53. if(SI == DXIL::SemanticInterpretationKind::NA)
  54. return GetInvalid();
  55. if(SI == DXIL::SemanticInterpretationKind::Arb)
  56. return GetArbitrary();
  57. return pSemantic;
  58. }
  59. const Semantic *Semantic::GetInvalid() {
  60. return &Semantic::ms_SemanticTable[(unsigned)Kind::Invalid];
  61. }
  62. const Semantic *Semantic::GetArbitrary() {
  63. return &Semantic::ms_SemanticTable[(unsigned)Kind::Arbitrary];
  64. }
  65. bool Semantic::HasSVPrefix(llvm::StringRef Name) {
  66. return Name.size() >= 3 && (Name[0] == 'S' || Name[0] == 's') &&
  67. (Name[1] == 'V' || Name[1] == 'v') && Name[2] == '_';
  68. }
  69. void Semantic::DecomposeNameAndIndex(llvm::StringRef FullName, llvm::StringRef *pName, unsigned *pIndex) {
  70. unsigned L = FullName.size(), i;
  71. for (i = L; i > 0; i--) {
  72. char d = FullName[i - 1];
  73. if ('0' > d || d > '9')
  74. break;
  75. }
  76. *pName = FullName.substr(0, i);
  77. if (i < L)
  78. *pIndex = atoi(FullName.data() + i);
  79. else
  80. *pIndex = 0;
  81. }
  82. Semantic::Kind Semantic::GetKind() const {
  83. return m_Kind;
  84. }
  85. const char *Semantic::GetName() const {
  86. return m_pszName;
  87. }
  88. bool Semantic::IsArbitrary() const {
  89. return GetKind() == Kind::Arbitrary;
  90. }
  91. bool Semantic::IsInvalid() const {
  92. return m_Kind == Kind::Invalid;
  93. }
  94. typedef Semantic SP;
  95. const Semantic Semantic::ms_SemanticTable[kNumSemanticRecords] = {
  96. // Kind Name
  97. SP(Kind::Arbitrary, nullptr),
  98. SP(Kind::VertexID, "SV_VertexID"),
  99. SP(Kind::InstanceID, "SV_InstanceID"),
  100. SP(Kind::Position, "SV_Position"),
  101. SP(Kind::RenderTargetArrayIndex,"SV_RenderTargetArrayIndex"),
  102. SP(Kind::ViewPortArrayIndex, "SV_ViewportArrayIndex"),
  103. SP(Kind::ClipDistance, "SV_ClipDistance"),
  104. SP(Kind::CullDistance, "SV_CullDistance"),
  105. SP(Kind::OutputControlPointID, "SV_OutputControlPointID"),
  106. SP(Kind::DomainLocation, "SV_DomainLocation"),
  107. SP(Kind::PrimitiveID, "SV_PrimitiveID"),
  108. SP(Kind::GSInstanceID, "SV_GSInstanceID"),
  109. SP(Kind::SampleIndex, "SV_SampleIndex"),
  110. SP(Kind::IsFrontFace, "SV_IsFrontFace"),
  111. SP(Kind::Coverage, "SV_Coverage"),
  112. SP(Kind::InnerCoverage, "SV_InnerCoverage"),
  113. SP(Kind::Target, "SV_Target"),
  114. SP(Kind::Depth, "SV_Depth"),
  115. SP(Kind::DepthLessEqual, "SV_DepthLessEqual"),
  116. SP(Kind::DepthGreaterEqual, "SV_DepthGreaterEqual"),
  117. SP(Kind::StencilRef, "SV_StencilRef"),
  118. SP(Kind::DispatchThreadID, "SV_DispatchThreadID"),
  119. SP(Kind::GroupID, "SV_GroupID"),
  120. SP(Kind::GroupIndex, "SV_GroupIndex"),
  121. SP(Kind::GroupThreadID, "SV_GroupThreadID"),
  122. SP(Kind::TessFactor, "SV_TessFactor"),
  123. SP(Kind::InsideTessFactor, "SV_InsideTessFactor"),
  124. SP(Kind::ViewID, "SV_ViewID"),
  125. SP(Kind::Barycentrics, "SV_Barycentrics"),
  126. SP(Kind::ShadingRate, "SV_ShadingRate"),
  127. SP(Kind::CullPrimitive, "SV_CullPrimitive"),
  128. SP(Kind::Invalid, nullptr),
  129. };
  130. } // namespace hlsl