Added internal function VmaIsPow2 and asserts checking if various alignment parameters are power of 2.

This commit is contained in:
Adam Sawicki 2018-09-07 14:12:37 +02:00
parent a70e05dbc5
commit 4338f6667d
3 changed files with 22 additions and 2 deletions

View File

@ -4149,7 +4149,7 @@ void Test()
{ {
wprintf(L"TESTING:\n"); wprintf(L"TESTING:\n");
if(true) if(false)
{ {
// # Temporarily insert custom tests here // # Temporarily insert custom tests here
// ######################################## // ########################################
@ -4176,6 +4176,8 @@ void Test()
ManuallyTestLinearAllocator(); ManuallyTestLinearAllocator();
TestLinearAllocatorMultiBlock(); TestLinearAllocatorMultiBlock();
BasicTestBuddyAllocator();
{ {
FILE* file; FILE* file;
fopen_s(&file, "LinearAllocator.csv", "w"); fopen_s(&file, "LinearAllocator.csv", "w");

View File

@ -9,7 +9,7 @@
//#define VMA_USE_STL_CONTAINERS 1 //#define VMA_USE_STL_CONTAINERS 1
#define VMA_HEAVY_ASSERT(expr) assert(expr) //#define VMA_HEAVY_ASSERT(expr) assert(expr)
//#define VMA_DEDICATED_ALLOCATION 0 //#define VMA_DEDICATED_ALLOCATION 0

View File

@ -2961,6 +2961,17 @@ static inline T VmaRoundDiv(T x, T y)
return (x + (y / (T)2)) / y; return (x + (y / (T)2)) / y;
} }
/*
Returns true if given number is a power of two.
T must be unsigned integer number or signed integer but always nonnegative.
For 0 returns true.
*/
template <typename T>
inline bool VmaIsPow2(T x)
{
return (x & (x-1)) == 0;
}
// Returns smallest power of 2 greater or equal to v. // Returns smallest power of 2 greater or equal to v.
static inline uint32_t VmaNextPow2(uint32_t v) static inline uint32_t VmaNextPow2(uint32_t v)
{ {
@ -11749,6 +11760,11 @@ VmaAllocator_T::VmaAllocator_T(const VmaAllocatorCreateInfo* pCreateInfo) :
(*m_VulkanFunctions.vkGetPhysicalDeviceProperties)(m_PhysicalDevice, &m_PhysicalDeviceProperties); (*m_VulkanFunctions.vkGetPhysicalDeviceProperties)(m_PhysicalDevice, &m_PhysicalDeviceProperties);
(*m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties)(m_PhysicalDevice, &m_MemProps); (*m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties)(m_PhysicalDevice, &m_MemProps);
VMA_ASSERT(VmaIsPow2(VMA_DEBUG_ALIGNMENT));
VMA_ASSERT(VmaIsPow2(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY));
VMA_ASSERT(VmaIsPow2(m_PhysicalDeviceProperties.limits.bufferImageGranularity));
VMA_ASSERT(VmaIsPow2(m_PhysicalDeviceProperties.limits.nonCoherentAtomSize));
m_PreferredLargeHeapBlockSize = (pCreateInfo->preferredLargeHeapBlockSize != 0) ? m_PreferredLargeHeapBlockSize = (pCreateInfo->preferredLargeHeapBlockSize != 0) ?
pCreateInfo->preferredLargeHeapBlockSize : static_cast<VkDeviceSize>(VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE); pCreateInfo->preferredLargeHeapBlockSize : static_cast<VkDeviceSize>(VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE);
@ -12196,6 +12212,8 @@ VkResult VmaAllocator_T::AllocateMemory(
VmaSuballocationType suballocType, VmaSuballocationType suballocType,
VmaAllocation* pAllocation) VmaAllocation* pAllocation)
{ {
VMA_ASSERT(VmaIsPow2(vkMemReq.alignment));
if((createInfo.flags & VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT) != 0 && if((createInfo.flags & VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT) != 0 &&
(createInfo.flags & VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT) != 0) (createInfo.flags & VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT) != 0)
{ {