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 +3/−3
- VulkanMemoryAllocator/include/vk_mem_alloc.h +102/−160
- changelog.md +3/−0
- package.yaml +2/−2
- src/VulkanMemoryAllocator.hs +7/−20
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. --