Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion src/backend/wayland/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,14 @@ fn start(conn: Connection) -> mpsc::Receiver<Event> {
// 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(),
Expand All @@ -300,7 +308,7 @@ fn start(conn: Connection) -> mpsc::Receiver<Event> {
dmabuf_feedback: None,
gbm_devices: GbmDevices::default(),
thread_pool,
vulkan: vulkan::Vulkan::new(),
vulkan: vulkan.ok(),
};

let (cmd_sender, cmd_channel) = calloop::channel::channel();
Expand Down
17 changes: 10 additions & 7 deletions src/backend/wayland/vulkan.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<u64, VkResult<Option<String>>>,
}

impl Vulkan {
pub fn new() -> Option<Self> {
let entry = unsafe { ash::Entry::load().ok()? };
pub fn new() -> anyhow::Result<Self> {
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(),
})
Expand All @@ -30,6 +30,9 @@ impl Vulkan {
pub fn device_name(&mut self, dev: u64) -> VkResult<Option<&str>> {
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
Expand Down