Files
LearningVulkan/VulkanDebugManager.cpp
2026-01-21 15:05:14 -05:00

121 lines
3.3 KiB
C++

#include "VulkanDebugManager.h"
#include "Logger.h"
VulkanDebugManager::VulkanDebugManager()
{
}
VulkanDebugManager::~VulkanDebugManager()
{
// Cleanup();
}
VulkanDebugManager::VulkanDebugManager(VulkanDebugManager&& Other) noexcept
: DebugMessenger(Other.DebugMessenger), Instance(Other.Instance)
{
Other.DebugMessenger = VK_NULL_HANDLE;
Other.Instance = VK_NULL_HANDLE;
}
VulkanDebugManager& VulkanDebugManager::operator=(VulkanDebugManager&& Other) noexcept
{
if (this != &Other)
{
Cleanup();
DebugMessenger = Other.DebugMessenger;
Instance = Other.Instance;
Other.DebugMessenger = VK_NULL_HANDLE;
Other.Instance = VK_NULL_HANDLE;
}
return *this;
}
void VulkanDebugManager::Initialize(VkInstance Instance)
{
if (IsInitialized())
{
return;
}
this->Instance = Instance;
SetupDebugMessanger();
}
void VulkanDebugManager::Cleanup()
{
if (!IsInitialized())
{
return;
}
FDestroyDebugUtilsMessengerExtParams Params = { Instance, DebugMessenger, nullptr };
DestroyDebugUtilsMessengerExt(Params);
DebugMessenger = VK_NULL_HANDLE;
}
VkResult VulkanDebugManager::CreateDebugUtilsMessengerExt(const FCreateDebugUtilsMessengerExtParams& Params)
{
auto func = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(Params.Instance, "vkCreateDebugUtilsMessengerEXT");
if (func != nullptr)
{
return func(Params.Instance, Params.pCreateInfo, Params.pAllocator, Params.pDebugMessenger);
}
else
{
return VK_ERROR_EXTENSION_NOT_PRESENT;
}
}
void VulkanDebugManager::DestroyDebugUtilsMessengerExt(const FDestroyDebugUtilsMessengerExtParams& Params)
{
auto func = (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(
Params.Instance,
"vkDestroyDebugUtilsMessengerEXT");
if (func != nullptr)
{
func(Params.Instance, Params.DebugMessenger, Params.pAllocator);
}
}
VKAPI_ATTR VkBool32 VKAPI_CALL VulkanDebugManager::DebugCallback(
VkDebugUtilsMessageSeverityFlagBitsEXT MessageSeverity,
VkDebugUtilsMessageTypeFlagsEXT MessageType,
const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
void* pUserData)
{
Log::Validation(pCallbackData->pMessage);
// std::cerr << "[Validation layer] : " << pCallbackData->pMessage << std::endl;
if (MessageSeverity >= VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT)
{
}
return VK_FALSE;
}
void VulkanDebugManager::PopulateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo)
{
createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
createInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
createInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
createInfo.pfnUserCallback = VulkanDebugManager::DebugCallback;
}
void VulkanDebugManager::SetupDebugMessanger()
{
VkDebugUtilsMessengerCreateInfoEXT CreateInfo;
PopulateDebugMessengerCreateInfo(CreateInfo);
FCreateDebugUtilsMessengerExtParams Params = { Instance, &CreateInfo, nullptr, &DebugMessenger };
if (CreateDebugUtilsMessengerExt(Params) != VK_SUCCESS)
{
Log::Error("Failed to set up debug messenger!");
// throw std::runtime_error("failed to set up debug messenger!");
}
}