Skip to content

Commit 2ffb01c

Browse files
committed
winit: Re-add support for fallback renderer creation
This re-instantes the code path for a suspended renderer creation possibly failing.
1 parent 3b245c0 commit 2ffb01c

File tree

5 files changed

+42
-38
lines changed

5 files changed

+42
-38
lines changed

internal/backends/winit/lib.rs

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ cfg_if::cfg_if! {
114114

115115
fn default_renderer_factory(
116116
shared_backend_data: &Rc<SharedBackendData>,
117-
) -> Box<dyn WinitCompatibleRenderer> {
117+
) -> Result<Box<dyn WinitCompatibleRenderer>, PlatformError> {
118118
cfg_if::cfg_if! {
119119
if #[cfg(enable_skia_renderer)] {
120120
renderer::skia::WinitSkiaRenderer::new_suspended(shared_backend_data)
@@ -152,17 +152,16 @@ fn try_create_window_with_fallback_renderer(
152152
]
153153
.into_iter()
154154
.find_map(|renderer_factory| {
155-
WinitWindowAdapter::new(
155+
Some(WinitWindowAdapter::new(
156156
shared_backend_data.clone(),
157-
renderer_factory(&shared_backend_data),
157+
renderer_factory(&shared_backend_data).ok()?,
158158
attrs.clone(),
159159
None,
160160
#[cfg(any(enable_accesskit, muda))]
161161
_proxy.clone(),
162162
#[cfg(all(muda, target_os = "macos"))]
163163
muda_enable_default_menu_bar,
164-
)
165-
.ok()
164+
))
166165
})
167166
}
168167

@@ -591,7 +590,8 @@ impl SharedBackendData {
591590
/// ```
592591
pub struct Backend {
593592
requested_graphics_api: Option<RequestedGraphicsAPI>,
594-
renderer_factory_fn: fn(&Rc<SharedBackendData>) -> Box<dyn WinitCompatibleRenderer>,
593+
renderer_factory_fn:
594+
fn(&Rc<SharedBackendData>) -> Result<Box<dyn WinitCompatibleRenderer>, PlatformError>,
595595
event_loop_state: RefCell<Option<crate::event_loop::EventLoopState>>,
596596
shared_data: Rc<SharedBackendData>,
597597
custom_application_handler: RefCell<Option<Box<dyn crate::CustomApplicationHandler>>>,
@@ -668,26 +668,30 @@ impl i_slint_core::platform::Platform for Backend {
668668
attrs = hook(attrs);
669669
}
670670

671-
let adapter = WinitWindowAdapter::new(
672-
self.shared_data.clone(),
673-
(self.renderer_factory_fn)(&self.shared_data),
674-
attrs.clone(),
675-
self.requested_graphics_api.clone(),
676-
#[cfg(any(enable_accesskit, muda))]
677-
self.shared_data.event_loop_proxy.clone(),
678-
#[cfg(all(muda, target_os = "macos"))]
679-
self.muda_enable_default_menu_bar_bar,
680-
)
681-
.or_else(|e| {
682-
try_create_window_with_fallback_renderer(
683-
&self.shared_data,
684-
attrs,
685-
&self.shared_data.event_loop_proxy.clone(),
686-
#[cfg(all(muda, target_os = "macos"))]
687-
self.muda_enable_default_menu_bar_bar,
688-
)
689-
.ok_or_else(|| format!("Winit backend failed to find a suitable renderer: {e}"))
690-
})?;
671+
let adapter = (self.renderer_factory_fn)(&self.shared_data).map_or_else(
672+
|e| {
673+
try_create_window_with_fallback_renderer(
674+
&self.shared_data,
675+
attrs.clone(),
676+
&self.shared_data.event_loop_proxy.clone(),
677+
#[cfg(all(muda, target_os = "macos"))]
678+
self.muda_enable_default_menu_bar_bar,
679+
)
680+
.ok_or_else(|| format!("Winit backend failed to find a suitable renderer: {e}"))
681+
},
682+
|renderer| {
683+
Ok(WinitWindowAdapter::new(
684+
self.shared_data.clone(),
685+
renderer,
686+
attrs.clone(),
687+
self.requested_graphics_api.clone(),
688+
#[cfg(any(enable_accesskit, muda))]
689+
self.shared_data.event_loop_proxy.clone(),
690+
#[cfg(all(muda, target_os = "macos"))]
691+
self.muda_enable_default_menu_bar_bar,
692+
))
693+
},
694+
)?;
691695
Ok(adapter)
692696
}
693697

internal/backends/winit/renderer/femtovg.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ pub struct GlutinFemtoVGRenderer {
2828
impl GlutinFemtoVGRenderer {
2929
pub fn new_suspended(
3030
_shared_backend_data: &Rc<crate::SharedBackendData>,
31-
) -> Box<dyn WinitCompatibleRenderer> {
32-
Box::new(Self { renderer: FemtoVGRenderer::new_suspended() })
31+
) -> Result<Box<dyn WinitCompatibleRenderer>, PlatformError> {
32+
Ok(Box::new(Self { renderer: FemtoVGRenderer::new_suspended() }))
3333
}
3434
}
3535

@@ -94,11 +94,11 @@ pub struct WGPUFemtoVGRenderer {
9494
impl WGPUFemtoVGRenderer {
9595
pub fn new_suspended(
9696
_shared_backend_data: &Rc<crate::SharedBackendData>,
97-
) -> Box<dyn WinitCompatibleRenderer> {
98-
Box::new(Self {
97+
) -> Result<Box<dyn WinitCompatibleRenderer>, PlatformError> {
98+
Ok(Box::new(Self {
9999
renderer: FemtoVGRenderer::<i_slint_renderer_femtovg::wgpu::WGPUBackend>::new_suspended(
100100
),
101-
})
101+
}))
102102
}
103103
}
104104

internal/backends/winit/renderer/skia.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ pub struct WinitSkiaRenderer {
1616
impl WinitSkiaRenderer {
1717
pub fn new_suspended(
1818
shared_backend_data: &Rc<crate::SharedBackendData>,
19-
) -> Box<dyn super::WinitCompatibleRenderer> {
20-
Box::new(Self { renderer: SkiaRenderer::default(&shared_backend_data.skia_context) })
19+
) -> Result<Box<dyn super::WinitCompatibleRenderer>, PlatformError> {
20+
Ok(Box::new(Self { renderer: SkiaRenderer::default(&shared_backend_data.skia_context) }))
2121
}
2222

2323
#[cfg(not(target_os = "android"))]

internal/backends/winit/renderer/sw.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,12 @@ impl TargetPixel for SoftBufferPixel {
7272
impl WinitSoftwareRenderer {
7373
pub fn new_suspended(
7474
_shared_backend_data: &Rc<crate::SharedBackendData>,
75-
) -> Box<dyn WinitCompatibleRenderer> {
76-
Box::new(Self {
75+
) -> Result<Box<dyn WinitCompatibleRenderer>, PlatformError> {
76+
Ok(Box::new(Self {
7777
renderer: SoftwareRenderer::new(),
7878
_context: RefCell::new(None),
7979
surface: RefCell::new(None),
80-
})
80+
}))
8181
}
8282
}
8383

internal/backends/winit/winitwindowadapter.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ impl WinitWindowAdapter {
385385
requested_graphics_api: Option<RequestedGraphicsAPI>,
386386
#[cfg(any(enable_accesskit, muda))] proxy: EventLoopProxy<SlintEvent>,
387387
#[cfg(all(muda, target_os = "macos"))] muda_enable_default_menu_bar: bool,
388-
) -> Result<Rc<Self>, PlatformError> {
388+
) -> Rc<Self> {
389389
let self_rc = Rc::new_cyclic(|self_weak| Self {
390390
shared_backend_data: shared_backend_data.clone(),
391391
window: OnceCell::from(corelib::api::Window::new(self_weak.clone() as _)),
@@ -428,7 +428,7 @@ impl WinitWindowAdapter {
428428

429429
self_rc.shared_backend_data.register_inactive_window((self_rc.clone()) as _);
430430

431-
Ok(self_rc)
431+
self_rc
432432
}
433433

434434
fn renderer(&self) -> &dyn WinitCompatibleRenderer {

0 commit comments

Comments
 (0)