use anyhow::{anyhow, Result}; use vulkanalia::loader::{LibloadingLoader, LIBRARY}; use vulkanalia::prelude::v1_0::*; use vulkanalia::window as vk_window; use winit::window::Window; unsafe fn create_instance(window: &Window, entry: &Entry) -> Result { let application_info = vk::ApplicationInfo::builder() .application_name(b"Vulkan Tutorial\0") .application_version(vk::make_version(1, 0, 0)) .engine_name(b"No Engine\0") .engine_version(vk::make_version(1, 0, 0)) .api_version(vk::make_version(1, 0, 0)); let mut extensions = vk_window::get_required_instance_extensions(window) .iter() .map(|e| e.as_ptr()) .collect::>(); // Compatibility extension for macOS let flags = if entry .enumerate_instance_extension_properties(None)? .iter() .any(|e| e.extension_name == vk::KHR_PORTABILITY_ENUMERATION_EXTENSION.name) { extensions.push(vk::KHR_PORTABILITY_ENUMERATION_EXTENSION.name.as_ptr()); vk::InstanceCreateFlags::ENUMERATE_PORTABILITY_KHR } else { vk::InstanceCreateFlags::empty() }; let info = vk::InstanceCreateInfo::builder() .application_info(&application_info) .enabled_extension_names(&extensions) .flags(flags); Ok(entry.create_instance(&info, None)?) } /// Our Vulkan app. #[derive(Clone, Debug)] pub struct App { entry: Entry, instance: Instance, } impl App { /// Creates our Vulkan app. pub unsafe fn create(window: &Window) -> Result { let loader = LibloadingLoader::new(LIBRARY)?; let entry = Entry::new(loader).map_err(|b| anyhow!("{}", b))?; let instance = create_instance(window, &entry)?; Ok(Self { entry, instance }) } /// Renders a frame for our Vulkan app. pub unsafe fn render(&mut self, window: &Window) -> Result<()> { Ok(()) } /// Destroys our Vulkan app. pub unsafe fn destroy(&mut self) { self.instance.destroy_instance(None); } } /// The Vulkan handles and associated properties used by our Vulkan app. #[derive(Clone, Debug, Default)] pub struct AppData {}