DxilResourceBase.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // //
  3. // DxilResourceBase.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/DxilResourceBase.h"
  10. #include "dxc/Support/Global.h"
  11. #include "llvm/IR/Constant.h"
  12. namespace hlsl {
  13. //------------------------------------------------------------------------------
  14. //
  15. // ResourceBase methods.
  16. //
  17. DxilResourceBase::DxilResourceBase(Class C)
  18. : m_Class(C)
  19. , m_Kind(Kind::Invalid)
  20. , m_ID(UINT_MAX)
  21. , m_SpaceID(0)
  22. , m_LowerBound(0)
  23. , m_RangeSize(0)
  24. , m_pSymbol(nullptr)
  25. , m_pHandle(nullptr)
  26. , m_pHLSLTy(nullptr) {
  27. }
  28. DxilResourceBase::Class DxilResourceBase::GetClass() const { return m_Class; }
  29. DxilResourceBase::Kind DxilResourceBase::GetKind() const { return m_Kind; }
  30. void DxilResourceBase::SetKind(DxilResourceBase::Kind ResourceKind) {
  31. DXASSERT(ResourceKind > Kind::Invalid && ResourceKind < Kind::NumEntries, "otherwise the caller passed wrong resource type");
  32. m_Kind = ResourceKind;
  33. }
  34. unsigned DxilResourceBase::GetID() const { return m_ID; }
  35. unsigned DxilResourceBase::GetSpaceID() const { return m_SpaceID; }
  36. unsigned DxilResourceBase::GetLowerBound() const { return m_LowerBound; }
  37. unsigned DxilResourceBase::GetUpperBound() const { return m_RangeSize != UINT_MAX ? m_LowerBound + m_RangeSize - 1 : UINT_MAX; }
  38. unsigned DxilResourceBase::GetRangeSize() const { return m_RangeSize; }
  39. llvm::Constant *DxilResourceBase::GetGlobalSymbol() const { return m_pSymbol; }
  40. const std::string &DxilResourceBase::GetGlobalName() const { return m_Name; }
  41. llvm::Value *DxilResourceBase::GetHandle() const { return m_pHandle; }
  42. // If m_pHLSLTy is nullptr, HLSL type is the type of m_pSymbol.
  43. // In sm6.6, type of m_pSymbol will be mutated to handleTy, m_pHLSLTy will save
  44. // the original HLSL type.
  45. llvm::Type *DxilResourceBase::GetHLSLType() const {
  46. return m_pHLSLTy == nullptr ? m_pSymbol->getType() : m_pHLSLTy;
  47. }
  48. bool DxilResourceBase::IsAllocated() const { return m_LowerBound != UINT_MAX; }
  49. bool DxilResourceBase::IsUnbounded() const { return m_RangeSize == UINT_MAX; }
  50. void DxilResourceBase::SetClass(Class C) { m_Class = C; }
  51. void DxilResourceBase::SetID(unsigned ID) { m_ID = ID; }
  52. void DxilResourceBase::SetSpaceID(unsigned SpaceID) { m_SpaceID = SpaceID; }
  53. void DxilResourceBase::SetLowerBound(unsigned LB) { m_LowerBound = LB; }
  54. void DxilResourceBase::SetRangeSize(unsigned RangeSize) { m_RangeSize = RangeSize; }
  55. void DxilResourceBase::SetGlobalSymbol(llvm::Constant *pGV) { m_pSymbol = pGV; }
  56. void DxilResourceBase::SetGlobalName(const std::string &Name) { m_Name = Name; }
  57. void DxilResourceBase::SetHandle(llvm::Value *pHandle) { m_pHandle = pHandle; }
  58. void DxilResourceBase::SetHLSLType(llvm::Type *pTy) { m_pHLSLTy = pTy; }
  59. static const char *s_ResourceClassNames[] = {
  60. "texture", "UAV", "cbuffer", "sampler"
  61. };
  62. static_assert(_countof(s_ResourceClassNames) == (unsigned)DxilResourceBase::Class::Invalid,
  63. "Resource class names array must be updated when new resource class enums are added.");
  64. const char *DxilResourceBase::GetResClassName() const {
  65. return s_ResourceClassNames[(unsigned)m_Class];
  66. }
  67. static const char *s_ResourceIDPrefixes[] = {
  68. "T", "U", "CB", "S"
  69. };
  70. static_assert(_countof(s_ResourceIDPrefixes) == (unsigned)DxilResourceBase::Class::Invalid,
  71. "Resource id prefixes array must be updated when new resource class enums are added.");
  72. const char *DxilResourceBase::GetResIDPrefix() const {
  73. return s_ResourceIDPrefixes[(unsigned)m_Class];
  74. }
  75. static const char *s_ResourceBindPrefixes[] = {
  76. "t", "u", "cb", "s"
  77. };
  78. static_assert(_countof(s_ResourceBindPrefixes) == (unsigned)DxilResourceBase::Class::Invalid,
  79. "Resource bind prefixes array must be updated when new resource class enums are added.");
  80. const char *DxilResourceBase::GetResBindPrefix() const {
  81. return s_ResourceBindPrefixes[(unsigned)m_Class];
  82. }
  83. static const char *s_ResourceDimNames[] = {
  84. "invalid", "1d", "2d", "2dMS", "3d",
  85. "cube", "1darray", "2darray", "2darrayMS", "cubearray",
  86. "buf", "rawbuf", "structbuf", "cbuffer", "sampler",
  87. "tbuffer", "ras", "fbtex2d", "fbtex2darray",
  88. };
  89. static_assert(_countof(s_ResourceDimNames) == (unsigned)DxilResourceBase::Kind::NumEntries,
  90. "Resource dim names array must be updated when new resource kind enums are added.");
  91. const char *DxilResourceBase::GetResDimName() const {
  92. return s_ResourceDimNames[(unsigned)m_Kind];
  93. }
  94. static const char *s_ResourceKindNames[] = {
  95. "invalid", "Texture1D", "Texture2D", "Texture2DMS", "Texture3D",
  96. "TextureCube", "Texture1DArray", "Texture2DArray", "Texture2DMSArray", "TextureCubeArray",
  97. "TypedBuffer", "RawBuffer", "StructuredBuffer", "CBuffer", "Sampler",
  98. "TBuffer", "RTAccelerationStructure", "FeedbackTexture2D", "FeedbackTexture2DArray",
  99. };
  100. static_assert(_countof(s_ResourceKindNames) == (unsigned)DxilResourceBase::Kind::NumEntries,
  101. "Resource kind names array must be updated when new resource kind enums are added.");
  102. const char *DxilResourceBase::GetResKindName() const {
  103. return GetResourceKindName(m_Kind);
  104. }
  105. const char *GetResourceKindName(DXIL::ResourceKind K) {
  106. return s_ResourceKindNames[(unsigned)K];
  107. }
  108. } // namespace hlsl