diff --git a/src/backend/wayland/mod.rs b/src/backend/wayland/mod.rs index 4413c1d..cf0b3f1 100644 --- a/src/backend/wayland/mod.rs +++ b/src/backend/wayland/mod.rs @@ -283,6 +283,14 @@ fn start(conn: Connection) -> mpsc::Receiver { // spawn an executor using one additional thread. let thread_pool = ThreadPool::builder().pool_size(1).create().unwrap(); + let vulkan = vulkan::Vulkan::new(); + if let Err(err) = &vulkan { + log::info!( + "Unable to initialize Vulkan: {}. Assuming now GPU workarounds needed.", + err + ); + } + let registry_state = RegistryState::new(&globals); let mut app_data = AppData { qh: qh.clone(), @@ -300,7 +308,7 @@ fn start(conn: Connection) -> mpsc::Receiver { dmabuf_feedback: None, gbm_devices: GbmDevices::default(), thread_pool, - vulkan: vulkan::Vulkan::new(), + vulkan: vulkan.ok(), }; let (cmd_sender, cmd_channel) = calloop::channel::channel(); diff --git a/src/backend/wayland/vulkan.rs b/src/backend/wayland/vulkan.rs index 25dcedf..a177452 100644 --- a/src/backend/wayland/vulkan.rs +++ b/src/backend/wayland/vulkan.rs @@ -3,25 +3,25 @@ use std::{collections::HashMap, ffi::CStr}; pub struct Vulkan { instance: ash::Instance, + _entry: ash::Entry, // TODO purge cache at some point device_name_cache: HashMap>>, } impl Vulkan { - pub fn new() -> Option { - let entry = unsafe { ash::Entry::load().ok()? }; + pub fn new() -> anyhow::Result { + let entry = unsafe { ash::Entry::load()? }; let app_info = vk::ApplicationInfo { api_version: vk::make_api_version(0, 1, 1, 0), ..Default::default() }; - let extensions = &[c"VK_EXT_physical_device_drm".as_ptr()]; let create_info = vk::InstanceCreateInfo { p_application_info: &app_info, ..Default::default() - } - .enabled_extension_names(extensions); - let instance = unsafe { entry.create_instance(&create_info, None).ok()? }; - Some(Self { + }; + let instance = unsafe { entry.create_instance(&create_info, None)? }; + Ok(Self { + _entry: entry, instance, device_name_cache: HashMap::new(), }) @@ -30,6 +30,9 @@ impl Vulkan { pub fn device_name(&mut self, dev: u64) -> VkResult> { if !self.device_name_cache.contains_key(&dev) { let value = self.device_name_uncached(dev); + if let Err(err) = &value { + log::error!("Failed to query Vulkan device properties: {}", err); + } self.device_name_cache.insert(dev, value); } self.device_name_cache