plate 0.5.0

Rust library for writing simpler Vulkan code
Documentation
use std::ffi;

use ash::{extensions::ext, vk};

use crate::Error;

pub struct Debugger {
    debug_utils: ext::DebugUtils,
    debug_messenger: vk::DebugUtilsMessengerEXT,
}

impl Drop for Debugger {
    fn drop(&mut self) {
        unsafe {
            self.debug_utils
                .destroy_debug_utils_messenger(self.debug_messenger, None);
        }
    }
}

impl Debugger {
    pub fn new(entry: &ash::Entry, instance: &ash::Instance) -> Result<Self, Error> {
        let debug_utils = ext::DebugUtils::new(entry, instance);

        let debug_messenger_info = debug_messenger_info();

        let debug_messenger =
            unsafe { debug_utils.create_debug_utils_messenger(&debug_messenger_info, None)? };

        Ok(Self {
            debug_utils,
            debug_messenger,
        })
    }
}

pub fn debug_messenger_info() -> vk::DebugUtilsMessengerCreateInfoEXT {
    *vk::DebugUtilsMessengerCreateInfoEXT::builder()
        .message_severity(
            vk::DebugUtilsMessageSeverityFlagsEXT::WARNING
                | vk::DebugUtilsMessageSeverityFlagsEXT::ERROR,
        )
        .message_type(
            vk::DebugUtilsMessageTypeFlagsEXT::GENERAL
                | vk::DebugUtilsMessageTypeFlagsEXT::VALIDATION
                | vk::DebugUtilsMessageTypeFlagsEXT::PERFORMANCE,
        )
        .pfn_user_callback(Some(debug_callback))
}

unsafe extern "system" fn debug_callback(
    message_severity: vk::DebugUtilsMessageSeverityFlagsEXT,
    message_type: vk::DebugUtilsMessageTypeFlagsEXT,
    p_callback_data: *const vk::DebugUtilsMessengerCallbackDataEXT,
    _p_user_data: *mut ffi::c_void,
) -> vk::Bool32 {
    println!(
        "[Validation Layer][{:?}][{:?}] {:?}",
        message_severity,
        message_type,
        ffi::CStr::from_ptr((*p_callback_data).p_message)
    );

    vk::FALSE
}