More coding...
diff --git a/src/D3D12MemAlloc.cpp b/src/D3D12MemAlloc.cpp
index 58b5a6a..490eda0 100644
--- a/src/D3D12MemAlloc.cpp
+++ b/src/D3D12MemAlloc.cpp
@@ -2744,6 +2744,8 @@
class PoolPimpl
{
public:
+ CommittedAllocationList m_CommittedAllocations;
+
PoolPimpl(AllocatorPimpl* allocator, const POOL_DESC& desc);
HRESULT Init();
~PoolPimpl();
@@ -2766,7 +2768,6 @@
AllocatorPimpl* m_Allocator; // Externally owned object.
POOL_DESC m_Desc;
BlockVector* m_BlockVector; // Owned object.
- CommittedAllocationList m_CommittedAllocations;
wchar_t* m_Name;
PoolPimpl* m_PrevPool = NULL;
PoolPimpl* m_NextPool = NULL;
@@ -2995,8 +2996,20 @@
const D3D12_RESOURCE_ALLOCATION_INFO& allocInfo,
ID3D12ProtectedResourceSession *pProtectedSession,
Allocation** ppAllocation);
+ HRESULT AllocateHeap1_Impl(
+ CommittedAllocationList& allocList,
+ const D3D12_HEAP_PROPERTIES& heapProperties,
+ D3D12_HEAP_FLAGS heapFlags,
+ const D3D12_RESOURCE_ALLOCATION_INFO& allocInfo,
+ ID3D12ProtectedResourceSession *pProtectedSession,
+ Allocation** ppAllocation);
#endif // #ifdef __ID3D12Device4_INTERFACE_DEFINED__
+ template<typename D3D12_RESOURCE_DESC_T>
+ HRESULT CalcAllocationParams(const ALLOCATION_DESC& allocDesc, UINT64 allocSize,
+ const D3D12_RESOURCE_DESC_T* resDesc, // Optional
+ BlockVector*& outBlockVector, CommittedAllocationList*& outCommittedAllocationList, bool& outPreferCommitted);
+
/*
If SupportsResourceHeapTier2():
0: D3D12_HEAP_TYPE_DEFAULT
@@ -4749,7 +4762,6 @@
return E_INVALIDARG;
}
ALLOCATION_DESC finalAllocDesc = *pAllocDesc;
-
D3D12_RESOURCE_DESC finalResourceDesc = *pResourceDesc;
D3D12_RESOURCE_ALLOCATION_INFO resAllocInfo = GetResourceAllocationInfo(finalResourceDesc);
resAllocInfo.Alignment = D3D12MA_MAX<UINT64>(resAllocInfo.Alignment, D3D12MA_DEBUG_ALIGNMENT);
@@ -4781,7 +4793,7 @@
const UINT defaultPoolIndex = CalcDefaultPoolIndex(*pAllocDesc, finalResourceDesc);
const bool requireCommittedMemory = defaultPoolIndex == UINT32_MAX;
if(requireCommittedMemory)
- {
+ {
return AllocateCommittedResource(
&finalAllocDesc,
&finalResourceDesc,
@@ -4800,16 +4812,15 @@
bool preferCommittedMemory =
m_AlwaysCommitted ||
PrefersCommittedAllocation(finalResourceDesc) ||
- // Heuristics: Allocate committed memory if requested size if greater than half of preferred block size.
resAllocInfo.SizeInBytes > preferredBlockSize / 2;
if(preferCommittedMemory &&
(finalAllocDesc.Flags & ALLOCATION_FLAG_NEVER_ALLOCATE) == 0)
{
finalAllocDesc.Flags |= ALLOCATION_FLAG_COMMITTED;
- }
+ }
if((finalAllocDesc.Flags & ALLOCATION_FLAG_COMMITTED) != 0)
- {
+ {
return AllocateCommittedResource(
&finalAllocDesc,
&finalResourceDesc,
@@ -4819,7 +4830,7 @@
ppAllocation,
riidResource,
ppvResource);
- }
+ }
else
{
HRESULT hr = blockVector->CreateResource(
@@ -4832,10 +4843,10 @@
ppAllocation,
riidResource,
ppvResource);
- if(SUCCEEDED(hr))
+ if(SUCCEEDED(hr))
{
- return hr;
- }
+ return hr;
+ }
return AllocateCommittedResource(
&finalAllocDesc,
@@ -5042,66 +5053,36 @@
{
*ppAllocation = NULL;
- if(pAllocDesc->CustomPool != NULL)
+ BlockVector* blockVector = NULL;
+ CommittedAllocationList* committedAllocationList = NULL;
+ bool preferCommitted = false;
+ HRESULT hr = CalcAllocationParams<D3D12_RESOURCE_DESC>(*pAllocDesc, pAllocInfo->SizeInBytes,
+ NULL, // pResDesc
+ blockVector, committedAllocationList, preferCommitted);
+ if(FAILED(hr))
+ return hr;
+
+ hr = E_INVALIDARG;
+ if(committedAllocationList != NULL && preferCommitted)
{
- BlockVector* const blockVector = pAllocDesc->CustomPool->m_Pimpl->GetBlockVector();
- D3D12MA_ASSERT(blockVector);
- return blockVector->Allocate(
- pAllocInfo->SizeInBytes,
- pAllocInfo->Alignment,
- *pAllocDesc,
- 1,
- (Allocation**)ppAllocation);
+ hr = AllocateHeap(pAllocDesc, *pAllocInfo, ppAllocation);
+ if(SUCCEEDED(hr))
+ return hr;
}
- else
+ if(blockVector != NULL)
{
- if(!IsHeapTypeStandard(pAllocDesc->HeapType))
- {
- return E_INVALIDARG;
- }
- ALLOCATION_DESC finalAllocDesc = *pAllocDesc;
-
- const UINT defaultPoolIndex = CalcDefaultPoolIndex(*pAllocDesc);
- bool requireCommittedMemory = (defaultPoolIndex == UINT32_MAX);
- if(requireCommittedMemory)
- {
- return AllocateHeap(&finalAllocDesc, *pAllocInfo, ppAllocation);
- }
-
- BlockVector* blockVector = m_BlockVectors[defaultPoolIndex];
- D3D12MA_ASSERT(blockVector);
-
- const UINT64 preferredBlockSize = blockVector->GetPreferredBlockSize();
- const bool preferCommittedMemory =
- m_AlwaysCommitted ||
- // Heuristics: Allocate committed memory if requested size if greater than half of preferred block size.
- pAllocInfo->SizeInBytes > preferredBlockSize / 2;
- if(preferCommittedMemory &&
- (finalAllocDesc.Flags & ALLOCATION_FLAG_NEVER_ALLOCATE) == 0)
- {
- finalAllocDesc.Flags |= ALLOCATION_FLAG_COMMITTED;
- }
-
- if((finalAllocDesc.Flags & ALLOCATION_FLAG_COMMITTED) != 0)
- {
- return AllocateHeap(&finalAllocDesc, *pAllocInfo, ppAllocation);
- }
- else
- {
- HRESULT hr = blockVector->Allocate(
- pAllocInfo->SizeInBytes,
- pAllocInfo->Alignment,
- finalAllocDesc,
- 1,
- (Allocation**)ppAllocation);
- if(SUCCEEDED(hr))
- {
- return hr;
- }
-
- return AllocateHeap(&finalAllocDesc, *pAllocInfo, ppAllocation);
- }
+ hr = blockVector->Allocate(pAllocInfo->SizeInBytes, pAllocInfo->Alignment,
+ *pAllocDesc, 1, (Allocation**)ppAllocation);
+ if(SUCCEEDED(hr))
+ return hr;
}
+ if(committedAllocationList != NULL && !preferCommitted)
+ {
+ hr = AllocateHeap(pAllocDesc, *pAllocInfo, ppAllocation);
+ if(SUCCEEDED(hr))
+ return hr;
+ }
+ return hr;
}
#ifdef __ID3D12Device4_INTERFACE_DEFINED__
@@ -5523,24 +5504,37 @@
return E_OUTOFMEMORY;
}
+ const UINT heapTypeIndex = HeapTypeToIndex(pAllocDesc->HeapType);
+ CommittedAllocationList& allocList = m_CommittedAllocations[heapTypeIndex];
+ D3D12_HEAP_PROPERTIES heapProps = {};
+ heapProps.Type = pAllocDesc->HeapType;
+ return AllocateHeap1_Impl(allocList, heapProps, pAllocDesc->ExtraHeapFlags, allocInfo, pProtectedSession, ppAllocation);
+}
+
+HRESULT AllocatorPimpl::AllocateHeap1_Impl(
+ CommittedAllocationList& allocList,
+ const D3D12_HEAP_PROPERTIES& heapProperties,
+ D3D12_HEAP_FLAGS heapFlags,
+ const D3D12_RESOURCE_ALLOCATION_INFO& allocInfo,
+ ID3D12ProtectedResourceSession *pProtectedSession,
+ Allocation** ppAllocation)
+{
D3D12_HEAP_DESC heapDesc = {};
heapDesc.SizeInBytes = allocInfo.SizeInBytes;
- heapDesc.Properties.Type = pAllocDesc->HeapType;
+ heapDesc.Properties = heapProperties;
heapDesc.Alignment = allocInfo.Alignment;
- heapDesc.Flags = pAllocDesc->ExtraHeapFlags;
+ heapDesc.Flags = heapFlags;
ID3D12Heap* heap = nullptr;
HRESULT hr = m_Device4->CreateHeap1(&heapDesc, pProtectedSession, __uuidof(*heap), (void**)&heap);
if(SUCCEEDED(hr))
{
- const UINT heapTypeIndex = HeapTypeToIndex(pAllocDesc->HeapType);
- CommittedAllocationList& allocList = m_CommittedAllocations[heapTypeIndex];
-
const BOOL wasZeroInitialized = TRUE;
(*ppAllocation) = m_AllocationObjectAllocator.Allocate(this, allocInfo.SizeInBytes, wasZeroInitialized);
(*ppAllocation)->InitHeap(&allocList, heap);
allocList.Register(*ppAllocation);
+ const UINT heapTypeIndex = HeapTypeToIndex(heapProperties.Type);
m_Budget.AddAllocation(heapTypeIndex, allocInfo.SizeInBytes);
m_Budget.m_BlockBytes[heapTypeIndex] += allocInfo.SizeInBytes;
}
@@ -5548,6 +5542,57 @@
}
#endif // #ifdef __ID3D12Device4_INTERFACE_DEFINED__
+template<typename D3D12_RESOURCE_DESC_T>
+HRESULT AllocatorPimpl::CalcAllocationParams(const ALLOCATION_DESC& allocDesc, UINT64 allocSize,
+ const D3D12_RESOURCE_DESC_T* resDesc,
+ BlockVector*& outBlockVector, CommittedAllocationList*& outCommittedAllocationList, bool& outPreferCommitted)
+{
+ outBlockVector = NULL;
+ outCommittedAllocationList = NULL;
+ outPreferCommitted = false;
+
+ if(allocDesc.CustomPool != NULL)
+ {
+ if((allocDesc.Flags & ALLOCATION_FLAG_COMMITTED) == 0)
+ {
+ outBlockVector = allocDesc.CustomPool->m_Pimpl->GetBlockVector();
+ }
+ }
+ else
+ {
+ if(!IsHeapTypeStandard(allocDesc.HeapType))
+ {
+ return E_INVALIDARG;
+ }
+ if((allocDesc.Flags & ALLOCATION_FLAG_NEVER_ALLOCATE) == 0)
+ {
+ outCommittedAllocationList = &m_CommittedAllocations[HeapTypeToIndex(allocDesc.HeapType)];
+ }
+ if(!m_AlwaysCommitted &&
+ (allocDesc.Flags & ALLOCATION_FLAG_COMMITTED) == 0)
+ {
+ const UINT defaultPoolIndex = CalcDefaultPoolIndex(allocDesc);
+ if(defaultPoolIndex != UINT32_MAX)
+ {
+ outBlockVector = m_BlockVectors[defaultPoolIndex];
+ const UINT64 preferredBlockSize = outBlockVector->GetPreferredBlockSize();
+ if(allocSize > preferredBlockSize)
+ {
+ outBlockVector = NULL;
+ }
+ else if(allocSize > preferredBlockSize / 2)
+ {
+ // Heuristics: Allocate committed memory if requested size if greater than half of preferred block size.
+ outPreferCommitted = true;
+ }
+ }
+ }
+ }
+ if(resDesc != NULL && PrefersCommittedAllocation(*resDesc))
+ outPreferCommitted = true;
+ return S_OK;
+}
+
UINT AllocatorPimpl::CalcDefaultPoolCount() const
{
if(SupportsResourceHeapTier2())