Ensured that allocations from pools with linear algorithm are ignored in vmaDefragment.

Made vmaDefragment work only with memory types that are HOST_VISIBLE and HOST_COHERENT.
diff --git a/src/vk_mem_alloc.h b/src/vk_mem_alloc.h
index 1d42070..acf49e8 100644
--- a/src/vk_mem_alloc.h
+++ b/src/vk_mem_alloc.h
@@ -2286,10 +2286,14 @@
 allocations are considered nonmovable in this call. Basic rules:

 

 - Only allocations made in memory types that have

-  `VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT` flag can be compacted. You may pass other

-  allocations but it makes no sense - these will never be moved.

-- You may pass allocations made with #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT but

-  it makes no sense - they will never be moved.

+  `VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT` and `VK_MEMORY_PROPERTY_HOST_COHERENT_BIT`

+  flags can be compacted. You may pass other allocations but it makes no sense -

+  these will never be moved.

+- Custom pools created with #VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT flag are not

+  defragmented. Allocations passed to this function that come from such pools

+  are ignored.

+- Allocations created with #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT or

+  created as dedicated allocations for any other reason are also ignored.

 - Both allocations made with or without #VMA_ALLOCATION_CREATE_MAPPED_BIT

   flag can be compacted. If not persistently mapped, memory will be mapped

   temporarily inside this function if needed.

@@ -9971,6 +9975,7 @@
     m_Allocations(VmaStlAllocator<AllocationInfo>(hAllocator->GetAllocationCallbacks())),

     m_Blocks(VmaStlAllocator<BlockInfo*>(hAllocator->GetAllocationCallbacks()))

 {

+    VMA_ASSERT(!pBlockVector->UsesLinearAlgorithm());

 }

 

 VmaDefragmentator::~VmaDefragmentator()

@@ -11470,9 +11475,10 @@
         VMA_ASSERT(hAlloc);

         const uint32_t memTypeIndex = hAlloc->GetMemoryTypeIndex();

         // DedicatedAlloc cannot be defragmented.

+        const VkMemoryPropertyFlags requiredMemFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;

         if((hAlloc->GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK) &&

-            // Only HOST_VISIBLE memory types can be defragmented.

-            ((m_MemProps.memoryTypes[memTypeIndex].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0) &&

+            // Only HOST_VISIBLE and HOST_COHERENT memory types can be defragmented.

+            ((m_MemProps.memoryTypes[memTypeIndex].propertyFlags & requiredMemFlags) == requiredMemFlags) &&

             // Lost allocation cannot be defragmented.

             (hAlloc->GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST))

         {

@@ -11482,7 +11488,11 @@
             // This allocation belongs to custom pool.

             if(hAllocPool != VK_NULL_HANDLE)

             {

-                pAllocBlockVector = &hAllocPool->GetBlockVector();

+                // Pools with linear algorithm are not defragmented.

+                if(!hAllocPool->m_BlockVector.UsesLinearAlgorithm())

+                {

+                    pAllocBlockVector = &hAllocPool->GetBlockVector();

+                }

             }

             // This allocation belongs to general pool.

             else

@@ -11490,11 +11500,14 @@
                 pAllocBlockVector = m_pBlockVectors[memTypeIndex];

             }

 

-            VmaDefragmentator* const pDefragmentator = pAllocBlockVector->EnsureDefragmentator(this, currentFrameIndex);

-

-            VkBool32* const pChanged = (pAllocationsChanged != VMA_NULL) ?

-                &pAllocationsChanged[allocIndex] : VMA_NULL;

-            pDefragmentator->AddAllocation(hAlloc, pChanged);

+            if(pAllocBlockVector != VMA_NULL)

+            {

+                VmaDefragmentator* const pDefragmentator =

+                    pAllocBlockVector->EnsureDefragmentator(this, currentFrameIndex);

+                VkBool32* const pChanged = (pAllocationsChanged != VMA_NULL) ?

+                    &pAllocationsChanged[allocIndex] : VMA_NULL;

+                pDefragmentator->AddAllocation(hAlloc, pChanged);

+            }

         }

     }