packages feed

VulkanMemoryAllocator 0.10.4 → 0.10.5

raw patch · 5 files changed

+117/−185 lines, 5 filesdep ~vulkannew-uploaderPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: vulkan

API changes (from Hackage documentation)

Files

VulkanMemoryAllocator.cabal view
@@ -1,11 +1,11 @@ cabal-version: 2.2 --- This file has been generated from package.yaml by hpack version 0.34.5.+-- This file has been generated from package.yaml by hpack version 0.34.7. -- -- see: https://github.com/sol/hpack  name:           VulkanMemoryAllocator-version:        0.10.4+version:        0.10.5 synopsis:       Bindings to the VulkanMemoryAllocator library category:       Graphics homepage:       https://github.com/expipiplus1/vulkan#readme@@ -94,7 +94,7 @@     , bytestring     , transformers     , vector-    , vulkan >=3.6 && <3.24+    , vulkan >=3.6 && <3.25   if flag(safe-foreign-calls)     cpp-options: -DSAFE_FOREIGN_CALLS   if flag(vma-ndebug)
VulkanMemoryAllocator/include/vk_mem_alloc.h view
@@ -884,7 +884,7 @@  Use value `VK_NULL_HANDLE` to represent a null/invalid allocation. */-VK_DEFINE_NON_DISPATCHABLE_HANDLE(VmaVirtualAllocation);+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VmaVirtualAllocation)  /** @} */ @@ -2842,16 +2842,20 @@    #define VMA_SORT(beg, end, cmp)  std::sort(beg, end, cmp) #endif -#ifndef VMA_DEBUG_LOG-   #define VMA_DEBUG_LOG(format, ...)+#ifndef VMA_DEBUG_LOG_FORMAT+   #define VMA_DEBUG_LOG_FORMAT(format, ...)    /*-   #define VMA_DEBUG_LOG(format, ...) do { \-       printf(format, __VA_ARGS__); \+   #define VMA_DEBUG_LOG_FORMAT(format, ...) do { \+       printf((format), __VA_ARGS__); \        printf("\n"); \    } while(false)    */ #endif +#ifndef VMA_DEBUG_LOG+    #define VMA_DEBUG_LOG(str)   VMA_DEBUG_LOG_FORMAT("%s", (str))+#endif+ // Define this macro to 1 to enable functions: vmaBuildStatsString, vmaFreeStatsString. #if VMA_STATS_STRING_ENABLED     static inline void VmaUint32ToStr(char* VMA_NOT_NULL outStr, size_t strLen, uint32_t num)@@ -3126,7 +3130,7 @@  #ifndef _VMA_FORWARD_DECLARATIONS // Opaque handle used by allocation algorithms to identify single allocation in any conforming way.-VK_DEFINE_NON_DISPATCHABLE_HANDLE(VmaAllocHandle);+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VmaAllocHandle)  struct VmaMutexLock; struct VmaMutexLockRead;@@ -5487,7 +5491,6 @@     // Posts next part of an open string. The number is converted to decimal characters.     void ContinueString(uint32_t n);     void ContinueString(uint64_t n);-    void ContinueString_Size(size_t n);     // Posts next part of an open string. Pointer value is converted to characters     // using "%p" formatting - shown as hexadecimal number, e.g.: 000000081276Ad00     void ContinueString_Pointer(const void* ptr);@@ -5497,7 +5500,6 @@     // Writes a number value.     void WriteNumber(uint32_t n);     void WriteNumber(uint64_t n);-    void WriteSize(size_t n);     // Writes a boolean value - false or true.     void WriteBool(bool b);     // Writes a null value.@@ -5522,11 +5524,6 @@     VmaVector< StackItem, VmaStlAllocator<StackItem> > m_Stack;     bool m_InsideString; -    // Write size_t for less than 64bits-    void WriteSize(size_t n, std::integral_constant<bool, false>) { m_SB.AddNumber(static_cast<uint32_t>(n)); }-    // Write size_t for 64bits-    void WriteSize(size_t n, std::integral_constant<bool, true>) { m_SB.AddNumber(static_cast<uint64_t>(n)); }-     void BeginValue(bool isString);     void WriteIndent(bool oneLess = false); };@@ -5669,14 +5666,6 @@     m_SB.AddNumber(n); } -void VmaJsonWriter::ContinueString_Size(size_t n)-{-    VMA_ASSERT(m_InsideString);-    // Fix for AppleClang incorrect type casting-    // TODO: Change to if constexpr when C++17 used as minimal standard-    WriteSize(n, std::is_same<size_t, uint64_t>{});-}- void VmaJsonWriter::ContinueString_Pointer(const void* ptr) {     VMA_ASSERT(m_InsideString);@@ -5708,15 +5697,6 @@     m_SB.AddNumber(n); } -void VmaJsonWriter::WriteSize(size_t n)-{-    VMA_ASSERT(!m_InsideString);-    BeginValue(false);-    // Fix for AppleClang incorrect type casting-    // TODO: Change to if constexpr when C++17 used as minimal standard-    WriteSize(n, std::is_same<size_t, uint64_t>{});-}- void VmaJsonWriter::WriteBool(bool b) {     VMA_ASSERT(!m_InsideString);@@ -6433,7 +6413,7 @@ {     if (IsVirtual())     {-        VMA_DEBUG_LOG("UNFREED VIRTUAL ALLOCATION; Offset: %llu; Size: %llu; UserData: %p", offset, size, userData);+        VMA_DEBUG_LOG_FORMAT("UNFREED VIRTUAL ALLOCATION; Offset: %llu; Size: %llu; UserData: %p", offset, size, userData);     }     else     {@@ -6444,12 +6424,12 @@         const char* name = allocation->GetName();  #if VMA_STATS_STRING_ENABLED-        VMA_DEBUG_LOG("UNFREED ALLOCATION; Offset: %llu; Size: %llu; UserData: %p; Name: %s; Type: %s; Usage: %u",+        VMA_DEBUG_LOG_FORMAT("UNFREED ALLOCATION; Offset: %llu; Size: %llu; UserData: %p; Name: %s; Type: %s; Usage: %u",             offset, size, userData, name ? name : "vma_empty",             VMA_SUBALLOCATION_TYPE_NAMES[allocation->GetSuballocationType()],             allocation->GetBufferImageUsage()); #else-        VMA_DEBUG_LOG("UNFREED ALLOCATION; Offset: %llu; Size: %llu; UserData: %p; Name: %s; Type: %u",+        VMA_DEBUG_LOG_FORMAT("UNFREED ALLOCATION; Offset: %llu; Size: %llu; UserData: %p; Name: %s; Type: %u",             offset, size, userData, name ? name : "vma_empty",             (uint32_t)allocation->GetSuballocationType()); #endif // VMA_STATS_STRING_ENABLED@@ -6465,13 +6445,13 @@     json.WriteNumber(GetSize());      json.WriteString("UnusedBytes");-    json.WriteSize(unusedBytes);+    json.WriteNumber(unusedBytes);      json.WriteString("Allocations");-    json.WriteSize(allocationCount);+    json.WriteNumber((uint64_t)allocationCount);      json.WriteString("UnusedRanges");-    json.WriteSize(unusedRangeCount);+    json.WriteNumber((uint64_t)unusedRangeCount);      json.WriteString("Suballocations");     json.BeginArray();@@ -6781,7 +6761,7 @@     VkDeviceSize GetSumFreeSize() const override { return m_SumFreeSize; }     bool IsEmpty() const override { return (m_Suballocations.size() == 1) && (m_FreeCount == 1); }     void Free(VmaAllocHandle allocHandle) override { FreeSuballocation(FindAtOffset((VkDeviceSize)allocHandle - 1)); }-    VkDeviceSize GetAllocationOffset(VmaAllocHandle allocHandle) const override { return (VkDeviceSize)allocHandle - 1; };+    VkDeviceSize GetAllocationOffset(VmaAllocHandle allocHandle) const override { return (VkDeviceSize)allocHandle - 1; }      void Init(VkDeviceSize size) override;     bool Validate() const override;@@ -7618,7 +7598,7 @@      VkDeviceSize GetSumFreeSize() const override { return m_SumFreeSize; }     bool IsEmpty() const override { return GetAllocationCount() == 0; }-    VkDeviceSize GetAllocationOffset(VmaAllocHandle allocHandle) const override { return (VkDeviceSize)allocHandle - 1; };+    VkDeviceSize GetAllocationOffset(VmaAllocHandle allocHandle) const override { return (VkDeviceSize)allocHandle - 1; }      void Init(VkDeviceSize size) override;     bool Validate() const override;@@ -8091,30 +8071,17 @@             {                 const VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex]; -                // 1. Process free space before this allocation.-                if (lastOffset < suballoc.offset)-                {-                    // There is free space from lastOffset to suballoc.offset.-                    const VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;-                }--                // 2. Process this allocation.+                // Process this allocation.                 // There is allocation with suballoc.offset, suballoc.size.                 ++inoutStats.allocationCount; -                // 3. Prepare for next iteration.+                // Prepare for next iteration.                 lastOffset = suballoc.offset + suballoc.size;                 ++nextAlloc2ndIndex;             }             // We are at the end.             else             {-                if (lastOffset < freeSpace2ndTo1stEnd)-                {-                    // There is free space from lastOffset to freeSpace2ndTo1stEnd.-                    const VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;-                }-                 // End of loop.                 lastOffset = freeSpace2ndTo1stEnd;             }@@ -8138,30 +8105,17 @@         {             const VmaSuballocation& suballoc = suballocations1st[nextAlloc1stIndex]; -            // 1. Process free space before this allocation.-            if (lastOffset < suballoc.offset)-            {-                // There is free space from lastOffset to suballoc.offset.-                const VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;-            }--            // 2. Process this allocation.+            // Process this allocation.             // There is allocation with suballoc.offset, suballoc.size.             ++inoutStats.allocationCount; -            // 3. Prepare for next iteration.+            // Prepare for next iteration.             lastOffset = suballoc.offset + suballoc.size;             ++nextAlloc1stIndex;         }         // We are at the end.         else         {-            if (lastOffset < freeSpace1stTo2ndEnd)-            {-                // There is free space from lastOffset to freeSpace1stTo2ndEnd.-                const VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;-            }-             // End of loop.             lastOffset = freeSpace1stTo2ndEnd;         }@@ -8184,30 +8138,17 @@             {                 const VmaSuballocation& suballoc = suballocations2nd[nextAlloc2ndIndex]; -                // 1. Process free space before this allocation.-                if (lastOffset < suballoc.offset)-                {-                    // There is free space from lastOffset to suballoc.offset.-                    const VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;-                }--                // 2. Process this allocation.+                // Process this allocation.                 // There is allocation with suballoc.offset, suballoc.size.                 ++inoutStats.allocationCount; -                // 3. Prepare for next iteration.+                // Prepare for next iteration.                 lastOffset = suballoc.offset + suballoc.size;                 --nextAlloc2ndIndex;             }             // We are at the end.             else             {-                if (lastOffset < size)-                {-                    // There is free space from lastOffset to size.-                    const VkDeviceSize unusedRangeSize = size - lastOffset;-                }-                 // End of loop.                 lastOffset = size;             }@@ -9278,7 +9219,7 @@     VkDeviceSize GetSumFreeSize() const override { return m_SumFreeSize + GetUnusableSize(); }     bool IsEmpty() const override { return m_Root->type == Node::TYPE_FREE; }     VkResult CheckCorruption(const void* pBlockData) override { return VK_ERROR_FEATURE_NOT_PRESENT; }-    VkDeviceSize GetAllocationOffset(VmaAllocHandle allocHandle) const override { return (VkDeviceSize)allocHandle - 1; };+    VkDeviceSize GetAllocationOffset(VmaAllocHandle allocHandle) const override { return (VkDeviceSize)allocHandle - 1; }     void DebugLogAllAllocations() const override { DebugLogAllAllocationNode(m_Root, 0); }      void Init(VkDeviceSize size) override;@@ -9977,7 +9918,7 @@     size_t GetFreeRegionsCount() const override { return m_BlocksFreeCount + 1; }     VkDeviceSize GetSumFreeSize() const override { return m_BlocksFreeSize + m_NullBlock->size; }     bool IsEmpty() const override { return m_NullBlock->offset == 0; }-    VkDeviceSize GetAllocationOffset(VmaAllocHandle allocHandle) const override { return ((Block*)allocHandle)->offset; };+    VkDeviceSize GetAllocationOffset(VmaAllocHandle allocHandle) const override { return ((Block*)allocHandle)->offset; }      void Init(VkDeviceSize size) override;     bool Validate() const override;@@ -11288,14 +11229,15 @@     const uint32_t algorithm = createInfo.flags & VMA_VIRTUAL_BLOCK_CREATE_ALGORITHM_MASK;     switch (algorithm)     {-    default:-        VMA_ASSERT(0);     case 0:         m_Metadata = vma_new(GetAllocationCallbacks(), VmaBlockMetadata_TLSF)(VK_NULL_HANDLE, 1, true);         break;     case VMA_VIRTUAL_BLOCK_CREATE_LINEAR_ALGORITHM_BIT:         m_Metadata = vma_new(GetAllocationCallbacks(), VmaBlockMetadata_Linear)(VK_NULL_HANDLE, 1, true);         break;+    default:+        VMA_ASSERT(0);+        m_Metadata = vma_new(GetAllocationCallbacks(), VmaBlockMetadata_TLSF)(VK_NULL_HANDLE, 1, true);     }      m_Metadata->Init(createInfo.size);@@ -11303,7 +11245,7 @@  VmaVirtualBlock_T::~VmaVirtualBlock_T() {-    // Define macro VMA_DEBUG_LOG to receive the list of the unfreed allocations+    // Define macro VMA_DEBUG_LOG_FORMAT to receive the list of the unfreed allocations     if (!m_Metadata->IsEmpty())         m_Metadata->DebugLogAllAllocations();     // This is the most important assert in the entire library.@@ -11779,14 +11721,16 @@      switch (algorithm)     {+    case 0:+        m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_TLSF)(hAllocator->GetAllocationCallbacks(),+            bufferImageGranularity, false); // isVirtual+        break;     case VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT:         m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Linear)(hAllocator->GetAllocationCallbacks(),             bufferImageGranularity, false); // isVirtual         break;     default:         VMA_ASSERT(0);-        // Fall-through.-    case 0:         m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_TLSF)(hAllocator->GetAllocationCallbacks(),             bufferImageGranularity, false); // isVirtual     }@@ -11795,7 +11739,7 @@  void VmaDeviceMemoryBlock::Destroy(VmaAllocator allocator) {-    // Define macro VMA_DEBUG_LOG to receive the list of the unfreed allocations+    // Define macro VMA_DEBUG_LOG_FORMAT to receive the list of the unfreed allocations     if (!m_pMetadata->IsEmpty())         m_pMetadata->DebugLogAllAllocations();     // This is the most important assert in the entire library.@@ -12503,7 +12447,7 @@                 pCurrBlock, size, alignment, createInfo.flags, createInfo.pUserData, suballocType, strategy, pAllocation);             if (res == VK_SUCCESS)             {-                VMA_DEBUG_LOG("    Returned from last block #%u", pCurrBlock->GetId());+                VMA_DEBUG_LOG_FORMAT("    Returned from last block #%u", pCurrBlock->GetId());                 IncrementallySortBlocks();                 return VK_SUCCESS;             }@@ -12539,7 +12483,7 @@                                 pCurrBlock, size, alignment, createInfo.flags, createInfo.pUserData, suballocType, strategy, pAllocation);                             if (res == VK_SUCCESS)                             {-                                VMA_DEBUG_LOG("    Returned from existing block #%u", pCurrBlock->GetId());+                                VMA_DEBUG_LOG_FORMAT("    Returned from existing block #%u", pCurrBlock->GetId());                                 IncrementallySortBlocks();                                 return VK_SUCCESS;                             }@@ -12558,7 +12502,7 @@                         pCurrBlock, size, alignment, createInfo.flags, createInfo.pUserData, suballocType, strategy, pAllocation);                     if (res == VK_SUCCESS)                     {-                        VMA_DEBUG_LOG("    Returned from existing block #%u", pCurrBlock->GetId());+                        VMA_DEBUG_LOG_FORMAT("    Returned from existing block #%u", pCurrBlock->GetId());                         IncrementallySortBlocks();                         return VK_SUCCESS;                     }@@ -12575,7 +12519,7 @@                 VkResult res = AllocateFromBlock(pCurrBlock, size, alignment, createInfo.flags, createInfo.pUserData, suballocType, strategy, pAllocation);                 if (res == VK_SUCCESS)                 {-                    VMA_DEBUG_LOG("    Returned from existing block #%u", pCurrBlock->GetId());+                    VMA_DEBUG_LOG_FORMAT("    Returned from existing block #%u", pCurrBlock->GetId());                     IncrementallySortBlocks();                     return VK_SUCCESS;                 }@@ -12642,7 +12586,7 @@                 pBlock, size, alignment, createInfo.flags, createInfo.pUserData, suballocType, strategy, pAllocation);             if (res == VK_SUCCESS)             {-                VMA_DEBUG_LOG("    Created new block #%u Size=%llu", pBlock->GetId(), newBlockSize);+                VMA_DEBUG_LOG_FORMAT("    Created new block #%u Size=%llu", pBlock->GetId(), newBlockSize);                 IncrementallySortBlocks();                 return VK_SUCCESS;             }@@ -12691,7 +12635,7 @@         pBlock->PostFree(m_hAllocator);         VMA_HEAVY_ASSERT(pBlock->Validate()); -        VMA_DEBUG_LOG("  Freed from MemoryTypeIndex=%u", m_MemoryTypeIndex);+        VMA_DEBUG_LOG_FORMAT("  Freed from MemoryTypeIndex=%u", m_MemoryTypeIndex);          const bool canDeleteBlock = m_Blocks.size() > m_MinBlockCount;         // pBlock became empty after this deallocation.@@ -12724,7 +12668,7 @@     // lock, for performance reason.     if (pBlockToDelete != VMA_NULL)     {-        VMA_DEBUG_LOG("    Deleted empty block #%u", pBlockToDelete->GetId());+        VMA_DEBUG_LOG_FORMAT("    Deleted empty block #%u", pBlockToDelete->GetId());         pBlockToDelete->Destroy(m_hAllocator);         vma_delete(m_hAllocator, pBlockToDelete);     }@@ -13032,20 +12976,18 @@     {     case 0: // Default algorithm         m_Algorithm = VMA_DEFRAGMENTATION_FLAG_ALGORITHM_BALANCED_BIT;+        m_AlgorithmState = vma_new_array(hAllocator, StateBalanced, m_BlockVectorCount);+        break;     case VMA_DEFRAGMENTATION_FLAG_ALGORITHM_BALANCED_BIT:-    {         m_AlgorithmState = vma_new_array(hAllocator, StateBalanced, m_BlockVectorCount);         break;-    }     case VMA_DEFRAGMENTATION_FLAG_ALGORITHM_EXTENSIVE_BIT:-    {         if (hAllocator->GetBufferImageGranularity() > 1)         {             m_AlgorithmState = vma_new_array(hAllocator, StateExtensive, m_BlockVectorCount);         }         break;     }-    } }  VmaDefragmentationContext_T::~VmaDefragmentationContext_T()@@ -13293,50 +13235,49 @@     // Move blocks with immovable allocations according to algorithm     if (immovableBlocks.size() > 0)     {-        switch (m_Algorithm)-        {-        case VMA_DEFRAGMENTATION_FLAG_ALGORITHM_EXTENSIVE_BIT:+        do         {-            if (m_AlgorithmState != VMA_NULL)+            if(m_Algorithm == VMA_DEFRAGMENTATION_FLAG_ALGORITHM_EXTENSIVE_BIT)             {-                bool swapped = false;-                // Move to the start of free blocks range-                for (const FragmentedBlock& block : immovableBlocks)+                if (m_AlgorithmState != VMA_NULL)                 {-                    StateExtensive& state = reinterpret_cast<StateExtensive*>(m_AlgorithmState)[block.data];-                    if (state.operation != StateExtensive::Operation::Cleanup)+                    bool swapped = false;+                    // Move to the start of free blocks range+                    for (const FragmentedBlock& block : immovableBlocks)                     {-                        VmaBlockVector* vector = m_pBlockVectors[block.data];-                        VmaMutexLockWrite lock(vector->GetMutex(), vector->GetAllocator()->m_UseMutex);--                        for (size_t i = 0, count = vector->GetBlockCount() - m_ImmovableBlockCount; i < count; ++i)+                        StateExtensive& state = reinterpret_cast<StateExtensive*>(m_AlgorithmState)[block.data];+                        if (state.operation != StateExtensive::Operation::Cleanup)                         {-                            if (vector->GetBlock(i) == block.block)+                            VmaBlockVector* vector = m_pBlockVectors[block.data];+                            VmaMutexLockWrite lock(vector->GetMutex(), vector->GetAllocator()->m_UseMutex);++                            for (size_t i = 0, count = vector->GetBlockCount() - m_ImmovableBlockCount; i < count; ++i)                             {-                                VMA_SWAP(vector->m_Blocks[i], vector->m_Blocks[vector->GetBlockCount() - ++m_ImmovableBlockCount]);-                                if (state.firstFreeBlock != SIZE_MAX)+                                if (vector->GetBlock(i) == block.block)                                 {-                                    if (i + 1 < state.firstFreeBlock)+                                    VMA_SWAP(vector->m_Blocks[i], vector->m_Blocks[vector->GetBlockCount() - ++m_ImmovableBlockCount]);+                                    if (state.firstFreeBlock != SIZE_MAX)                                     {-                                        if (state.firstFreeBlock > 1)-                                            VMA_SWAP(vector->m_Blocks[i], vector->m_Blocks[--state.firstFreeBlock]);-                                        else-                                            --state.firstFreeBlock;+                                        if (i + 1 < state.firstFreeBlock)+                                        {+                                            if (state.firstFreeBlock > 1)+                                                VMA_SWAP(vector->m_Blocks[i], vector->m_Blocks[--state.firstFreeBlock]);+                                            else+                                                --state.firstFreeBlock;+                                        }                                     }+                                    swapped = true;+                                    break;                                 }-                                swapped = true;-                                break;                             }                         }                     }+                    if (swapped)+                        result = VK_INCOMPLETE;+                    break;                 }-                if (swapped)-                    result = VK_INCOMPLETE;-                break;             }-        }-        default:-        {+             // Move to the beginning             for (const FragmentedBlock& block : immovableBlocks)             {@@ -13352,9 +13293,7 @@                     }                 }             }-            break;-        }-        }+        } while (false);     }      // Bulk-map destination blocks@@ -13372,14 +13311,15 @@     {     case VMA_DEFRAGMENTATION_FLAG_ALGORITHM_FAST_BIT:         return ComputeDefragmentation_Fast(vector);-    default:-        VMA_ASSERT(0);     case VMA_DEFRAGMENTATION_FLAG_ALGORITHM_BALANCED_BIT:         return ComputeDefragmentation_Balanced(vector, index, true);     case VMA_DEFRAGMENTATION_FLAG_ALGORITHM_FULL_BIT:         return ComputeDefragmentation_Full(vector);     case VMA_DEFRAGMENTATION_FLAG_ALGORITHM_EXTENSIVE_BIT:         return ComputeDefragmentation_Extensive(vector, index);+    default:+        VMA_ASSERT(0);+        return ComputeDefragmentation_Balanced(vector, index, true);     } } @@ -13445,10 +13385,10 @@             continue;         case CounterStatus::End:             return true;-        default:-            VMA_ASSERT(0);         case CounterStatus::Pass:             break;+        default:+            VMA_ASSERT(0);         }          VkDeviceSize offset = moveData.move.srcAllocation->GetOffset();@@ -13534,10 +13474,10 @@                 continue;             case CounterStatus::End:                 return true;-            default:-                VMA_ASSERT(0);             case CounterStatus::Pass:                 break;+            default:+                VMA_ASSERT(0);             }              // Check all previous blocks for free space@@ -13581,10 +13521,10 @@                 continue;             case CounterStatus::End:                 return true;-            default:-                VMA_ASSERT(0);             case CounterStatus::Pass:                 break;+            default:+                VMA_ASSERT(0);             }              // Check all previous blocks for free space@@ -13668,10 +13608,10 @@                 continue;             case CounterStatus::End:                 return true;-            default:-                VMA_ASSERT(0);             case CounterStatus::Pass:                 break;+            default:+                VMA_ASSERT(0);             }              // Check all previous blocks for free space@@ -13759,10 +13699,10 @@                 continue;             case CounterStatus::End:                 return true;-            default:-                VMA_ASSERT(0);             case CounterStatus::Pass:                 break;+            default:+                VMA_ASSERT(0);             }              // Check all previous blocks for free space@@ -13800,14 +13740,15 @@             case StateExtensive::Operation::FindFreeBlockBuffer:                 vectorState.operation = StateExtensive::Operation::MoveBuffers;                 break;-            default:-                VMA_ASSERT(0);             case StateExtensive::Operation::FindFreeBlockTexture:                 vectorState.operation = StateExtensive::Operation::MoveTextures;                 break;             case StateExtensive::Operation::FindFreeBlockAll:                 vectorState.operation = StateExtensive::Operation::MoveAll;                 break;+            default:+                VMA_ASSERT(0);+                vectorState.operation = StateExtensive::Operation::MoveTextures;             }             vectorState.firstFreeBlock = last;             // Nothing done, block found without reallocations, can perform another reallocs in same pass@@ -13945,10 +13886,10 @@                 continue;             case CounterStatus::End:                 return true;-            default:-                VMA_ASSERT(0);             case CounterStatus::Pass:                 break;+            default:+                VMA_ASSERT(0);             }              // Move only single type of resources at once@@ -14485,7 +14426,7 @@     VmaAllocation* pAllocations) {     VMA_ASSERT(pAllocations != VMA_NULL);-    VMA_DEBUG_LOG("  AllocateMemory: MemoryTypeIndex=%u, AllocationCount=%zu, Size=%llu", memTypeIndex, allocationCount, size);+    VMA_DEBUG_LOG_FORMAT("  AllocateMemory: MemoryTypeIndex=%u, AllocationCount=%zu, Size=%llu", memTypeIndex, allocationCount, size);      VmaAllocationCreateInfo finalCreateInfo = createInfo;     VkResult res = CalcMemTypeParams(@@ -14534,7 +14475,8 @@             // Protection against creating each allocation as dedicated when we reach or exceed heap size/budget,             // which can quickly deplete maxMemoryAllocationCount: Don't prefer dedicated allocations when above             // 3/4 of the maximum allocation count.-            if(m_DeviceMemoryCount.load() > m_PhysicalDeviceProperties.limits.maxMemoryAllocationCount * 3 / 4)+            if(m_PhysicalDeviceProperties.limits.maxMemoryAllocationCount < UINT32_MAX / 4 &&+                m_DeviceMemoryCount.load() > m_PhysicalDeviceProperties.limits.maxMemoryAllocationCount * 3 / 4)             {                 dedicatedPreferred = false;             }@@ -14730,7 +14672,7 @@         {             dedicatedAllocations.Register(pAllocations[allocIndex]);         }-        VMA_DEBUG_LOG("    Allocated DedicatedMemory Count=%zu, MemoryTypeIndex=#%u", allocationCount, memTypeIndex);+        VMA_DEBUG_LOG_FORMAT("    Allocated DedicatedMemory Count=%zu, MemoryTypeIndex=#%u", allocationCount, memTypeIndex);     }     else     {@@ -15288,7 +15230,7 @@  VkResult VmaAllocator_T::CreatePool(const VmaPoolCreateInfo* pCreateInfo, VmaPool* pPool) {-    VMA_DEBUG_LOG("  CreatePool: MemoryTypeIndex=%u, flags=%u", pCreateInfo->memoryTypeIndex, pCreateInfo->flags);+    VMA_DEBUG_LOG_FORMAT("  CreatePool: MemoryTypeIndex=%u, flags=%u", pCreateInfo->memoryTypeIndex, pCreateInfo->flags);      VmaPoolCreateInfo newCreateInfo = *pCreateInfo; @@ -15622,7 +15564,7 @@     VkBuffer hBuffer,     const void* pNext) {-    VkResult res = VK_SUCCESS;+    VkResult res = VK_ERROR_UNKNOWN;     switch(hAllocation->GetType())     {     case VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:@@ -15647,7 +15589,7 @@     VkImage hImage,     const void* pNext) {-    VkResult res = VK_SUCCESS;+    VkResult res = VK_ERROR_UNKNOWN;     switch(hAllocation->GetType())     {     case VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:@@ -15767,7 +15709,7 @@     m_Budget.RemoveAllocation(MemoryTypeIndexToHeapIndex(allocation->GetMemoryTypeIndex()), allocation->GetSize());     m_AllocationObjectAllocator.Free(allocation); -    VMA_DEBUG_LOG("    Freed DedicatedMemory MemoryTypeIndex=%u", memTypeIndex);+    VMA_DEBUG_LOG_FORMAT("    Freed DedicatedMemory MemoryTypeIndex=%u", memTypeIndex); }  uint32_t VmaAllocator_T::CalculateGpuDefragmentationMemoryTypeBits() const@@ -16012,7 +15954,7 @@                         {                             json.WriteString("Name");                             json.BeginString();-                            json.ContinueString_Size(index++);+                            json.ContinueString((uint64_t)index++);                             if (pool->GetName())                             {                                 json.ContinueString(" - ");@@ -18487,7 +18429,7 @@     {         // Inspect pass.pMoves[i].srcAllocation, identify what buffer/image it represents.         VmaAllocationInfo allocInfo;-        vmaGetAllocationInfo(allocator, pMoves[i].srcAllocation, &allocInfo);+        vmaGetAllocationInfo(allocator, pass.pMoves[i].srcAllocation, &allocInfo);         MyEngineResourceData* resData = (MyEngineResourceData*)allocInfo.pUserData;          // Recreate and bind this buffer/image at: pass.pMoves[i].dstMemory, pass.pMoves[i].dstOffset.@@ -18495,7 +18437,7 @@         VkImage newImg;         res = vkCreateImage(device, &imgCreateInfo, nullptr, &newImg);         // Check res...-        res = vmaBindImageMemory(allocator, pMoves[i].dstTmpAllocation, newImg);+        res = vmaBindImageMemory(allocator, pass.pMoves[i].dstTmpAllocation, newImg);         // Check res...          // Issue a vkCmdCopyBuffer/vkCmdCopyImage to copy its content to the new place.
changelog.md view
@@ -2,6 +2,9 @@  ## WIP +## [0.10.5] - 2022-12-27+- Bump VMA+ ## [0.10.4] - 2022-10-02 - More robust linking against C++ standard library - Raise upper bound on `vulkan`
package.yaml view
@@ -1,5 +1,5 @@ name: VulkanMemoryAllocator-version: "0.10.4"+version: "0.10.5" synopsis: Bindings to the VulkanMemoryAllocator library category: Graphics maintainer: Ellie Hermaszewska <live.long.and.prosper@monoid.al>@@ -20,7 +20,7 @@     src/lib.cpp   dependencies:     - base <5-    - vulkan >= 3.6 && < 3.24+    - vulkan >= 3.6 && < 3.25     - bytestring     - transformers     - vector
src/VulkanMemoryAllocator.hs view
@@ -5188,39 +5188,26 @@   , -- | Intended usage of memory.     --     -- You can leave 'MEMORY_USAGE_UNKNOWN' if you specify memory requirements-    -- in other way.-    ---    -- >  -    ---    -- If @pool@ is not null, this member is ignored.+    -- in other way. If @pool@ is not null, this member is ignored.     usage :: MemoryUsage   , -- | Flags that must be set in a Memory Type chosen for an allocation.     ---    -- Leave 0 if you specify memory requirements in other way.-    ---    -- >  -    ---    -- If @pool@ is not null, this member is ignored.+    -- Leave 0 if you specify memory requirements in other way. If @pool@ is+    -- not null, this member is ignored.     requiredFlags :: MemoryPropertyFlags   , -- | Flags that preferably should be set in a memory type chosen for an     -- allocation.     ---    -- Set to 0 if no additional flags are preferred.-    ---    -- >  -    ---    -- If @pool@ is not null, this member is ignored.+    -- Set to 0 if no additional flags are preferred. If @pool@ is not null,+    -- this member is ignored.     preferredFlags :: MemoryPropertyFlags   , -- | Bitmask containing one bit set for every memory type acceptable for this     -- allocation.     --     -- Value 0 is equivalent to @UINT32_MAX@ - it means any memory type is     -- accepted if it meets other requirements specified by this structure,-    -- with no further restrictions on memory type index.-    ---    -- >  -    ---    -- If @pool@ is not null, this member is ignored.+    -- with no further restrictions on memory type index. If @pool@ is not+    -- null, this member is ignored.     memoryTypeBits :: Word32   , -- | Pool that this allocation should be created in.     --