#pragma once #define GLFW_INCLUDE_VULKAN #include struct FCreateDebugUtilsMessengerExtParams { VkInstance Instance; const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo; const VkAllocationCallbacks* pAllocator; VkDebugUtilsMessengerEXT* pDebugMessenger; }; struct FDestroyDebugUtilsMessengerExtParams { VkInstance Instance; VkDebugUtilsMessengerEXT DebugMessenger; const VkAllocationCallbacks* pAllocator; }; class VulkanDebugManager { public: VulkanDebugManager(); ~VulkanDebugManager(); VulkanDebugManager(const VulkanDebugManager&) = delete; VulkanDebugManager& operator=(const VulkanDebugManager&) = delete; VulkanDebugManager(VulkanDebugManager&& Other) noexcept; VulkanDebugManager& operator=(VulkanDebugManager&& Other) noexcept; void Initialize(VkInstance Instance); void Cleanup(); bool IsInitialized() const { return DebugMessenger != VK_NULL_HANDLE; } void PopulateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo); private: bool bVerboseLogging = false; VkInstance Instance = VK_NULL_HANDLE; VkDebugUtilsMessengerEXT DebugMessenger = VK_NULL_HANDLE; VkResult CreateDebugUtilsMessengerExt(const FCreateDebugUtilsMessengerExtParams& Params); void DestroyDebugUtilsMessengerExt(const FDestroyDebugUtilsMessengerExtParams& Params); static VKAPI_ATTR VkBool32 VKAPI_CALL DebugCallback( VkDebugUtilsMessageSeverityFlagBitsEXT MessageSeverity, VkDebugUtilsMessageTypeFlagsEXT MessageType, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, void* pUserData); void SetupDebugMessanger(); };