/// <summary>Releases given suballocation, making it free. Merges it with adjacent free suballocations if applicable. Returns iterator to new free suballocation at this place.</summary> public D3D12MA_List <D3D12MA_Suballocation> .iterator FreeSuballocation(D3D12MA_List <D3D12MA_Suballocation> .iterator suballocItem) { // Change this suballocation to be marked as free. D3D12MA_Suballocation *suballoc = suballocItem.Get(); suballoc->type = D3D12MA_SUBALLOCATION_TYPE_FREE; suballoc->userData = null; // Update totals. ++m_FreeCount; m_SumFreeSize += suballoc->size; // Merge with previous and/or next suballocation if it's also free. bool mergeWithNext = false; bool mergeWithPrev = false; D3D12MA_List <D3D12MA_Suballocation> .iterator nextItem = suballocItem; nextItem = nextItem.MoveNext(); if ((nextItem != m_Suballocations.end()) && (nextItem.Get()->type == D3D12MA_SUBALLOCATION_TYPE_FREE)) { mergeWithNext = true; } D3D12MA_List <D3D12MA_Suballocation> .iterator prevItem = suballocItem; if (suballocItem != m_Suballocations.begin()) { prevItem = prevItem.MoveBack(); if (prevItem.Get()->type == D3D12MA_SUBALLOCATION_TYPE_FREE) { mergeWithPrev = true; } } if (mergeWithNext) { UnregisterFreeSuballocation(nextItem); MergeFreeWithNext(suballocItem); } if (mergeWithPrev) { UnregisterFreeSuballocation(prevItem); MergeFreeWithNext(prevItem); RegisterFreeSuballocation(prevItem); return(prevItem); } else { RegisterFreeSuballocation(suballocItem); return(suballocItem); } }
public static void Init(ref D3D12MA_BlockMetadata_Generic pThis, [NativeTypeName("UINT64")] ulong size) { D3D12MA_BlockMetadata.Init(ref pThis.Base, size); pThis.m_ZeroInitializedRange.Reset(size); pThis.m_FreeCount = 1; pThis.m_SumFreeSize = size; D3D12MA_Suballocation suballoc = default; suballoc.offset = 0; suballoc.size = size; suballoc.type = D3D12MA_SUBALLOCATION_TYPE_FREE; suballoc.userData = null; D3D12MA_ASSERT((D3D12MA_DEBUG_LEVEL > 0) && (size > MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)); pThis.m_Suballocations.push_back(in suballoc); D3D12MA_List <D3D12MA_Suballocation> .iterator suballocItem = pThis.m_Suballocations.end(); suballocItem = suballocItem.MoveBack(); pThis.m_FreeSuballocationsBySize.push_back(in suballocItem); }