use ash::extensions::ext::DebugUtils; use ash::prelude::VkResult; use ash::vk; use ash::vk::{DebugUtilsMessengerEXT, PFN_vkDebugUtilsMessengerCallbackEXT}; pub struct VulkanDebug { loader: DebugUtils, messenger: DebugUtilsMessengerEXT, } impl VulkanDebug { pub fn new( entry: &ash::Entry, instance: &ash::Instance, callback: PFN_vkDebugUtilsMessengerCallbackEXT, ) -> VkResult { let debug_info = vk::DebugUtilsMessengerCreateInfoEXT::builder() .message_severity( vk::DebugUtilsMessageSeverityFlagsEXT::ERROR | vk::DebugUtilsMessageSeverityFlagsEXT::WARNING | vk::DebugUtilsMessageSeverityFlagsEXT::INFO, ) .message_type( vk::DebugUtilsMessageTypeFlagsEXT::GENERAL | vk::DebugUtilsMessageTypeFlagsEXT::VALIDATION | vk::DebugUtilsMessageTypeFlagsEXT::PERFORMANCE, ) .pfn_user_callback(callback); let debug_utils_loader = DebugUtils::new(entry, instance); unsafe { let debug_call_back = debug_utils_loader.create_debug_utils_messenger(&debug_info, None)?; Ok(VulkanDebug { loader: debug_utils_loader, messenger: debug_call_back, }) } } } impl Drop for VulkanDebug { fn drop(&mut self) { unsafe { self.loader .destroy_debug_utils_messenger(self.messenger, None); } } }