VulkanSDK 1.2.182.0 (It’s not the latest)
Hi, as the title says, DebugReportCallbackEXT
cannot be destroyed but I could destroy it in the past, but due to the latest (Driver) after Windows reinstallation and online Driver Pack installation, then I can no longer destroy it, so how to destroy it? There are more explanation at the bottom of this post.
Referenced from:
#ifdef IMGUI_VULKAN_DEBUG_REPORT
// Enabling validation layers
const char* layers[] = { "VK_LAYER_KHRONOS_validation" };
create_info.enabledLayerCount = 1;
create_info.ppEnabledLayerNames = layers;
// Enable debug report extension (we need additional storage, so we duplicate the user array to add our new extension to it)
const char** extensions_ext = (const char**)malloc(sizeof(const char*) * (extensions_count + 1));
memcpy(extensions_ext, extensions, extensions_count * sizeof(const char*));
extensions_ext[extensions_count] = "VK_EXT_debug_report";
create_info.enabledExtensionCount = extensions_count + 1;
create_info.ppEnabledExtensionNames = extensions_ext;
// Create Vulkan Instance
err = vkCreateInstance(&create_info, g_Allocator, &g_Instance);
check_vk_result(err);
free(extensions_ext);
// Get the function pointer (required for any extensions)
auto vkCreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkCreateDebugReportCallbackEXT");
IM_ASSERT(vkCreateDebugReportCallbackEXT != NULL);
// Setup the debug report callback
VkDebugReportCallbackCreateInfoEXT debug_report_ci = {};
debug_report_ci.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
debug_report_ci.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT;
debug_report_ci.pfnCallback = vk_debug_report;
debug_report_ci.pUserData = NULL;
pushMemoryHint("vkCreateDebugReportCallbackEXT"); // <-- This is my own function for debugging purpose.
err = vkCreateDebugReportCallbackEXT(g_Instance, &debug_report_ci, g_Allocator, &g_DebugReport);
popMemoryHint(); // <-- My own function.
check_vk_result(err);
g_vk_debugReport.setup(binPath(projectName) + "_vk_debug_report.txt");
#else
...
#endif
The cleanup function:
static void CleanupVulkan()
{
vkDestroyDescriptorPool(g_Device, g_DescriptorPool, g_Allocator);
#ifdef IMGUI_VULKAN_DEBUG_REPORT
// Remove the debug report callback
auto vkDestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkDestroyDebugReportCallbackEXT");
vkDestroyDebugReportCallbackEXT(g_Instance, g_DebugReport, g_Allocator);
#endif // IMGUI_VULKAN_DEBUG_REPORT
vkDestroyDevice(g_Device, g_Allocator);
vkDestroyInstance(g_Instance, g_Allocator);
}
The text file “_not_freed_memory_blocks.txt
” generated by the app:
----------------------------------------------------------------------------------------------------
Known sources: List of not freed memory blocks with total size 0.000 MB
----------------------------------------------------------------------------------------------------
file: "...\engine.cpp", line: 32, scope: VK_SYSTEM_ALLOCATION_SCOPE_OBJECT, hint: vkCreateDebugReportCallbackEXT, size in bytes: 48
That debug text file above tells that the “DebugReportCallbackEXT
” cannot be destroyed. But in the past, it could be destroyed without any memory leak. The reason it cannot be destroyed is I completely reinstalled Windows with the latest drivers using “Online Driver Pack”, so I realize that the latest Driver for Vulkan in Windows doesn’t properly destroy.
My own temporary solution to avoid the Memory Leak Warning: "Skip the hint vkCreateDebugReportCallbackEXT
" so that warning window will no longer pop up.