Skip to content

Commit 47fca71

Browse files
committed
Enable unwind panics & hardened GPU init
1 parent 79b0a80 commit 47fca71

2 files changed

Lines changed: 72 additions & 48 deletions

File tree

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ manual_clamp = "deny"
9696

9797
# Optimize for smaller binary size
9898
[profile.release]
99-
panic = "abort" # Strip expensive panic clean-up logic
99+
panic = "unwind"
100100
codegen-units = 1 # Compile crates one after another so the compiler can optimize better
101101
lto = true # Enables link to optimizations
102102
opt-level = "s" # Optimize for binary size

apps/desktop/src-tauri/src/gpu_context.rs

Lines changed: 71 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -47,61 +47,85 @@ pub struct SharedGpuContext {
4747

4848
static GPU: OnceCell<Option<SharedGpuContext>> = OnceCell::const_new();
4949

50-
pub async fn get_shared_gpu() -> Option<&'static SharedGpuContext> {
51-
GPU.get_or_init(|| async {
52-
let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor::default());
50+
async fn init_gpu_inner() -> Option<SharedGpuContext> {
51+
let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor::default());
52+
53+
let hardware_adapter = instance
54+
.request_adapter(&wgpu::RequestAdapterOptions {
55+
power_preference: wgpu::PowerPreference::HighPerformance,
56+
force_fallback_adapter: false,
57+
compatible_surface: None,
58+
})
59+
.await
60+
.ok();
5361

54-
let hardware_adapter = instance
62+
let (adapter, is_software_adapter) = if let Some(adapter) = hardware_adapter {
63+
tracing::info!(
64+
adapter_name = adapter.get_info().name,
65+
adapter_backend = ?adapter.get_info().backend,
66+
"Using hardware GPU adapter for shared context"
67+
);
68+
(adapter, false)
69+
} else {
70+
tracing::warn!(
71+
"No hardware GPU adapter found, attempting software fallback for shared context"
72+
);
73+
let software_adapter = instance
5574
.request_adapter(&wgpu::RequestAdapterOptions {
56-
power_preference: wgpu::PowerPreference::HighPerformance,
57-
force_fallback_adapter: false,
75+
power_preference: wgpu::PowerPreference::LowPower,
76+
force_fallback_adapter: true,
5877
compatible_surface: None,
5978
})
6079
.await
61-
.ok();
62-
63-
let (adapter, is_software_adapter) = if let Some(adapter) = hardware_adapter {
64-
tracing::info!(
65-
adapter_name = adapter.get_info().name,
66-
adapter_backend = ?adapter.get_info().backend,
67-
"Using hardware GPU adapter for shared context"
68-
);
69-
(adapter, false)
70-
} else {
71-
tracing::warn!("No hardware GPU adapter found, attempting software fallback for shared context");
72-
let software_adapter = instance
73-
.request_adapter(&wgpu::RequestAdapterOptions {
74-
power_preference: wgpu::PowerPreference::LowPower,
75-
force_fallback_adapter: true,
76-
compatible_surface: None,
77-
})
78-
.await
79-
.ok()?;
80-
81-
tracing::info!(
82-
adapter_name = software_adapter.get_info().name,
83-
adapter_backend = ?software_adapter.get_info().backend,
84-
"Using software adapter for shared context (CPU rendering - performance may be reduced)"
85-
);
86-
(software_adapter, true)
87-
};
88-
89-
let (device, queue) = adapter
90-
.request_device(&wgpu::DeviceDescriptor {
91-
label: Some("cap-shared-gpu-device"),
92-
required_features: wgpu::Features::empty(),
93-
..Default::default()
94-
})
95-
.await
9680
.ok()?;
9781

98-
Some(SharedGpuContext {
99-
device: Arc::new(device),
100-
queue: Arc::new(queue),
101-
adapter: Arc::new(adapter),
102-
instance: Arc::new(instance),
103-
is_software_adapter,
82+
tracing::info!(
83+
adapter_name = software_adapter.get_info().name,
84+
adapter_backend = ?software_adapter.get_info().backend,
85+
"Using software adapter for shared context (CPU rendering - performance may be reduced)"
86+
);
87+
(software_adapter, true)
88+
};
89+
90+
let (device, queue) = adapter
91+
.request_device(&wgpu::DeviceDescriptor {
92+
label: Some("cap-shared-gpu-device"),
93+
required_features: wgpu::Features::empty(),
94+
..Default::default()
10495
})
96+
.await
97+
.ok()?;
98+
99+
Some(SharedGpuContext {
100+
device: Arc::new(device),
101+
queue: Arc::new(queue),
102+
adapter: Arc::new(adapter),
103+
instance: Arc::new(instance),
104+
is_software_adapter,
105+
})
106+
}
107+
108+
pub async fn get_shared_gpu() -> Option<&'static SharedGpuContext> {
109+
GPU.get_or_init(|| async {
110+
let result = tokio::spawn(init_gpu_inner()).await;
111+
112+
match result {
113+
Ok(ctx) => ctx,
114+
Err(e) => {
115+
if e.is_panic() {
116+
tracing::error!(
117+
"GPU initialization panicked (wgpu internal error). \
118+
The app will continue without GPU acceleration."
119+
);
120+
} else {
121+
tracing::error!(
122+
error = %e,
123+
"GPU initialization task failed"
124+
);
125+
}
126+
None
127+
}
128+
}
105129
})
106130
.await
107131
.as_ref()

0 commit comments

Comments
 (0)