Vulkan has a pluggable memory allocation feature, which allows internal driver allocations to be done by the client application provided allocator. Vulkan uses this for more client application allocations done inside the driver, but can also do it for more internal oriented allocations. VK_ALLOCATION_CALLBACKS initializes allocation callbacks for host allocations. The macro creates a local static variable with the name vk_allocation_callbacks that can be passed to vulkan API functions that expect const VkAllocationCallbacks *pAllocator. When WITH_VULKAN_GUARDEDALLOC=Off the memory allocation implemented in the vulkan device driver is used for both internal and application oriented memory operations. For now this would help during the development of Vulkan backend to detect hidden memory leaks that are hidden inside the driver part of the stack. In a later stage we need to measure the overhead and if this should become the default behavior. Pull Request #104434
46 lines
1.1 KiB
C++
46 lines
1.1 KiB
C++
/* SPDX-License-Identifier: GPL-2.0-or-later
|
|
* Copyright 2023 Blender Foundation. All rights reserved. */
|
|
|
|
/** \file
|
|
* \ingroup gpu
|
|
*/
|
|
|
|
#include "vk_memory.hh"
|
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
namespace blender::gpu {
|
|
|
|
#ifdef WITH_VULKAN_GUARDEDALLOC
|
|
|
|
void *vk_memory_allocation(void *user_data,
|
|
size_t size,
|
|
size_t alignment,
|
|
VkSystemAllocationScope /*scope*/)
|
|
{
|
|
const char *name = static_cast<const char *>(const_cast<const void *>(user_data));
|
|
if (alignment) {
|
|
return MEM_mallocN_aligned(size, alignment, name);
|
|
}
|
|
return MEM_mallocN(size, name);
|
|
}
|
|
|
|
void *vk_memory_reallocation(void *user_data,
|
|
void *original,
|
|
size_t size,
|
|
size_t /*alignment*/,
|
|
VkSystemAllocationScope /*scope*/)
|
|
{
|
|
const char *name = static_cast<const char *>(const_cast<const void *>(user_data));
|
|
return MEM_reallocN_id(original, size, name);
|
|
}
|
|
|
|
void vk_memory_free(void * /*user_data*/, void *memory)
|
|
{
|
|
MEM_freeN(memory);
|
|
}
|
|
|
|
#endif
|
|
|
|
} // namespace blender::gpu
|