blob: 4d74747b7a72d075f66ebbcd34a8ee9547cef29b [file] [log] [blame] [edit]
///////////////////////////////////////////////////////////////////////////////
// //
// 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