From 0713ba0213626db37e1733d50e71a228a4f0f48e Mon Sep 17 00:00:00 2001 From: ardocrat Date: Mon, 19 Jan 2026 21:21:13 +0100 Subject: [PATCH] gui: wgpu fallback renderer for desktop (#31) Reviewed-on: https://code.gri.mw/GUI/grim/pulls/31 --- Cargo.lock | 2 ++ Cargo.toml | 2 +- src/main.rs | 21 +++++++++++++++++++-- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 213af8a8..8bf9e3db 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2485,6 +2485,7 @@ dependencies = [ "objc2-foundation 0.2.2", "parking_lot 0.12.5", "percent-encoding", + "pollster", "profiling", "raw-window-handle", "static_assertions", @@ -2492,6 +2493,7 @@ dependencies = [ "wasm-bindgen-futures", "web-sys", "web-time", + "wgpu", "windows-sys 0.61.2", "winit", ] diff --git a/Cargo.toml b/Cargo.toml index 15cb5999..d210fbbe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -154,7 +154,7 @@ nokhwa-mac = { git = "https://code.gri.mw/ardocrat/nokhwa", rev = "612c861ef153c [target.'cfg(not(target_os = "android"))'.dependencies] env_logger = "0.11.3" winit = { version = "0.30.12" } -eframe = { version = "0.33.2", default-features = false, features = ["glow", "wayland"] } +eframe = { version = "0.33.2", default-features = false, features = ["glow", "wgpu", "wayland"] } arboard = "3.2.0" rfd = "0.15.0" interprocess = { version = "2.2.1", features = ["tokio"] } diff --git a/src/main.rs b/src/main.rs index 2fa7eda3..e61d3f1b 100755 --- a/src/main.rs +++ b/src/main.rs @@ -134,7 +134,7 @@ fn start_desktop_gui(platform: grim::gui::platform::Desktop) { .with_transparent(true) .with_decorations(is_mac || is_win); - let options = eframe::NativeOptions { + let mut options = eframe::NativeOptions { renderer: eframe::Renderer::Glow, viewport, ..Default::default() @@ -142,7 +142,24 @@ fn start_desktop_gui(platform: grim::gui::platform::Desktop) { // Start GUI. let app = grim::gui::App::new(platform.clone()); - grim::start(options.clone(), grim::app_creator(app)).unwrap(); + match grim::start(options.clone(), grim::app_creator(app)) { + Ok(_) => {} + Err(e) => { + if is_win { + panic!("{}", e); + } + // Start with another renderer on error. + options.renderer = eframe::Renderer::Wgpu; + + let app = grim::gui::App::new(platform); + match grim::start(options, grim::app_creator(app)) { + Ok(_) => {} + Err(e) => { + panic!("{}", e); + } + } + } + } } /// Check if application is already running to pass data.