110 lines
3.6 KiB
Rust
110 lines
3.6 KiB
Rust
use ash::vk;
|
|
use vk::*;
|
|
|
|
use std::ffi::CStr;
|
|
use std::os::raw::c_void;
|
|
use std::ptr;
|
|
|
|
unsafe extern "system" fn vulkan_debug_utils_callback(
|
|
message_severity: vk::DebugUtilsMessageSeverityFlagsEXT,
|
|
message_type: vk::DebugUtilsMessageTypeFlagsEXT,
|
|
p_callback_data: *const vk::DebugUtilsMessengerCallbackDataEXT,
|
|
_p_user_data: *mut c_void,
|
|
) -> vk::Bool32 {
|
|
let severity = match message_severity {
|
|
vk::DebugUtilsMessageSeverityFlagsEXT::VERBOSE => "[Verbose]",
|
|
vk::DebugUtilsMessageSeverityFlagsEXT::WARNING => "[Warning]",
|
|
vk::DebugUtilsMessageSeverityFlagsEXT::ERROR => "[Error]",
|
|
vk::DebugUtilsMessageSeverityFlagsEXT::INFO => "[Info]",
|
|
_ => "[Unknown]",
|
|
};
|
|
let types = match message_type {
|
|
vk::DebugUtilsMessageTypeFlagsEXT::GENERAL => "[General]",
|
|
vk::DebugUtilsMessageTypeFlagsEXT::PERFORMANCE => "[Performance]",
|
|
vk::DebugUtilsMessageTypeFlagsEXT::VALIDATION => "[Validation]",
|
|
_ => "[Unknown]",
|
|
};
|
|
let message = CStr::from_ptr((*p_callback_data).p_message);
|
|
println!("[Debug]{}{}{:?}", severity, types, message);
|
|
|
|
vk::FALSE
|
|
}
|
|
|
|
pub struct ValidationInfo {
|
|
pub is_enable: bool,
|
|
pub required_validation_layers: [&'static str; 1],
|
|
}
|
|
|
|
pub fn check_validation_layer_support(
|
|
entry: &ash::Entry,
|
|
required_validation_layers: &Vec<&str>,
|
|
) -> bool {
|
|
// if support validation layer, then return true
|
|
|
|
let layer_properties = entry
|
|
.enumerate_instance_layer_properties()
|
|
.expect("Failed to enumerate Instance Layers Properties");
|
|
|
|
if layer_properties.len() <= 0 {
|
|
eprintln!("No available layers.");
|
|
return false;
|
|
}
|
|
|
|
for required_layer_name in required_validation_layers.iter() {
|
|
let mut is_layer_found = false;
|
|
|
|
for layer_property in layer_properties.iter() {
|
|
let test_layer_name = super::tools::vk_to_string(&layer_property.layer_name);
|
|
if (*required_layer_name) == test_layer_name {
|
|
is_layer_found = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if is_layer_found == false {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
true
|
|
}
|
|
|
|
pub fn setup_debug_utils(
|
|
is_enable_debug: bool,
|
|
entry: &ash::Entry,
|
|
instance: &ash::Instance,
|
|
) -> (ash::extensions::ext::DebugUtils, vk::DebugUtilsMessengerEXT) {
|
|
let debug_utils_loader = ash::extensions::ext::DebugUtils::new(entry, instance);
|
|
|
|
if is_enable_debug == false {
|
|
(debug_utils_loader, ash::vk::DebugUtilsMessengerEXT::null())
|
|
} else {
|
|
let messenger_ci = populate_debug_messenger_create_info();
|
|
|
|
let utils_messenger = unsafe {
|
|
debug_utils_loader
|
|
.create_debug_utils_messenger(&messenger_ci, None)
|
|
.expect("Debug Utils Callback")
|
|
};
|
|
|
|
(debug_utils_loader, utils_messenger)
|
|
}
|
|
}
|
|
|
|
pub fn populate_debug_messenger_create_info() -> vk::DebugUtilsMessengerCreateInfoEXT {
|
|
vk::DebugUtilsMessengerCreateInfoEXT {
|
|
s_type: vk::StructureType::DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT,
|
|
p_next: ptr::null(),
|
|
flags: vk::DebugUtilsMessengerCreateFlagsEXT::empty(),
|
|
message_severity: vk::DebugUtilsMessageSeverityFlagsEXT::WARNING |
|
|
// vk::DebugUtilsMessageSeverityFlagsEXT::VERBOSE |
|
|
// vk::DebugUtilsMessageSeverityFlagsEXT::INFO |
|
|
vk::DebugUtilsMessageSeverityFlagsEXT::ERROR,
|
|
message_type: vk::DebugUtilsMessageTypeFlagsEXT::GENERAL
|
|
| vk::DebugUtilsMessageTypeFlagsEXT::PERFORMANCE
|
|
| vk::DebugUtilsMessageTypeFlagsEXT::VALIDATION,
|
|
pfn_user_callback: Some(vulkan_debug_utils_callback),
|
|
p_user_data: ptr::null_mut(),
|
|
}
|
|
}
|