use std::ffi; use std::ffi::c_char; use ash::{Instance, vk, Entry}; use winit::raw_window_handle::{HasDisplayHandle}; pub struct VkInstance { instance: Instance } impl VkInstance { pub fn new(window: &impl HasDisplayHandle) -> Self { let entry = Entry::linked(); let app_name = unsafe { ffi::CStr::from_bytes_with_nul_unchecked(b"VulkanTriangle\0") }; let layer_names = [ unsafe { ffi::CStr::from_bytes_with_nul_unchecked(b"VK_LAYER_KHRONOS_validation\0") } ]; let layers_names_raw: Vec<*const c_char> = layer_names .iter() .map(|raw_name| raw_name.as_ptr()) .collect(); let mut extension_names = ash_window::enumerate_required_extensions(window.display_handle().expect("No display handle").as_raw()) .unwrap() .to_vec(); #[cfg(any(target_os = "macos", target_os = "ios"))] { extension_names.push(ash::khr::portability_enumeration::NAME.as_ptr()); // Enabling this extension is a requirement when using `VK_KHR_portability_subset` extension_names.push(ash::khr::get_physical_device_properties2::NAME.as_ptr()); } let appinfo = vk::ApplicationInfo::default() .application_name(app_name) .application_version(0) .engine_name(app_name) .engine_version(0) .api_version(vk::make_api_version(0, 1, 0, 0)); let create_flags = if cfg!(any(target_os = "macos", target_os = "ios")) { vk::InstanceCreateFlags::ENUMERATE_PORTABILITY_KHR } else { vk::InstanceCreateFlags::default() }; let create_info = vk::InstanceCreateInfo::default() .application_info(&appinfo) .enabled_layer_names(&layers_names_raw) .enabled_extension_names(&extension_names) .flags(create_flags); let instance: Instance = unsafe { entry .create_instance(&create_info, None) .expect("Instance creation error") }; Self { instance } } }