pub mod error; use std::ffi::c_char; use ash::{Entry, Instance, vk}; pub use error::RendererError; pub struct Renderer { _entry: Entry, instance: Instance, } impl Renderer { /// Initializes the Vulkan renderer. /// `required_extensions` are raw C-strings (pointers) provided by the windowing system. pub fn new(required_extensions: &[*const c_char]) -> Result { let entry = unsafe { Entry::load() }?; let mut extensions: Vec<*const c_char> = required_extensions.to_vec(); let mut layers: Vec<*const c_char> = Vec::new(); #[cfg(debug_assertions)] { extensions.push(ash::ext::debug_utils::NAME.as_ptr()); layers.push(c"VK_LAYER_KHRONOS_validation".as_ptr()); } let app_info = vk::ApplicationInfo::default() .api_version(vk::API_VERSION_1_3); let create_info = vk::InstanceCreateInfo::default() .application_info(&app_info) .enabled_extension_names(&extensions) .enabled_layer_names(&layers); let instance = unsafe { entry.create_instance(&create_info, None)? }; Ok(Self { _entry: entry, instance, }) } }