diff --git a/src/D3D12MemAlloc.cpp b/src/D3D12MemAlloc.cpp
index 9d416c2..7ba6d97 100644
--- a/src/D3D12MemAlloc.cpp
+++ b/src/D3D12MemAlloc.cpp
@@ -735,6 +735,12 @@
     return result;
 }
 
+static inline bool IsHeapTypeStandard(D3D12_HEAP_TYPE type)
+{
+    return type == D3D12_HEAP_TYPE_DEFAULT ||
+        type == D3D12_HEAP_TYPE_UPLOAD ||
+        type == D3D12_HEAP_TYPE_READBACK;
+}
 ////////////////////////////////////////////////////////////////////////////////
 // Private class Vector
 
@@ -2634,7 +2640,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 // Private class AllocatorPimpl definition
 
-static const UINT DEFAULT_POOL_HEAP_TYPE_COUNT = 3; // Only DEFAULT, UPLOAD, READBACK.
+static const UINT STANDARD_HEAP_TYPE_COUNT = 3; // Only DEFAULT, UPLOAD, READBACK.
 static const UINT DEFAULT_POOL_MAX_COUNT = 9;
 
 struct CurrentBudgetData
@@ -3820,7 +3826,7 @@
     }
 
     UINT64 freeMemory = UINT64_MAX;
-    if(m_HeapProps.Type != D3D12_HEAP_TYPE_CUSTOM)
+    if(IsHeapTypeStandard(m_HeapProps.Type))
     {
         Budget budget = {};
         m_hAllocator->GetBudgetForHeapType(budget, m_HeapProps.Type);
@@ -3935,7 +3941,7 @@
     NormalBlock* pBlockToDelete = NULL;
 
     bool budgetExceeded = false;
-    if(m_HeapProps.Type != D3D12_HEAP_TYPE_CUSTOM)
+    if(IsHeapTypeStandard(m_HeapProps.Type))
     {
         Budget budget = {};
         m_hAllocator->GetBudgetForHeapType(budget, m_HeapProps.Type);
@@ -4171,10 +4177,7 @@
         pBlock->m_pMetadata->Alloc(currRequest, size, *pAllocation);
         (*pAllocation)->InitPlaced(currRequest.offset, alignment, pBlock);
         D3D12MA_HEAVY_ASSERT(pBlock->Validate());
-        if(m_HeapProps.Type != D3D12_HEAP_TYPE_CUSTOM)
-        {
-            m_hAllocator->m_Budget.AddAllocation(HeapTypeToIndex(m_HeapProps.Type), size);
-        }
+        m_hAllocator->m_Budget.AddAllocation(HeapTypeToIndex(m_HeapProps.Type), size);
         return S_OK;
     }
     return E_OUTOFMEMORY;
@@ -4619,6 +4622,10 @@
         *ppvResource = NULL;
     }
 
+    if(pAllocDesc->CustomPool == NULL && !IsHeapTypeStandard(pAllocDesc->HeapType))
+    {
+        return E_INVALIDARG;
+    }
     ALLOCATION_DESC finalAllocDesc = *pAllocDesc;
 
     D3D12_RESOURCE_DESC finalResourceDesc = *pResourceDesc;
@@ -4792,6 +4799,10 @@
         return E_NOINTERFACE;
     }
 
+    if(pAllocDesc->CustomPool == NULL && !IsHeapTypeStandard(pAllocDesc->HeapType))
+    {
+        return E_INVALIDARG;
+    }
     ALLOCATION_DESC finalAllocDesc = *pAllocDesc;
 
     D3D12_RESOURCE_DESC1 finalResourceDesc = *pResourceDesc;
@@ -4922,6 +4933,10 @@
     }
     else
     {
+        if(!IsHeapTypeStandard(pAllocDesc->HeapType))
+        {
+            return E_INVALIDARG;
+        }
         ALLOCATION_DESC finalAllocDesc = *pAllocDesc;
 
         const UINT defaultPoolIndex = CalcDefaultPoolIndex(*pAllocDesc);
@@ -4989,6 +5004,10 @@
         return E_INVALIDARG;
     }
 
+    if(!IsHeapTypeStandard(pAllocDesc->HeapType))
+    {
+        return E_INVALIDARG;
+    }
     return AllocateHeap1(pAllocDesc, *pAllocInfo, pProtectedSession, ppAllocation);
 }
 #endif // #ifdef __ID3D12Device4_INTERFACE_DEFINED__
@@ -5037,7 +5056,7 @@
     D3D12_HEAP_FLAGS heapFlags,
     UINT64 minBytes)
 {
-    if(heapType != D3D12_HEAP_TYPE_DEFAULT && heapType != D3D12_HEAP_TYPE_UPLOAD && heapType != D3D12_HEAP_TYPE_READBACK)
+    if(!IsHeapTypeStandard(heapType))
     {
         D3D12MA_ASSERT(0 && "Allocator::SetDefaultHeapMinBytes: Invalid heapType passed.");
         return E_INVALIDARG;
@@ -5617,7 +5636,7 @@
     
     if(SupportsResourceHeapTier2())
     {
-        for(size_t heapTypeIndex = 0; heapTypeIndex < DEFAULT_POOL_HEAP_TYPE_COUNT; ++heapTypeIndex)
+        for(size_t heapTypeIndex = 0; heapTypeIndex < STANDARD_HEAP_TYPE_COUNT; ++heapTypeIndex)
         {
             BlockVector* const pBlockVector = m_BlockVectors[heapTypeIndex];
             D3D12MA_ASSERT(pBlockVector);
@@ -5626,7 +5645,7 @@
     }
     else
     {
-        for(size_t heapTypeIndex = 0; heapTypeIndex < DEFAULT_POOL_HEAP_TYPE_COUNT; ++heapTypeIndex)
+        for(size_t heapTypeIndex = 0; heapTypeIndex < STANDARD_HEAP_TYPE_COUNT; ++heapTypeIndex)
         {
             for(size_t heapSubType = 0; heapSubType < 3; ++heapSubType)
             {
@@ -5693,6 +5712,7 @@
         outCpuBudget->BlockBytes = m_Budget.m_BlockBytes[1] + m_Budget.m_BlockBytes[2];
         outCpuBudget->AllocationBytes = m_Budget.m_AllocationBytes[1] + m_Budget.m_AllocationBytes[2];
     }
+    // TODO: What to do with CUSTOM?
 
 #if D3D12MA_DXGI_1_4
     if(m_Adapter3)
@@ -5846,7 +5866,7 @@
 
             if (SupportsResourceHeapTier2())
             {
-                for (size_t heapType = 0; heapType < DEFAULT_POOL_HEAP_TYPE_COUNT; ++heapType)
+                for (size_t heapType = 0; heapType < STANDARD_HEAP_TYPE_COUNT; ++heapType)
                 {
                     json.WriteString(HeapTypeNames[heapType]);
                     json.BeginObject();
@@ -5862,7 +5882,7 @@
             }
             else
             {
-                for (size_t heapType = 0; heapType < DEFAULT_POOL_HEAP_TYPE_COUNT; ++heapType)
+                for (size_t heapType = 0; heapType < STANDARD_HEAP_TYPE_COUNT; ++heapType)
                 {
                     for (size_t heapSubType = 0; heapSubType < 3; ++heapSubType)
                     {
