Refactoring: Use constructor and destructor in Allocation class
PoolAllocator supports that. Needed to only use parameter pack to pass arguments to constructor.
diff --git a/src/D3D12MemAlloc.cpp b/src/D3D12MemAlloc.cpp
index eae75d2..67df169 100644
--- a/src/D3D12MemAlloc.cpp
+++ b/src/D3D12MemAlloc.cpp
@@ -32,6 +32,7 @@
#include <mutex>
#include <atomic>
#include <algorithm>
+#include <utility>
#include <cstdlib>
#include <malloc.h> // for _aligned_malloc, _aligned_free
@@ -1176,7 +1177,7 @@
PoolAllocator(const ALLOCATION_CALLBACKS& allocationCallbacks, UINT firstBlockCapacity);
~PoolAllocator() { Clear(); }
void Clear();
- T* Alloc();
+ template<typename... Types> T* Alloc(Types... args);
void Free(T* ptr);
private:
@@ -1220,7 +1221,7 @@
}
template<typename T>
-T* PoolAllocator<T>::Alloc()
+template<typename... Types> T* PoolAllocator<T>::Alloc(Types... args)
{
for(size_t i = m_ItemBlocks.size(); i--; )
{
@@ -1231,7 +1232,7 @@
Item* const pItem = &block.pItems[block.FirstFreeIndex];
block.FirstFreeIndex = pItem->NextFreeIndex;
T* result = (T*)&pItem->Value;
- new(result)T(); // Explicit constructor call.
+ new(result)T(std::forward<Types>(args)...); // Explicit constructor call.
return result;
}
}
@@ -1241,7 +1242,7 @@
Item* const pItem = &newBlock.pItems[0];
newBlock.FirstFreeIndex = pItem->NextFreeIndex;
T* result = (T*)pItem->Value;
- new(result)T(); // Explicit constructor call.
+ new(result)T(std::forward<Types>(args)...); // Explicit constructor call.
return result;
}
@@ -1760,7 +1761,7 @@
public:
AllocationObjectAllocator(const ALLOCATION_CALLBACKS& allocationCallbacks);
- Allocation* Allocate();
+ template<typename... Types> Allocation* Allocate(Types... args);
void Free(Allocation* alloc);
private:
@@ -3275,14 +3276,9 @@
m_HasEmptyBlock = false;
}
- *pAllocation = m_hAllocator->GetAllocationObjectAllocator().Allocate();
+ *pAllocation = m_hAllocator->GetAllocationObjectAllocator().Allocate(m_hAllocator, size);
pBlock->m_pMetadata->Alloc(currRequest, size, *pAllocation);
- (*pAllocation)->InitPlaced(
- m_hAllocator,
- size,
- currRequest.offset,
- alignment,
- pBlock);
+ (*pAllocation)->InitPlaced(currRequest.offset, alignment, pBlock);
D3D12MA_HEAVY_ASSERT(pBlock->Validate());
m_hAllocator->m_Budget.AddAllocation(HeapTypeToIndex(m_HeapType), size);
return S_OK;
@@ -3655,8 +3651,8 @@
pOptimizedClearValue, riidResource, (void**)&res);
if(SUCCEEDED(hr))
{
- Allocation* alloc = m_AllocationObjectAllocator.Allocate();
- alloc->InitCommitted(this, resAllocInfo.SizeInBytes, pAllocDesc->HeapType);
+ Allocation* alloc = m_AllocationObjectAllocator.Allocate(this, resAllocInfo.SizeInBytes);
+ alloc->InitCommitted(pAllocDesc->HeapType);
alloc->SetResource(res, pResourceDesc);
*ppAllocation = alloc;
@@ -3708,8 +3704,8 @@
HRESULT hr = m_Device->CreateHeap(&heapDesc, __uuidof(*heap), (void**)&heap);
if(SUCCEEDED(hr))
{
- (*ppAllocation) = m_AllocationObjectAllocator.Allocate();
- (*ppAllocation)->InitHeap(this, allocInfo.SizeInBytes, pAllocDesc->HeapType, heap);
+ (*ppAllocation) = m_AllocationObjectAllocator.Allocate(this, allocInfo.SizeInBytes);
+ (*ppAllocation)->InitHeap(pAllocDesc->HeapType, heap);
RegisterCommittedAllocation(*ppAllocation, pAllocDesc->HeapType);
const UINT heapTypeIndex = HeapTypeToIndex(pAllocDesc->HeapType);
@@ -4340,65 +4336,43 @@
}
}
-Allocation::Allocation()
+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}
{
- // Must be empty because Allocation objects are allocated out of PoolAllocator
- // and may not call constructor and destructor at the right time.
- // Use Init* methods instead.
+ D3D12MA_ASSERT(allocator);
}
Allocation::~Allocation()
{
- // Must be empty because Allocation objects are allocated out of PoolAllocator
- // and may not call constructor and destructor at the right time.
- // Use Release method instead.
+ // Nothing here, everything already done in Release.
}
-void Allocation::InitCommitted(AllocatorPimpl* allocator, UINT64 size, D3D12_HEAP_TYPE heapType)
+void Allocation::InitCommitted(D3D12_HEAP_TYPE heapType)
{
- D3D12MA_ASSERT(allocator);
- m_Allocator = allocator;
m_Type = TYPE_COMMITTED;
- m_Size = size;
- m_Resource = NULL;
- m_Name = NULL;
m_Committed.heapType = heapType;
- m_CreationFrameIndex = allocator->GetCurrentFrameIndex();
- m_ResourceDimension = D3D12_RESOURCE_DIMENSION_UNKNOWN;
- m_ResourceFlags = D3D12_RESOURCE_FLAG_NONE;
- m_TextureLayout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
}
-void Allocation::InitPlaced(AllocatorPimpl* allocator, UINT64 size, UINT64 offset, UINT64 alignment, NormalBlock* block)
+void Allocation::InitPlaced(UINT64 offset, UINT64 alignment, NormalBlock* block)
{
- D3D12MA_ASSERT(allocator);
- m_Allocator = allocator;
m_Type = TYPE_PLACED;
- m_Size = size;
- m_Resource = NULL;
- m_Name = NULL;
m_Placed.offset = offset;
m_Placed.block = block;
- m_CreationFrameIndex = allocator->GetCurrentFrameIndex();
- m_ResourceDimension = D3D12_RESOURCE_DIMENSION_UNKNOWN;
- m_ResourceFlags = D3D12_RESOURCE_FLAG_NONE;
- m_TextureLayout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
}
-void Allocation::InitHeap(AllocatorPimpl* allocator, UINT64 size, D3D12_HEAP_TYPE heapType, ID3D12Heap* heap)
+void Allocation::InitHeap(D3D12_HEAP_TYPE heapType, ID3D12Heap* heap)
{
- D3D12MA_ASSERT(allocator);
- m_Allocator = allocator;
m_Type = TYPE_HEAP;
- m_Size = size;
- m_Resource = NULL;
- m_Name = NULL;
m_Heap.heapType = heapType;
m_Heap.heap = heap;
- m_CreationFrameIndex = allocator->GetCurrentFrameIndex();
- m_ResourceDimension = D3D12_RESOURCE_DIMENSION_UNKNOWN;
- m_ResourceFlags = D3D12_RESOURCE_FLAG_NONE;
- m_TextureLayout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
}
void Allocation::SetResource(ID3D12Resource* resource, const D3D12_RESOURCE_DESC* pResourceDesc)
@@ -4429,10 +4403,10 @@
{
}
-Allocation* AllocationObjectAllocator::Allocate()
+template<typename... Types> Allocation* AllocationObjectAllocator::Allocate(Types... args)
{
MutexLock mutexLock(m_Mutex);
- return m_Allocator.Alloc();
+ return m_Allocator.Alloc(std::forward<Types>(args)...);
}
void AllocationObjectAllocator::Free(Allocation* alloc)
diff --git a/src/D3D12MemAlloc.h b/src/D3D12MemAlloc.h
index 8e9c9f7..9d6e96f 100644
--- a/src/D3D12MemAlloc.h
+++ b/src/D3D12MemAlloc.h
@@ -529,11 +529,11 @@
} m_Heap;
};
- Allocation();
+ Allocation(AllocatorPimpl* allocator, UINT64 size);
~Allocation();
- void InitCommitted(AllocatorPimpl* allocator, UINT64 size, D3D12_HEAP_TYPE heapType);
- void InitPlaced(AllocatorPimpl* allocator, UINT64 size, UINT64 offset, UINT64 alignment, NormalBlock* block);
- void InitHeap(AllocatorPimpl* allocator, UINT64 size, D3D12_HEAP_TYPE heapType, ID3D12Heap* heap);
+ void InitCommitted(D3D12_HEAP_TYPE heapType);
+ void InitPlaced(UINT64 offset, UINT64 alignment, NormalBlock* block);
+ void InitHeap(D3D12_HEAP_TYPE heapType, ID3D12Heap* heap);
void SetResource(ID3D12Resource* resource, const D3D12_RESOURCE_DESC* pResourceDesc);
void FreeName();