More refactoring
diff --git a/src/D3D12MemAlloc.cpp b/src/D3D12MemAlloc.cpp
index 9a387a5..6757d90 100644
--- a/src/D3D12MemAlloc.cpp
+++ b/src/D3D12MemAlloc.cpp
@@ -4658,115 +4658,56 @@
     REFIID riidResource,

     void** ppvResource)

 {

+    D3D12MA_ASSERT(pAllocDesc && pResourceDesc && ppAllocation);

+

     *ppAllocation = NULL;

     if(ppvResource)

     {

         *ppvResource = NULL;

     }

 

-    if(pAllocDesc->CustomPool == NULL && !IsHeapTypeStandard(pAllocDesc->HeapType))

-    {

-        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);

     D3D12MA_ASSERT(IsPow2(resAllocInfo.Alignment));

     D3D12MA_ASSERT(resAllocInfo.SizeInBytes > 0);

 

-    if(pAllocDesc->CustomPool != NULL)

-    {

-        if((finalAllocDesc.Flags & ALLOCATION_FLAG_COMMITTED) != 0)

-        {

-            return E_INVALIDARG;

-        }

+    BlockVector* blockVector = NULL;

+    CommittedAllocationList* committedAllocationList = NULL;

+    bool preferCommitted = false;

+    HRESULT hr = CalcAllocationParams<D3D12_RESOURCE_DESC>(*pAllocDesc, resAllocInfo.SizeInBytes,

+        NULL, // pResDesc

+        blockVector, committedAllocationList, preferCommitted);

+    if(FAILED(hr))

+        return hr;

 

-        BlockVector* blockVector = pAllocDesc->CustomPool->m_Pimpl->GetBlockVector();

-        D3D12MA_ASSERT(blockVector);

-        return blockVector->CreateResource(

-            resAllocInfo.SizeInBytes,

-            resAllocInfo.Alignment,

-            finalAllocDesc,

-            finalResourceDesc,

-            InitialResourceState,

-            pOptimizedClearValue,

-            ppAllocation,

-            riidResource,

-            ppvResource);

-    }

-    else

+    hr = E_INVALIDARG;

+    if(committedAllocationList != NULL && preferCommitted)

     {

-        const ResourceClass resourceClass = ResourceDescToResourceClass(finalResourceDesc);

-        const UINT defaultPoolIndex = CalcDefaultPoolIndex(*pAllocDesc, resourceClass);

-        const bool requireCommittedMemory = defaultPoolIndex == UINT32_MAX;

-        if(requireCommittedMemory)

-    {

-            return AllocateCommittedResource(

-                &finalAllocDesc,

-                &finalResourceDesc,

-                resAllocInfo,

-                InitialResourceState,

-                pOptimizedClearValue,

-                ppAllocation,

-                riidResource,

-                ppvResource);

-        }

-

-        BlockVector* const blockVector = m_BlockVectors[defaultPoolIndex];

-        D3D12MA_ASSERT(blockVector);

-

-        const UINT64 preferredBlockSize = blockVector->GetPreferredBlockSize();

-        bool preferCommittedMemory =

-            m_AlwaysCommitted ||

-            PrefersCommittedAllocation(finalResourceDesc) ||

-            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,

-                resAllocInfo,

-                InitialResourceState,

-                pOptimizedClearValue,

-                ppAllocation,

-                riidResource,

-                ppvResource);

-    }

-        else

-        {

-            HRESULT hr = blockVector->CreateResource(

-                resAllocInfo.SizeInBytes,

-                resAllocInfo.Alignment,

-                finalAllocDesc,

-                finalResourceDesc,

-                InitialResourceState,

-                pOptimizedClearValue,

-                ppAllocation,

-                riidResource,

-                ppvResource);

+        hr = AllocateCommittedResource(pAllocDesc, &finalResourceDesc, resAllocInfo,

+            InitialResourceState, pOptimizedClearValue,

+            ppAllocation, riidResource, ppvResource);

         if(SUCCEEDED(hr))

-            {

             return hr;

     }

-

-            return AllocateCommittedResource(

-                &finalAllocDesc,

-                &finalResourceDesc,

-                resAllocInfo,

-                InitialResourceState,

-                pOptimizedClearValue,

-                ppAllocation,

-                riidResource,

-                ppvResource);

-        }

+    if(blockVector != NULL)

+    {

+        hr = blockVector->CreateResource(resAllocInfo.SizeInBytes, resAllocInfo.Alignment,

+            *pAllocDesc, finalResourceDesc,

+            InitialResourceState, pOptimizedClearValue,

+            ppAllocation, riidResource, ppvResource);

+        if(SUCCEEDED(hr))

+            return hr;

     }

+    if(committedAllocationList != NULL && !preferCommitted)

+    {

+        hr = AllocateCommittedResource(pAllocDesc, &finalResourceDesc, resAllocInfo,

+            InitialResourceState, pOptimizedClearValue,

+            ppAllocation, riidResource, ppvResource);

+        if(SUCCEEDED(hr))

+            return hr;

+    }

+    return hr;

 }

 

 #ifdef __ID3D12Device4_INTERFACE_DEFINED__

