Add internal structure Allocation::PackedData with bit fields to optimize memory size of Allocation class.
diff --git a/src/D3D12MemAlloc.cpp b/src/D3D12MemAlloc.cpp
index bcd7287..f70ddf7 100644
--- a/src/D3D12MemAlloc.cpp
+++ b/src/D3D12MemAlloc.cpp
@@ -1316,7 +1316,7 @@
void JsonWriter::AddAllocationToObject(const Allocation& alloc)
{
WriteString(L"Type");
- switch (alloc.m_ResourceDimension) {
+ switch (alloc.m_PackedData.GetResourceDimension()) {
case D3D12_RESOURCE_DIMENSION_UNKNOWN:
WriteString(L"UNKNOWN");
break;
@@ -1342,15 +1342,15 @@
WriteString(L"Name");
WriteString(name);
}
- if(alloc.m_ResourceFlags)
+ if(alloc.m_PackedData.GetResourceFlags())
{
WriteString(L"Flags");
- WriteNumber((UINT)alloc.m_ResourceFlags);
+ WriteNumber((UINT)alloc.m_PackedData.GetResourceFlags());
}
- if(alloc.m_TextureLayout)
+ if(alloc.m_PackedData.GetTextureLayout())
{
WriteString(L"Layout");
- WriteNumber((UINT)alloc.m_TextureLayout);
+ WriteNumber((UINT)alloc.m_PackedData.GetTextureLayout());
}
if(alloc.m_CreationFrameIndex)
{
@@ -4074,7 +4074,7 @@
void AllocatorPimpl::FreeCommittedMemory(Allocation* allocation)
{
- D3D12MA_ASSERT(allocation && allocation->m_Type == Allocation::TYPE_COMMITTED);
+ D3D12MA_ASSERT(allocation && allocation->m_PackedData.GetType() == Allocation::TYPE_COMMITTED);
UnregisterCommittedAllocation(allocation, allocation->m_Committed.heapType);
const UINT64 allocationSize = allocation->GetSize();
@@ -4085,7 +4085,7 @@
void AllocatorPimpl::FreePlacedMemory(Allocation* allocation)
{
- D3D12MA_ASSERT(allocation && allocation->m_Type == Allocation::TYPE_PLACED);
+ D3D12MA_ASSERT(allocation && allocation->m_PackedData.GetType() == Allocation::TYPE_PLACED);
NormalBlock* const block = allocation->m_Placed.block;
D3D12MA_ASSERT(block);
@@ -4097,7 +4097,7 @@
void AllocatorPimpl::FreeHeapMemory(Allocation* allocation)
{
- D3D12MA_ASSERT(allocation && allocation->m_Type == Allocation::TYPE_HEAP);
+ D3D12MA_ASSERT(allocation && allocation->m_PackedData.GetType() == Allocation::TYPE_HEAP);
UnregisterCommittedAllocation(allocation, allocation->m_Heap.heapType);
SAFE_RELEASE(allocation->m_Heap.heap);
@@ -4525,7 +4525,7 @@
SAFE_RELEASE(m_Resource);
- switch(m_Type)
+ switch(m_PackedData.GetType())
{
case TYPE_COMMITTED:
m_Allocator->FreeCommittedMemory(this);
@@ -4545,7 +4545,7 @@
UINT64 Allocation::GetOffset() const
{
- switch(m_Type)
+ switch(m_PackedData.GetType())
{
case TYPE_COMMITTED:
case TYPE_HEAP:
@@ -4560,7 +4560,7 @@
ID3D12Heap* Allocation::GetHeap() const
{
- switch(m_Type)
+ switch(m_PackedData.GetType())
{
case TYPE_COMMITTED:
return NULL;
@@ -4588,14 +4588,11 @@
Allocation::Allocation(AllocatorPimpl* allocator, UINT64 size) :
m_Allocator{allocator},
- m_Type{TYPE_COUNT},
m_Size{size},
m_Resource{NULL},
- m_ResourceDimension{D3D12_RESOURCE_DIMENSION_UNKNOWN},
- m_ResourceFlags{D3D12_RESOURCE_FLAG_NONE},
- m_TextureLayout{D3D12_TEXTURE_LAYOUT_UNKNOWN},
m_CreationFrameIndex{allocator->GetCurrentFrameIndex()},
- m_Name{NULL}
+ m_Name{NULL},
+ m_PackedData{TYPE_COUNT, D3D12_RESOURCE_DIMENSION_UNKNOWN, D3D12_RESOURCE_FLAG_NONE, D3D12_TEXTURE_LAYOUT_UNKNOWN}
{
D3D12MA_ASSERT(allocator);
}
@@ -4607,20 +4604,20 @@
void Allocation::InitCommitted(D3D12_HEAP_TYPE heapType)
{
- m_Type = TYPE_COMMITTED;
+ m_PackedData.SetType(TYPE_COMMITTED);
m_Committed.heapType = heapType;
}
void Allocation::InitPlaced(UINT64 offset, UINT64 alignment, NormalBlock* block)
{
- m_Type = TYPE_PLACED;
+ m_PackedData.SetType(TYPE_PLACED);
m_Placed.offset = offset;
m_Placed.block = block;
}
void Allocation::InitHeap(D3D12_HEAP_TYPE heapType, ID3D12Heap* heap)
{
- m_Type = TYPE_HEAP;
+ m_PackedData.SetType(TYPE_HEAP);
m_Heap.heapType = heapType;
m_Heap.heap = heap;
}
@@ -4630,9 +4627,9 @@
D3D12MA_ASSERT(m_Resource == NULL);
D3D12MA_ASSERT(pResourceDesc);
m_Resource = resource;
- m_ResourceDimension = pResourceDesc->Dimension;
- m_ResourceFlags = pResourceDesc->Flags;
- m_TextureLayout = pResourceDesc->Layout;
+ m_PackedData.SetResourceDimension(pResourceDesc->Dimension);
+ m_PackedData.SetResourceFlags(pResourceDesc->Flags);
+ m_PackedData.SetTextureLayout(pResourceDesc->Layout);
}
void Allocation::FreeName()
diff --git a/src/D3D12MemAlloc.h b/src/D3D12MemAlloc.h
index 026fdb0..841a2d0 100644
--- a/src/D3D12MemAlloc.h
+++ b/src/D3D12MemAlloc.h
@@ -514,19 +514,17 @@
template<typename T> friend void D3D12MA_DELETE(const ALLOCATION_CALLBACKS&, T*);
template<typename T> friend class PoolAllocator;
- AllocatorPimpl* m_Allocator;
enum Type
{
TYPE_COMMITTED,
TYPE_PLACED,
TYPE_HEAP,
TYPE_COUNT
- } m_Type;
+ };
+
+ AllocatorPimpl* m_Allocator;
UINT64 m_Size;
ID3D12Resource* m_Resource;
- D3D12_RESOURCE_DIMENSION m_ResourceDimension;
- D3D12_RESOURCE_FLAGS m_ResourceFlags;
- D3D12_TEXTURE_LAYOUT m_TextureLayout;
UINT m_CreationFrameIndex;
wchar_t* m_Name;
@@ -550,6 +548,31 @@
} m_Heap;
};
+ struct PackedData
+ {
+ public:
+ PackedData() :
+ m_Type(0), m_ResourceDimension(0), m_ResourceFlags(0), m_TextureLayout(0) { }
+ PackedData(Type type, D3D12_RESOURCE_DIMENSION resourceDimension, D3D12_RESOURCE_FLAGS resourceFlags, D3D12_TEXTURE_LAYOUT textureLayout) :
+ m_Type(type), m_ResourceDimension(resourceDimension), m_ResourceFlags(resourceFlags), m_TextureLayout(textureLayout) { }
+
+ Type GetType() const { return (Type)m_Type; }
+ D3D12_RESOURCE_DIMENSION GetResourceDimension() const { return (D3D12_RESOURCE_DIMENSION)m_ResourceDimension; }
+ D3D12_RESOURCE_FLAGS GetResourceFlags() const { return (D3D12_RESOURCE_FLAGS)m_ResourceFlags; }
+ D3D12_TEXTURE_LAYOUT GetTextureLayout() const { return (D3D12_TEXTURE_LAYOUT)m_TextureLayout; }
+
+ void SetType(Type type) { m_Type = (UINT)type; }
+ void SetResourceDimension(D3D12_RESOURCE_DIMENSION resourceDimension) { m_ResourceDimension = (UINT)resourceDimension; }
+ void SetResourceFlags(D3D12_RESOURCE_FLAGS resourceFlags) { m_ResourceFlags = (UINT)resourceFlags; }
+ void SetTextureLayout(D3D12_TEXTURE_LAYOUT textureLayout) { m_TextureLayout = (UINT)textureLayout; }
+
+ private:
+ UINT m_Type : 2; // enum Type
+ UINT m_ResourceDimension : 3; // enum D3D12_RESOURCE_DIMENSION
+ UINT m_ResourceFlags : 7; // flags D3D12_RESOURCE_FLAGS
+ UINT m_TextureLayout : 2; // enum D3D12_TEXTURE_LAYOUT
+ } m_PackedData;
+
Allocation(AllocatorPimpl* allocator, UINT64 size);
~Allocation();
void InitCommitted(D3D12_HEAP_TYPE heapType);