| /////////////////////////////////////////////////////////////////////////////// |
| // // |
| // DxilResourceBase.cpp // |
| // Copyright (C) Microsoft Corporation. All rights reserved. // |
| // This file is distributed under the University of Illinois Open Source // |
| // License. See LICENSE.TXT for details. // |
| // // |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| #include "dxc/DXIL/DxilResourceBase.h" |
| #include "dxc/Support/Global.h" |
| #include "llvm/IR/Constant.h" |
| |
| namespace hlsl { |
| |
| //------------------------------------------------------------------------------ |
| // |
| // ResourceBase methods. |
| // |
| DxilResourceBase::DxilResourceBase(Class C) |
| : m_Class(C), m_Kind(Kind::Invalid), m_ID(UINT_MAX), m_SpaceID(0), |
| m_LowerBound(0), m_RangeSize(0), m_pSymbol(nullptr), m_pHandle(nullptr), |
| m_pHLSLTy(nullptr) {} |
| |
| DxilResourceBase::Class DxilResourceBase::GetClass() const { return m_Class; } |
| DxilResourceBase::Kind DxilResourceBase::GetKind() const { return m_Kind; } |
| void DxilResourceBase::SetKind(DxilResourceBase::Kind ResourceKind) { |
| DXASSERT(ResourceKind > Kind::Invalid && ResourceKind < Kind::NumEntries, |
| "otherwise the caller passed wrong resource type"); |
| m_Kind = ResourceKind; |
| } |
| |
| unsigned DxilResourceBase::GetID() const { return m_ID; } |
| unsigned DxilResourceBase::GetSpaceID() const { return m_SpaceID; } |
| unsigned DxilResourceBase::GetLowerBound() const { return m_LowerBound; } |
| unsigned DxilResourceBase::GetUpperBound() const { |
| return m_RangeSize != UINT_MAX ? m_LowerBound + m_RangeSize - 1 : UINT_MAX; |
| } |
| unsigned DxilResourceBase::GetRangeSize() const { return m_RangeSize; } |
| llvm::Constant *DxilResourceBase::GetGlobalSymbol() const { return m_pSymbol; } |
| const std::string &DxilResourceBase::GetGlobalName() const { return m_Name; } |
| llvm::Value *DxilResourceBase::GetHandle() const { return m_pHandle; } |
| // If m_pHLSLTy is nullptr, HLSL type is the type of m_pSymbol. |
| // In sm6.6, type of m_pSymbol will be mutated to handleTy, m_pHLSLTy will save |
| // the original HLSL type. |
| llvm::Type *DxilResourceBase::GetHLSLType() const { |
| return m_pHLSLTy == nullptr ? m_pSymbol->getType() : m_pHLSLTy; |
| } |
| bool DxilResourceBase::IsAllocated() const { return m_LowerBound != UINT_MAX; } |
| bool DxilResourceBase::IsUnbounded() const { return m_RangeSize == UINT_MAX; } |
| |
| void DxilResourceBase::SetClass(Class C) { m_Class = C; } |
| void DxilResourceBase::SetID(unsigned ID) { m_ID = ID; } |
| void DxilResourceBase::SetSpaceID(unsigned SpaceID) { m_SpaceID = SpaceID; } |
| void DxilResourceBase::SetLowerBound(unsigned LB) { m_LowerBound = LB; } |
| void DxilResourceBase::SetRangeSize(unsigned RangeSize) { |
| m_RangeSize = RangeSize; |
| } |
| void DxilResourceBase::SetGlobalSymbol(llvm::Constant *pGV) { m_pSymbol = pGV; } |
| void DxilResourceBase::SetGlobalName(const std::string &Name) { m_Name = Name; } |
| void DxilResourceBase::SetHandle(llvm::Value *pHandle) { m_pHandle = pHandle; } |
| void DxilResourceBase::SetHLSLType(llvm::Type *pTy) { m_pHLSLTy = pTy; } |
| |
| static const char *s_ResourceClassNames[] = {"texture", "UAV", "cbuffer", |
| "sampler"}; |
| static_assert(_countof(s_ResourceClassNames) == |
| (unsigned)DxilResourceBase::Class::Invalid, |
| "Resource class names array must be updated when new resource " |
| "class enums are added."); |
| |
| const char *DxilResourceBase::GetResClassName() const { |
| return s_ResourceClassNames[(unsigned)m_Class]; |
| } |
| |
| static const char *s_ResourceIDPrefixes[] = {"T", "U", "CB", "S"}; |
| static_assert(_countof(s_ResourceIDPrefixes) == |
| (unsigned)DxilResourceBase::Class::Invalid, |
| "Resource id prefixes array must be updated when new resource " |
| "class enums are added."); |
| |
| const char *DxilResourceBase::GetResIDPrefix() const { |
| return s_ResourceIDPrefixes[(unsigned)m_Class]; |
| } |
| |
| static const char *s_ResourceBindPrefixes[] = {"t", "u", "cb", "s"}; |
| static_assert(_countof(s_ResourceBindPrefixes) == |
| (unsigned)DxilResourceBase::Class::Invalid, |
| "Resource bind prefixes array must be updated when new resource " |
| "class enums are added."); |
| |
| const char *DxilResourceBase::GetResBindPrefix() const { |
| return s_ResourceBindPrefixes[(unsigned)m_Class]; |
| } |
| |
| static const char *s_ResourceDimNames[] = { |
| "invalid", "1d", "2d", "2dMS", "3d", |
| "cube", "1darray", "2darray", "2darrayMS", "cubearray", |
| "buf", "rawbuf", "structbuf", "cbuffer", "sampler", |
| "tbuffer", "ras", "fbtex2d", "fbtex2darray", |
| }; |
| static_assert(_countof(s_ResourceDimNames) == |
| (unsigned)DxilResourceBase::Kind::NumEntries, |
| "Resource dim names array must be updated when new resource kind " |
| "enums are added."); |
| |
| const char *DxilResourceBase::GetResDimName() const { |
| return s_ResourceDimNames[(unsigned)m_Kind]; |
| } |
| |
| static const char *s_ResourceKindNames[] = { |
| "invalid", |
| "Texture1D", |
| "Texture2D", |
| "Texture2DMS", |
| "Texture3D", |
| "TextureCube", |
| "Texture1DArray", |
| "Texture2DArray", |
| "Texture2DMSArray", |
| "TextureCubeArray", |
| "TypedBuffer", |
| "RawBuffer", |
| "StructuredBuffer", |
| "CBuffer", |
| "Sampler", |
| "TBuffer", |
| "RTAccelerationStructure", |
| "FeedbackTexture2D", |
| "FeedbackTexture2DArray", |
| }; |
| static_assert(_countof(s_ResourceKindNames) == |
| (unsigned)DxilResourceBase::Kind::NumEntries, |
| "Resource kind names array must be updated when new resource " |
| "kind enums are added."); |
| |
| const char *DxilResourceBase::GetResKindName() const { |
| return GetResourceKindName(m_Kind); |
| } |
| |
| const char *GetResourceKindName(DXIL::ResourceKind K) { |
| return s_ResourceKindNames[(unsigned)K]; |
| } |
| |
| } // namespace hlsl |