From a68c01c85eaedc45c2abe2fc16263cd4e7f5240c Mon Sep 17 00:00:00 2001 From: Adam Sawicki Date: Tue, 13 Mar 2018 16:40:45 +0100 Subject: [PATCH] Added optional usage of VmaAllocatorCreateInfo::pAllocationCallbacks (disabled by default). --- bin/VulkanSample_Release_vs2015.exe | Bin 178176 -> 179200 bytes src/VulkanSample.cpp | 39 ++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/bin/VulkanSample_Release_vs2015.exe b/bin/VulkanSample_Release_vs2015.exe index c60440d814d72d2f307927851728352c0a162423..8f46ee888842ec326aa7d46821afab4b65df59b4 100644 GIT binary patch delta 38762 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 delta 38022 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 CCLS~Z diff --git a/src/VulkanSample.cpp b/src/VulkanSample.cpp index cb8aae7..d3937b7 100644 --- a/src/VulkanSample.cpp +++ b/src/VulkanSample.cpp @@ -35,14 +35,15 @@ static const wchar_t* const APP_TITLE_W = L"Vulkan Memory Allocator Sample 2.0"; static const bool VSYNC = true; static const uint32_t COMMAND_BUFFER_COUNT = 2; - -static bool g_EnableValidationLayer = true; +static void* const CUSTOM_CPU_ALLOCATION_CALLBACK_USER_DATA = (void*)(intptr_t)43564544; +static const bool USE_CUSTOM_CPU_ALLOCATION_CALLBACKS = false; VkPhysicalDevice g_hPhysicalDevice; VkDevice g_hDevice; VmaAllocator g_hAllocator; bool g_MemoryAliasingWarningEnabled = true; +static bool g_EnableValidationLayer = true; static bool VK_KHR_get_memory_requirements2_enabled = false; static bool VK_KHR_dedicated_allocation_enabled = false; @@ -102,6 +103,28 @@ static VkImage g_hTextureImage; static VmaAllocation g_hTextureImageAlloc; static VkImageView g_hTextureImageView; +static void* CustomCpuAllocation( + void* pUserData, size_t size, size_t alignment, + VkSystemAllocationScope allocationScope) +{ + assert(pUserData == CUSTOM_CPU_ALLOCATION_CALLBACK_USER_DATA); + return _aligned_malloc(size, alignment); +} + +static void* CustomCpuReallocation( + void* pUserData, void* pOriginal, size_t size, size_t alignment, + VkSystemAllocationScope allocationScope) +{ + assert(pUserData == CUSTOM_CPU_ALLOCATION_CALLBACK_USER_DATA); + return _aligned_realloc(pOriginal, size, alignment); +} + +static void CustomCpuFree(void* pUserData, void* pMemory) +{ + assert(pUserData == CUSTOM_CPU_ALLOCATION_CALLBACK_USER_DATA); + _aligned_free(pMemory); +} + static void BeginSingleTimeCommands() { VkCommandBufferBeginInfo cmdBufBeginInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO }; @@ -1255,10 +1278,22 @@ static void InitializeApplication() VmaAllocatorCreateInfo allocatorInfo = {}; allocatorInfo.physicalDevice = g_hPhysicalDevice; allocatorInfo.device = g_hDevice; + if(VK_KHR_dedicated_allocation_enabled) { allocatorInfo.flags |= VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT; } + + VkAllocationCallbacks cpuAllocationCallbacks = {}; + if(USE_CUSTOM_CPU_ALLOCATION_CALLBACKS) + { + cpuAllocationCallbacks.pUserData = CUSTOM_CPU_ALLOCATION_CALLBACK_USER_DATA; + cpuAllocationCallbacks.pfnAllocation = &CustomCpuAllocation; + cpuAllocationCallbacks.pfnReallocation = &CustomCpuReallocation; + cpuAllocationCallbacks.pfnFree = &CustomCpuFree; + allocatorInfo.pAllocationCallbacks = &cpuAllocationCallbacks; + } + ERR_GUARD_VULKAN( vmaCreateAllocator(&allocatorInfo, &g_hAllocator) ); // Retrieve queue (doesn't need to be destroyed)