@@ -4829,129 +4770,63 @@
     REFIID riidResource,

     void** ppvResource)

 {

+    D3D12MA_ASSERT(pAllocDesc && pResourceDesc && ppAllocation);

+

     *ppAllocation = NULL;

     if(ppvResource)

     {

         *ppvResource = NULL;

     }

-

     if(m_Device8 == NULL)

     {

         return E_NOINTERFACE;

     }

 

-    if(pAllocDesc->CustomPool == NULL && !IsHeapTypeStandard(pAllocDesc->HeapType))

-    {

-        return E_INVALIDARG;

-    }

-    ALLOCATION_DESC finalAllocDesc = *pAllocDesc;

-

     D3D12_RESOURCE_DESC1 finalResourceDesc = *pResourceDesc;

     D3D12_RESOURCE_ALLOCATION_INFO resAllocInfo = GetResourceAllocationInfo(finalResourceDesc);

     resAllocInfo.Alignment = D3D12MA_MAX<UINT64>(resAllocInfo.Alignment, D3D12MA_DEBUG_ALIGNMENT);

     D3D12MA_ASSERT(IsPow2(resAllocInfo.Alignment));

     D3D12MA_ASSERT(resAllocInfo.SizeInBytes > 0);

 

-    bool requireCommittedMemory = pProtectedSession != NULL || (finalAllocDesc.Flags & ALLOCATION_FLAG_COMMITTED) != 0;

+    BlockVector* blockVector = NULL;

+    CommittedAllocationList* committedAllocationList = NULL;

+    bool preferCommitted = false;

+    HRESULT hr = CalcAllocationParams<D3D12_RESOURCE_DESC>(*pAllocDesc, resAllocInfo.SizeInBytes,

+        NULL, // pResDesc

+        blockVector, committedAllocationList, preferCommitted);

+    if(FAILED(hr))

+        return hr;

+    

+    if(pProtectedSession != NULL)

+        blockVector = NULL; // Must be committed allocation.

 

-    if(pAllocDesc->CustomPool != NULL)

+    hr = E_INVALIDARG;

+    if(committedAllocationList != NULL && preferCommitted)

     {

-        if(requireCommittedMemory)

-        {

-            return E_INVALIDARG;

-        }

-

-        BlockVector* blockVector = pAllocDesc->CustomPool->m_Pimpl->GetBlockVector();

-        D3D12MA_ASSERT(blockVector);

-        return blockVector->CreateResource2(

-            resAllocInfo.SizeInBytes,

-            resAllocInfo.Alignment,

-            finalAllocDesc,

-            finalResourceDesc,

-            InitialResourceState,

-            pOptimizedClearValue,

-            pProtectedSession,

-            ppAllocation,

-            riidResource,

-            ppvResource);

+        hr = AllocateCommittedResource2(pAllocDesc, &finalResourceDesc, resAllocInfo,

+            InitialResourceState, pOptimizedClearValue, pProtectedSession,

+            ppAllocation, riidResource, ppvResource);

+        if(SUCCEEDED(hr))

+            return hr;

     }

-    else

+    if(blockVector != NULL)

     {

-        const ResourceClass resourceClass = ResourceDescToResourceClass(finalResourceDesc);

-        const UINT defaultPoolIndex = CalcDefaultPoolIndex(*pAllocDesc, resourceClass);

-        requireCommittedMemory = requireCommittedMemory || defaultPoolIndex == UINT32_MAX;

-        if(requireCommittedMemory)

-        {

-            return AllocateCommittedResource2(

-                &finalAllocDesc,

-                &finalResourceDesc,

-                resAllocInfo,

-                InitialResourceState,

-                pOptimizedClearValue,

-                pProtectedSession,

-                ppAllocation,

-                riidResource,

-                ppvResource);

-        }

-

-        BlockVector* const blockVector = m_BlockVectors[defaultPoolIndex];

-        D3D12MA_ASSERT(blockVector);

-

-        const UINT64 preferredBlockSize = blockVector->GetPreferredBlockSize();

-        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 AllocateCommittedResource2(

-                &finalAllocDesc,

-                &finalResourceDesc,

-                resAllocInfo,

-                InitialResourceState,

-                pOptimizedClearValue,

-                pProtectedSession,

-                ppAllocation,

-                riidResource,

-                ppvResource);

-        }

-        else

-        {

-            HRESULT hr = blockVector->CreateResource2(

-                resAllocInfo.SizeInBytes,

-                resAllocInfo.Alignment,

-                finalAllocDesc,

-                finalResourceDesc,

-                InitialResourceState,

-                pOptimizedClearValue,

-                pProtectedSession,

-                ppAllocation,

-                riidResource,

-                ppvResource);

-            if(SUCCEEDED(hr))

-            {

-                return hr;

-            }

-

-            return AllocateCommittedResource2(

-                &finalAllocDesc,

-                &finalResourceDesc,

-                resAllocInfo,

-                InitialResourceState,

-                pOptimizedClearValue,

-                pProtectedSession,

-                ppAllocation,

-                riidResource,

-                ppvResource);

-        }

+        hr = blockVector->CreateResource2(resAllocInfo.SizeInBytes, resAllocInfo.Alignment,

+            *pAllocDesc, finalResourceDesc,

+            InitialResourceState, pOptimizedClearValue, pProtectedSession,

+            ppAllocation, riidResource, ppvResource);

+        if(SUCCEEDED(hr))

+            return hr;

     }

+    if(committedAllocationList != NULL && !preferCommitted)

+    {

+        hr = AllocateCommittedResource2(pAllocDesc, &finalResourceDesc, resAllocInfo,

+            InitialResourceState, pOptimizedClearValue, pProtectedSession,

+            ppAllocation, riidResource, ppvResource);

+        if(SUCCEEDED(hr))

+            return hr;

+    }

+    return hr;

 }

 #endif // #ifdef __ID3D12Device8_INTERFACE_DEFINED__

 

@@ -5399,7 +5274,8 @@
     {

         PoolPimpl* const pool = allocDesc.CustomPool->m_Pimpl;

         outBlockVector = pool->GetBlockVector();

-        outCommittedAllocationList = &pool->m_CommittedAllocations;

+        // TODO!

+        //outCommittedAllocationList = &pool->m_CommittedAllocations;

     }

     else

     {