277 строки
8.4 KiB
C++
277 строки
8.4 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// DxilResource.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/DxilResource.h"
|
|
#include "dxc/DXIL/DxilConstants.h"
|
|
#include "dxc/DXIL/DxilResourceBase.h"
|
|
#include "dxc/Support/Global.h"
|
|
#include "llvm/IR/Constant.h"
|
|
#include "llvm/IR/DerivedTypes.h"
|
|
|
|
using namespace llvm;
|
|
|
|
namespace hlsl {
|
|
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
// Resource methods.
|
|
//
|
|
DxilResource::DxilResource()
|
|
: DxilResourceBase(DxilResourceBase::Class::Invalid), m_SampleCount(0),
|
|
m_ElementStride(0), m_SamplerFeedbackType((DXIL::SamplerFeedbackType)0),
|
|
m_bGloballyCoherent(false), m_bHasCounter(false), m_bROV(false),
|
|
m_bHasAtomic64Use(false) {}
|
|
|
|
CompType DxilResource::GetCompType() const { return m_CompType; }
|
|
|
|
void DxilResource::SetCompType(const CompType CT) {
|
|
// Translate packed types to u32
|
|
switch (CT.GetKind()) {
|
|
case CompType::Kind::PackedS8x32:
|
|
case CompType::Kind::PackedU8x32:
|
|
m_CompType = CompType::getU32();
|
|
break;
|
|
default:
|
|
m_CompType = CT;
|
|
break;
|
|
}
|
|
}
|
|
|
|
Type *DxilResource::GetRetType() const {
|
|
Type *Ty = GetHLSLType()->getPointerElementType();
|
|
// For resource array, use element type.
|
|
while (Ty->isArrayTy())
|
|
Ty = Ty->getArrayElementType();
|
|
// Get the struct buffer type like this %class.StructuredBuffer = type {
|
|
// %struct.mat }.
|
|
StructType *ST = cast<StructType>(Ty);
|
|
// Get the struct type inside struct buffer.
|
|
return ST->getElementType(0);
|
|
}
|
|
|
|
unsigned DxilResource::GetSampleCount() const { return m_SampleCount; }
|
|
|
|
void DxilResource::SetSampleCount(unsigned SampleCount) {
|
|
m_SampleCount = SampleCount;
|
|
}
|
|
|
|
unsigned DxilResource::GetElementStride() const { return m_ElementStride; }
|
|
|
|
void DxilResource::SetElementStride(unsigned ElemStride) {
|
|
m_ElementStride = ElemStride;
|
|
}
|
|
|
|
unsigned DxilResource::GetBaseAlignLog2() const { return m_baseAlignLog2; }
|
|
|
|
void DxilResource::SetBaseAlignLog2(unsigned baseAlignLog2) {
|
|
m_baseAlignLog2 = baseAlignLog2;
|
|
}
|
|
|
|
DXIL::SamplerFeedbackType DxilResource::GetSamplerFeedbackType() const {
|
|
return m_SamplerFeedbackType;
|
|
}
|
|
|
|
void DxilResource::SetSamplerFeedbackType(DXIL::SamplerFeedbackType Value) {
|
|
m_SamplerFeedbackType = Value;
|
|
}
|
|
|
|
bool DxilResource::IsGloballyCoherent() const { return m_bGloballyCoherent; }
|
|
|
|
void DxilResource::SetGloballyCoherent(bool b) { m_bGloballyCoherent = b; }
|
|
|
|
bool DxilResource::HasCounter() const { return m_bHasCounter; }
|
|
|
|
void DxilResource::SetHasCounter(bool b) { m_bHasCounter = b; }
|
|
|
|
bool DxilResource::IsRO() const {
|
|
return GetClass() == DxilResourceBase::Class::SRV;
|
|
}
|
|
|
|
bool DxilResource::IsRW() const {
|
|
return GetClass() == DxilResourceBase::Class::UAV;
|
|
}
|
|
|
|
void DxilResource::SetRW(bool bRW) {
|
|
SetClass(bRW ? DxilResourceBase::Class::UAV : DxilResourceBase::Class::SRV);
|
|
}
|
|
|
|
bool DxilResource::IsROV() const { return m_bROV; }
|
|
|
|
void DxilResource::SetROV(bool bROV) { m_bROV = bROV; }
|
|
|
|
bool DxilResource::IsAnyTexture() const { return IsAnyTexture(GetKind()); }
|
|
|
|
bool DxilResource::IsAnyTexture(Kind ResourceKind) {
|
|
return DXIL::IsAnyTexture(ResourceKind);
|
|
}
|
|
|
|
bool DxilResource::IsAnyArrayTexture() const {
|
|
return IsAnyArrayTexture(GetKind());
|
|
}
|
|
|
|
bool DxilResource::IsAnyArrayTexture(Kind ResourceKind) {
|
|
return DXIL::IsAnyArrayTexture(ResourceKind);
|
|
}
|
|
|
|
bool DxilResource::IsAnyTextureCube() const {
|
|
return IsAnyTextureCube(GetKind());
|
|
}
|
|
|
|
bool DxilResource::IsAnyTextureCube(Kind ResourceKind) {
|
|
return DXIL::IsAnyTextureCube(ResourceKind);
|
|
}
|
|
|
|
bool DxilResource::IsArrayKind() const { return IsArrayKind(GetKind()); }
|
|
|
|
bool DxilResource::IsArrayKind(Kind ResourceKind) {
|
|
return DXIL::IsArrayKind(ResourceKind);
|
|
}
|
|
|
|
bool DxilResource::IsStructuredBuffer() const {
|
|
return GetKind() == Kind::StructuredBuffer;
|
|
}
|
|
|
|
bool DxilResource::IsTypedBuffer() const {
|
|
return GetKind() == Kind::TypedBuffer;
|
|
}
|
|
|
|
bool DxilResource::IsRawBuffer() const { return GetKind() == Kind::RawBuffer; }
|
|
|
|
bool DxilResource::IsTBuffer() const { return GetKind() == Kind::TBuffer; }
|
|
|
|
bool DxilResource::IsFeedbackTexture() const {
|
|
return IsFeedbackTexture(GetKind());
|
|
}
|
|
|
|
bool DxilResource::IsFeedbackTexture(Kind ResourceKind) {
|
|
return DXIL::IsFeedbackTexture(ResourceKind);
|
|
}
|
|
|
|
bool DxilResource::HasAtomic64Use() const { return m_bHasAtomic64Use; }
|
|
|
|
void DxilResource::SetHasAtomic64Use(bool b) { m_bHasAtomic64Use = b; }
|
|
|
|
unsigned DxilResource::GetNumCoords(Kind ResourceKind) {
|
|
const unsigned CoordSizeTab[] = {
|
|
0, // Invalid = 0,
|
|
1, // Texture1D,
|
|
2, // Texture2D,
|
|
2, // Texture2DMS,
|
|
3, // Texture3D,
|
|
3, // TextureCube,
|
|
2, // Texture1DArray,
|
|
3, // Texture2DArray,
|
|
3, // Texture2DMSArray,
|
|
4, // TextureCubeArray,
|
|
1, // TypedBuffer,
|
|
1, // RawBuffer,
|
|
2, // StructuredBuffer,
|
|
0, // CBuffer,
|
|
0, // Sampler,
|
|
1, // TBuffer,
|
|
0, // RaytracingAccelerationStructure,
|
|
2, // FeedbackTexture2D,
|
|
3, // FeedbackTexture2DArray,
|
|
};
|
|
static_assert(_countof(CoordSizeTab) == (unsigned)Kind::NumEntries,
|
|
"check helper array size");
|
|
DXASSERT(ResourceKind > Kind::Invalid && ResourceKind < Kind::NumEntries,
|
|
"otherwise the caller passed wrong resource type");
|
|
return CoordSizeTab[(unsigned)ResourceKind];
|
|
}
|
|
|
|
unsigned DxilResource::GetNumDimensions(Kind ResourceKind) {
|
|
const unsigned NumDimTab[] = {
|
|
0, // Invalid = 0,
|
|
1, // Texture1D,
|
|
2, // Texture2D,
|
|
2, // Texture2DMS,
|
|
3, // Texture3D,
|
|
2, // TextureCube,
|
|
1, // Texture1DArray,
|
|
2, // Texture2DArray,
|
|
2, // Texture2DMSArray,
|
|
3, // TextureCubeArray,
|
|
1, // TypedBuffer,
|
|
1, // RawBuffer,
|
|
2, // StructuredBuffer,
|
|
0, // CBuffer,
|
|
0, // Sampler,
|
|
1, // TBuffer,
|
|
0, // RaytracingAccelerationStructure,
|
|
2, // FeedbackTexture2D,
|
|
2, // FeedbackTexture2DArray,
|
|
};
|
|
static_assert(_countof(NumDimTab) == (unsigned)Kind::NumEntries,
|
|
"check helper array size");
|
|
DXASSERT(ResourceKind > Kind::Invalid && ResourceKind < Kind::NumEntries,
|
|
"otherwise the caller passed wrong resource type");
|
|
return NumDimTab[(unsigned)ResourceKind];
|
|
}
|
|
|
|
unsigned DxilResource::GetNumDimensionsForCalcLOD(Kind ResourceKind) {
|
|
const unsigned NumDimTab[] = {
|
|
0, // Invalid = 0,
|
|
1, // Texture1D,
|
|
2, // Texture2D,
|
|
2, // Texture2DMS,
|
|
3, // Texture3D,
|
|
3, // TextureCube,
|
|
1, // Texture1DArray,
|
|
2, // Texture2DArray,
|
|
2, // Texture2DMSArray,
|
|
3, // TextureCubeArray,
|
|
1, // TypedBuffer,
|
|
1, // RawBuffer,
|
|
2, // StructuredBuffer,
|
|
0, // CBuffer,
|
|
0, // Sampler,
|
|
1, // TBuffer,
|
|
0, // RaytracingAccelerationStructure,
|
|
2, // FeedbackTexture2D,
|
|
2, // FeedbackTexture2DArray,
|
|
};
|
|
static_assert(_countof(NumDimTab) == (unsigned)Kind::NumEntries,
|
|
"check helper array size");
|
|
DXASSERT(ResourceKind > Kind::Invalid && ResourceKind < Kind::NumEntries,
|
|
"otherwise the caller passed wrong resource type");
|
|
return NumDimTab[(unsigned)ResourceKind];
|
|
}
|
|
|
|
unsigned DxilResource::GetNumOffsets(Kind ResourceKind) {
|
|
const unsigned OffsetSizeTab[] = {
|
|
0, // Invalid = 0,
|
|
1, // Texture1D,
|
|
2, // Texture2D,
|
|
2, // Texture2DMS,
|
|
3, // Texture3D,
|
|
0, // TextureCube,
|
|
1, // Texture1DArray,
|
|
2, // Texture2DArray,
|
|
2, // Texture2DMSArray,
|
|
0, // TextureCubeArray,
|
|
0, // TypedBuffer,
|
|
0, // RawBuffer,
|
|
0, // StructuredBuffer,
|
|
0, // CBuffer,
|
|
0, // Sampler,
|
|
1, // TBuffer,
|
|
0, // RaytracingAccelerationStructure,
|
|
2, // FeedbackTexture2D,
|
|
2, // FeedbackTexture2DArray,
|
|
};
|
|
static_assert(_countof(OffsetSizeTab) == (unsigned)Kind::NumEntries,
|
|
"check helper array size");
|
|
DXASSERT(ResourceKind > Kind::Invalid && ResourceKind < Kind::NumEntries,
|
|
"otherwise the caller passed wrong resource type");
|
|
return OffsetSizeTab[(unsigned)ResourceKind];
|
|
}
|
|
|
|
} // namespace hlsl
|