mirror of
https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git
synced 2024-11-10 10:41:52 +00:00
Defined interface for virtual allocator:
VmaVirtualBlockCreateFlagBits, VmaVirtualBlockCreateFlags, VmaVirtualBlockCreateInfo, VmaVirtualAllocationCreateInfo, VmaVirtualBlock, all necessary functions. Implementation: added VmaVirtualBlock_T. Not working for now.
This commit is contained in:
parent
642bbfd793
commit
7acc6c0ca8
@ -2147,7 +2147,74 @@ VMA_CALL_PRE void VMA_CALL_POST vmaDestroyImage(
|
|||||||
VkImage VMA_NULLABLE_NON_DISPATCHABLE image,
|
VkImage VMA_NULLABLE_NON_DISPATCHABLE image,
|
||||||
VmaAllocation VMA_NULLABLE allocation);
|
VmaAllocation VMA_NULLABLE allocation);
|
||||||
|
|
||||||
/// Parameters of an existing virtual allocation, returned by TODO().
|
/// Flags to be passed as VmaPoolCreateInfo::flags.
|
||||||
|
typedef enum VmaVirtualBlockCreateFlagBits {
|
||||||
|
/** \brief TODO
|
||||||
|
|
||||||
|
TODO
|
||||||
|
*/
|
||||||
|
VMA_VIRTUAL_BLOCK_CREATE_LINEAR_ALGORITHM_BIT = 0x00000001,
|
||||||
|
|
||||||
|
/** \brief TODO
|
||||||
|
|
||||||
|
TODO
|
||||||
|
*/
|
||||||
|
VMA_VIRTUAL_BLOCK_CREATE_BUDDY_ALGORITHM_BIT = 0x00000002,
|
||||||
|
|
||||||
|
/** Bit mask to extract only `ALGORITHM` bits from entire set of flags.
|
||||||
|
*/
|
||||||
|
VMA_VIRTUAL_BLOCK_CREATE_ALGORITHM_MASK =
|
||||||
|
VMA_VIRTUAL_BLOCK_CREATE_LINEAR_ALGORITHM_BIT |
|
||||||
|
VMA_VIRTUAL_BLOCK_CREATE_BUDDY_ALGORITHM_BIT,
|
||||||
|
|
||||||
|
VMA_VIRTUAL_BLOCK_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
|
||||||
|
} VmaVirtualBlockCreateFlagBits;
|
||||||
|
typedef VkFlags VmaVirtualBlockCreateFlags;
|
||||||
|
|
||||||
|
/// Parameters of created #VmaVirtualBlock object to be passed to vmaCreateVirtualBlock().
|
||||||
|
struct VmaVirtualBlockCreateInfo
|
||||||
|
{
|
||||||
|
/** \brief Total size of the block.
|
||||||
|
|
||||||
|
Sizes can be expressed in bytes or any units you want as long as you are consistent in using them.
|
||||||
|
For example, if you allocate from some array of structures, 1 can mean single instance of entire structure.
|
||||||
|
*/
|
||||||
|
VkDeviceSize size;
|
||||||
|
|
||||||
|
/** \brief TODO
|
||||||
|
|
||||||
|
TODO
|
||||||
|
*/
|
||||||
|
VmaVirtualBlockCreateFlagBits flags;
|
||||||
|
|
||||||
|
/** \brief Custom CPU memory allocation callbacks. Optional.
|
||||||
|
|
||||||
|
Optional, can be null. When specified, will be used for all CPU-side memory allocations.
|
||||||
|
*/
|
||||||
|
const VkAllocationCallbacks* VMA_NULLABLE pAllocationCallbacks;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Parameters of created virtual allocation to be passed to vma TODO.
|
||||||
|
struct VmaVirtualAllocationCreateInfo
|
||||||
|
{
|
||||||
|
/** \brief Size of the allocation.
|
||||||
|
|
||||||
|
Cannot be zero.
|
||||||
|
*/
|
||||||
|
VkDeviceSize size;
|
||||||
|
/** \brief Required alignment of the allocation.
|
||||||
|
|
||||||
|
Must be power of two. Special value 0 has the same meaning as 1 - means no special alignment is required, so allocation can start at any offset.
|
||||||
|
*/
|
||||||
|
VkDeviceSize alignment;
|
||||||
|
/** \brief Custom pointer to be associated with the allocation.
|
||||||
|
|
||||||
|
It can be fetched or changed later.
|
||||||
|
*/
|
||||||
|
void* VMA_NULLABLE pUserData;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Parameters of an existing virtual allocation, returned by TODO GetAllocationInfo().
|
||||||
struct VmaVirtualAllocationInfo
|
struct VmaVirtualAllocationInfo
|
||||||
{
|
{
|
||||||
/** \brief Size of the allocation.
|
/** \brief Size of the allocation.
|
||||||
@ -2162,12 +2229,96 @@ struct VmaVirtualAllocationInfo
|
|||||||
void* VMA_NULLABLE pUserData;
|
void* VMA_NULLABLE pUserData;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
VK_DEFINE_HANDLE(VmaVirtualBlock);
|
||||||
|
|
||||||
|
/** \brief TODO
|
||||||
|
|
||||||
|
TODO.
|
||||||
|
*/
|
||||||
|
VMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateVirtualBlock(
|
||||||
|
const VmaVirtualBlockCreateInfo* VMA_NOT_NULL pCreateInfo,
|
||||||
|
VmaVirtualBlock VMA_NULLABLE * VMA_NOT_NULL pVirtualBlock);
|
||||||
|
|
||||||
|
/** \brief TODO
|
||||||
|
|
||||||
|
TODO.
|
||||||
|
*/
|
||||||
|
VMA_CALL_PRE void VMA_CALL_POST vmaDestroyVirtualBlock(VmaVirtualBlock VMA_NULLABLE virtualBlock);
|
||||||
|
|
||||||
|
/** \brief TODO
|
||||||
|
|
||||||
|
TODO.
|
||||||
|
*/
|
||||||
|
VMA_CALL_PRE VkBool32 VMA_CALL_POST vmaIsVirtualBlockEmpty(VmaVirtualBlock VMA_NOT_NULL virtualBlock);
|
||||||
|
|
||||||
|
/** \brief TODO
|
||||||
|
|
||||||
|
TODO.
|
||||||
|
*/
|
||||||
|
VMA_CALL_PRE void VMA_CALL_POST vmaGetVirtualAllocationInfo(VmaVirtualBlock VMA_NOT_NULL virtualBlock,
|
||||||
|
VkDeviceSize offset, VmaVirtualAllocationInfo* VMA_NOT_NULL pVirtualAllocInfo);
|
||||||
|
|
||||||
|
/** \brief TODO
|
||||||
|
|
||||||
|
TODO.
|
||||||
|
*/
|
||||||
|
VMA_CALL_PRE VkResult VMA_CALL_POST vmaVirtualAllocate(VmaVirtualBlock VMA_NOT_NULL virtualBlock,
|
||||||
|
const VmaVirtualAllocationCreateInfo* VMA_NOT_NULL pCreateInfo, VkDeviceSize* VMA_NOT_NULL pOffset);
|
||||||
|
|
||||||
|
/** \brief TODO
|
||||||
|
|
||||||
|
TODO.
|
||||||
|
*/
|
||||||
|
VMA_CALL_PRE void VMA_CALL_POST vmaVirtualFree(VmaVirtualBlock VMA_NOT_NULL virtualBlock, VkDeviceSize offset);
|
||||||
|
|
||||||
|
/** \brief TODO
|
||||||
|
|
||||||
|
TODO.
|
||||||
|
*/
|
||||||
|
VMA_CALL_PRE void VMA_CALL_POST vmaClearVirtualBlock(VmaVirtualBlock VMA_NOT_NULL virtualBlock);
|
||||||
|
|
||||||
|
/** \brief TODO
|
||||||
|
|
||||||
|
TODO.
|
||||||
|
*/
|
||||||
|
VMA_CALL_PRE void VMA_CALL_POST vmaSetVirtualAllocationUserData(VmaVirtualBlock VMA_NOT_NULL virtualBlock,
|
||||||
|
VkDeviceSize offset, void* VMA_NULLABLE pUserData);
|
||||||
|
|
||||||
|
/** \brief TODO
|
||||||
|
|
||||||
|
TODO.
|
||||||
|
*/
|
||||||
|
VMA_CALL_PRE void VMA_CALL_POST vmaCalculateVirtualBlockStats(VmaVirtualBlock VMA_NOT_NULL virtualBlock,
|
||||||
|
VmaStatInfo* VMA_NOT_NULL pStatInfo);
|
||||||
|
|
||||||
|
/** \brief TODO
|
||||||
|
|
||||||
|
TODO.
|
||||||
|
*/
|
||||||
|
VMA_CALL_PRE void VMA_CALL_POST vmaBuildVirtualBlockStatsString(VmaVirtualBlock VMA_NOT_NULL virtualBlock,
|
||||||
|
char* VMA_NULLABLE * VMA_NOT_NULL ppStatsString, VkBool32 detailedMap);
|
||||||
|
|
||||||
|
/** \brief TODO
|
||||||
|
|
||||||
|
TODO.
|
||||||
|
*/
|
||||||
|
VMA_CALL_PRE void VMA_CALL_POST vmaFreeVirtualBlockStatsString(VmaVirtualBlock VMA_NOT_NULL virtualBlock,
|
||||||
|
char* VMA_NULLABLE pStatsString);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // AMD_VULKAN_MEMORY_ALLOCATOR_H
|
#endif // AMD_VULKAN_MEMORY_ALLOCATOR_H
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IMPLEMENTATION
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// For Visual Studio IntelliSense.
|
// For Visual Studio IntelliSense.
|
||||||
#if defined(__cplusplus) && defined(__INTELLISENSE__)
|
#if defined(__cplusplus) && defined(__INTELLISENSE__)
|
||||||
#define VMA_IMPLEMENTATION
|
#define VMA_IMPLEMENTATION
|
||||||
@ -6397,7 +6548,7 @@ public:
|
|||||||
|
|
||||||
const VkAllocationCallbacks* GetAllocationCallbacks() const
|
const VkAllocationCallbacks* GetAllocationCallbacks() const
|
||||||
{
|
{
|
||||||
return m_AllocationCallbacksSpecified ? &m_AllocationCallbacks : 0;
|
return m_AllocationCallbacksSpecified ? &m_AllocationCallbacks : VMA_NULL;
|
||||||
}
|
}
|
||||||
const VmaVulkanFunctions& GetVulkanFunctions() const
|
const VmaVulkanFunctions& GetVulkanFunctions() const
|
||||||
{
|
{
|
||||||
@ -6672,6 +6823,32 @@ private:
|
|||||||
#endif // #if VMA_MEMORY_BUDGET
|
#endif // #if VMA_MEMORY_BUDGET
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct VmaVirtualBlock_T
|
||||||
|
{
|
||||||
|
VMA_CLASS_NO_COPY(VmaVirtualBlock_T)
|
||||||
|
public:
|
||||||
|
const bool m_AllocationCallbacksSpecified;
|
||||||
|
const VkAllocationCallbacks m_AllocationCallbacks;
|
||||||
|
|
||||||
|
VmaVirtualBlock_T(const VmaVirtualBlockCreateInfo& createInfo);
|
||||||
|
~VmaVirtualBlock_T();
|
||||||
|
VkResult Init();
|
||||||
|
|
||||||
|
const VkAllocationCallbacks* GetAllocationCallbacks() const
|
||||||
|
{
|
||||||
|
return m_AllocationCallbacksSpecified ? &m_AllocationCallbacks : VMA_NULL;
|
||||||
|
}
|
||||||
|
bool IsEmpty() const;
|
||||||
|
void GetAllocationInfo(VkDeviceSize offset, VmaVirtualAllocationInfo& outInfo) const;
|
||||||
|
|
||||||
|
VkResult Allocate(const VmaVirtualAllocationCreateInfo& createInfo, VkDeviceSize& outOffset);
|
||||||
|
void Free(VkDeviceSize offset);
|
||||||
|
void Clear();
|
||||||
|
void SetAllocationUserData(VkDeviceSize offset, void* userData);
|
||||||
|
|
||||||
|
private:
|
||||||
|
};
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Memory allocation #2 after VmaAllocator_T definition
|
// Memory allocation #2 after VmaAllocator_T definition
|
||||||
|
|
||||||
@ -16412,6 +16589,57 @@ void VmaAllocator_T::PrintDetailedMap(VmaJsonWriter& json)
|
|||||||
|
|
||||||
#endif // #if VMA_STATS_STRING_ENABLED
|
#endif // #if VMA_STATS_STRING_ENABLED
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// VmaVirtualBlock_T
|
||||||
|
|
||||||
|
VmaVirtualBlock_T::VmaVirtualBlock_T(const VmaVirtualBlockCreateInfo& createInfo) :
|
||||||
|
m_AllocationCallbacksSpecified(createInfo.pAllocationCallbacks != VMA_NULL),
|
||||||
|
m_AllocationCallbacks(createInfo.pAllocationCallbacks != VMA_NULL ? *createInfo.pAllocationCallbacks : VmaEmptyAllocationCallbacks)
|
||||||
|
{
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
VmaVirtualBlock_T::~VmaVirtualBlock_T()
|
||||||
|
{
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
VkResult VmaVirtualBlock_T::Init()
|
||||||
|
{
|
||||||
|
//TODO
|
||||||
|
return VK_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool VmaVirtualBlock_T::IsEmpty() const
|
||||||
|
{
|
||||||
|
return true;//TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void VmaVirtualBlock_T::GetAllocationInfo(VkDeviceSize offset, VmaVirtualAllocationInfo& outInfo) const
|
||||||
|
{
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
VkResult VmaVirtualBlock_T::Allocate(const VmaVirtualAllocationCreateInfo& createInfo, VkDeviceSize& outOffset)
|
||||||
|
{
|
||||||
|
return VK_ERROR_DEVICE_LOST;//TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void VmaVirtualBlock_T::Free(VkDeviceSize offset)
|
||||||
|
{
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void VmaVirtualBlock_T::Clear()
|
||||||
|
{
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void VmaVirtualBlock_T::SetAllocationUserData(VkDeviceSize offset, void* userData)
|
||||||
|
{
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Public interface
|
// Public interface
|
||||||
|
|
||||||
@ -16433,7 +16661,7 @@ VMA_CALL_PRE void VMA_CALL_POST vmaDestroyAllocator(
|
|||||||
if(allocator != VK_NULL_HANDLE)
|
if(allocator != VK_NULL_HANDLE)
|
||||||
{
|
{
|
||||||
VMA_DEBUG_LOG("vmaDestroyAllocator");
|
VMA_DEBUG_LOG("vmaDestroyAllocator");
|
||||||
VkAllocationCallbacks allocationCallbacks = allocator->m_AllocationCallbacks;
|
VkAllocationCallbacks allocationCallbacks = allocator->m_AllocationCallbacks; // Have to copy the callbacks when destroying.
|
||||||
vma_delete(&allocationCallbacks, allocator);
|
vma_delete(&allocationCallbacks, allocator);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -18035,6 +18263,104 @@ VMA_CALL_PRE void VMA_CALL_POST vmaDestroyImage(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateVirtualBlock(
|
||||||
|
const VmaVirtualBlockCreateInfo* VMA_NOT_NULL pCreateInfo,
|
||||||
|
VmaVirtualBlock VMA_NULLABLE * VMA_NOT_NULL pVirtualBlock)
|
||||||
|
{
|
||||||
|
VMA_ASSERT(pCreateInfo && pVirtualBlock);
|
||||||
|
VMA_ASSERT(pCreateInfo->size > 0);
|
||||||
|
VMA_DEBUG_LOG("vmaCreateVirtualBlock");
|
||||||
|
VMA_DEBUG_GLOBAL_MUTEX_LOCK;
|
||||||
|
*pVirtualBlock = vma_new(pCreateInfo->pAllocationCallbacks, VmaVirtualBlock_T)(*pCreateInfo);
|
||||||
|
VkResult res = (*pVirtualBlock)->Init();
|
||||||
|
if(res < 0)
|
||||||
|
{
|
||||||
|
vma_delete(pCreateInfo->pAllocationCallbacks, *pVirtualBlock);
|
||||||
|
*pVirtualBlock = VK_NULL_HANDLE;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
VMA_CALL_PRE void VMA_CALL_POST vmaDestroyVirtualBlock(VmaVirtualBlock VMA_NULLABLE virtualBlock)
|
||||||
|
{
|
||||||
|
if(virtualBlock != VK_NULL_HANDLE)
|
||||||
|
{
|
||||||
|
VMA_DEBUG_LOG("vmaDestroyVirtualBlock");
|
||||||
|
VMA_DEBUG_GLOBAL_MUTEX_LOCK;
|
||||||
|
VkAllocationCallbacks allocationCallbacks = virtualBlock->m_AllocationCallbacks; // Have to copy the callbacks when destroying.
|
||||||
|
vma_delete(&allocationCallbacks, virtualBlock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VMA_CALL_PRE VkBool32 VMA_CALL_POST vmaIsVirtualBlockEmpty(VmaVirtualBlock VMA_NOT_NULL virtualBlock)
|
||||||
|
{
|
||||||
|
VMA_ASSERT(virtualBlock != VK_NULL_HANDLE);
|
||||||
|
VMA_DEBUG_LOG("vmaIsVirtualBlockEmpty");
|
||||||
|
VMA_DEBUG_GLOBAL_MUTEX_LOCK;
|
||||||
|
return virtualBlock->IsEmpty() ? VK_TRUE : VK_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
VMA_CALL_PRE void VMA_CALL_POST vmaGetVirtualAllocationInfo(VmaVirtualBlock VMA_NOT_NULL virtualBlock,
|
||||||
|
VkDeviceSize offset, VmaVirtualAllocationInfo* VMA_NOT_NULL pVirtualAllocInfo)
|
||||||
|
{
|
||||||
|
VMA_ASSERT(virtualBlock != VK_NULL_HANDLE && pVirtualAllocInfo != VMA_NULL);
|
||||||
|
VMA_DEBUG_LOG("vmaGetVirtualAllocationInfo");
|
||||||
|
VMA_DEBUG_GLOBAL_MUTEX_LOCK;
|
||||||
|
virtualBlock->GetAllocationInfo(offset, *pVirtualAllocInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
VMA_CALL_PRE VkResult VMA_CALL_POST vmaVirtualAllocate(VmaVirtualBlock VMA_NOT_NULL virtualBlock,
|
||||||
|
const VmaVirtualAllocationCreateInfo* VMA_NOT_NULL pCreateInfo, VkDeviceSize* VMA_NOT_NULL pOffset)
|
||||||
|
{
|
||||||
|
VMA_ASSERT(virtualBlock != VK_NULL_HANDLE && pCreateInfo != VMA_NULL && pOffset != VMA_NULL);
|
||||||
|
VMA_DEBUG_LOG("vmaVirtualAllocate");
|
||||||
|
VMA_DEBUG_GLOBAL_MUTEX_LOCK;
|
||||||
|
return virtualBlock->Allocate(*pCreateInfo, *pOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
VMA_CALL_PRE void VMA_CALL_POST vmaVirtualFree(VmaVirtualBlock VMA_NOT_NULL virtualBlock, VkDeviceSize offset)
|
||||||
|
{
|
||||||
|
VMA_ASSERT(virtualBlock != VK_NULL_HANDLE);
|
||||||
|
VMA_DEBUG_LOG("vmaVirtualFree");
|
||||||
|
VMA_DEBUG_GLOBAL_MUTEX_LOCK;
|
||||||
|
virtualBlock->Free(offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
VMA_CALL_PRE void VMA_CALL_POST vmaClearVirtualBlock(VmaVirtualBlock VMA_NOT_NULL virtualBlock)
|
||||||
|
{
|
||||||
|
VMA_ASSERT(virtualBlock != VK_NULL_HANDLE);
|
||||||
|
VMA_DEBUG_LOG("vmaClearVirtualBlock");
|
||||||
|
VMA_DEBUG_GLOBAL_MUTEX_LOCK;
|
||||||
|
virtualBlock->Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
VMA_CALL_PRE void VMA_CALL_POST vmaSetVirtualAllocationUserData(VmaVirtualBlock VMA_NOT_NULL virtualBlock,
|
||||||
|
VkDeviceSize offset, void* VMA_NULLABLE pUserData)
|
||||||
|
{
|
||||||
|
VMA_ASSERT(virtualBlock != VK_NULL_HANDLE);
|
||||||
|
VMA_DEBUG_LOG("vmaSetVirtualAllocationUserData");
|
||||||
|
VMA_DEBUG_GLOBAL_MUTEX_LOCK;
|
||||||
|
virtualBlock->SetAllocationUserData(offset, pUserData);
|
||||||
|
}
|
||||||
|
|
||||||
|
VMA_CALL_PRE void VMA_CALL_POST vmaCalculateVirtualBlockStats(VmaVirtualBlock VMA_NOT_NULL virtualBlock,
|
||||||
|
VmaStatInfo* VMA_NOT_NULL pStatInfo)
|
||||||
|
{
|
||||||
|
VMA_ASSERT(0 && "TODO implement");
|
||||||
|
}
|
||||||
|
|
||||||
|
VMA_CALL_PRE void VMA_CALL_POST vmaBuildVirtualBlockStatsString(VmaVirtualBlock VMA_NOT_NULL virtualBlock,
|
||||||
|
char* VMA_NULLABLE * VMA_NOT_NULL ppStatsString, VkBool32 detailedMap)
|
||||||
|
{
|
||||||
|
VMA_ASSERT(0 && "TODO implement");
|
||||||
|
}
|
||||||
|
|
||||||
|
VMA_CALL_PRE void VMA_CALL_POST vmaFreeVirtualBlockStatsString(VmaVirtualBlock VMA_NOT_NULL virtualBlock,
|
||||||
|
char* VMA_NULLABLE pStatsString)
|
||||||
|
{
|
||||||
|
VMA_ASSERT(0 && "TODO implement");
|
||||||
|
}
|
||||||
|
|
||||||
#endif // #ifdef VMA_IMPLEMENTATION
|
#endif // #ifdef VMA_IMPLEMENTATION
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user