Support ICED_BACKEND environment variable

This commit is contained in:
Héctor Ramón Jiménez 2023-04-08 06:44:46 +02:00
parent 1872f7fa6d
commit 42b2e9b007
No known key found for this signature in database
GPG key ID: 140CC052C94F138E

View file

@ -4,6 +4,7 @@ use crate::graphics::{Error, Viewport};
use crate::{Renderer, Settings};
use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle};
use std::env;
pub enum Compositor<Theme> {
#[cfg(feature = "wgpu")]
@ -28,53 +29,13 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> {
settings: Self::Settings,
compatible_window: Option<&W>,
) -> Result<(Self, Self::Renderer), Error> {
#[cfg(feature = "wgpu")]
let new_wgpu = |settings: Self::Settings, compatible_window| {
let (compositor, backend) = iced_wgpu::window::compositor::new(
iced_wgpu::Settings {
default_font: settings.default_font,
default_text_size: settings.default_text_size,
antialiasing: settings.antialiasing,
..iced_wgpu::Settings::from_env()
},
compatible_window,
)?;
Ok((
Self::Wgpu(compositor),
Renderer::new(crate::Backend::Wgpu(backend)),
))
};
#[cfg(feature = "tiny-skia")]
let new_tiny_skia = |settings: Self::Settings, _compatible_window| {
let (compositor, backend) = iced_tiny_skia::window::compositor::new(
iced_tiny_skia::Settings {
default_font: settings.default_font,
default_text_size: settings.default_text_size,
},
);
Ok((
Self::TinySkia(compositor),
Renderer::new(crate::Backend::TinySkia(backend)),
))
};
let fail = |_, _| Err(Error::GraphicsAdapterNotFound);
let candidates = &[
#[cfg(feature = "wgpu")]
new_wgpu,
#[cfg(feature = "tiny-skia")]
new_tiny_skia,
fail,
];
let candidates =
Candidate::list_from_env().unwrap_or(Candidate::default_list());
let mut error = Error::GraphicsAdapterNotFound;
for candidate in candidates {
match candidate(settings, compatible_window) {
match candidate.build(settings, compatible_window) {
Ok((compositor, renderer)) => {
return Ok((compositor, renderer))
}
@ -183,3 +144,83 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> {
})
}
}
enum Candidate {
Wgpu,
TinySkia,
}
impl Candidate {
fn default_list() -> Vec<Self> {
vec![
#[cfg(feature = "wgpu")]
Self::Wgpu,
#[cfg(feature = "tiny-skia")]
Self::TinySkia,
]
}
fn list_from_env() -> Option<Vec<Self>> {
let backends = env::var("ICED_BACKEND").ok()?;
Some(
backends
.split(',')
.map(str::trim)
.map(|backend| match backend {
"wgpu" => Self::Wgpu,
"tiny-skia" => Self::TinySkia,
_ => panic!("unknown backend value: \"{backend}\""),
})
.collect(),
)
}
fn build<Theme, W: HasRawWindowHandle + HasRawDisplayHandle>(
self,
settings: Settings,
compatible_window: Option<&W>,
) -> Result<(Compositor<Theme>, Renderer<Theme>), Error> {
match self {
Self::Wgpu => {
if cfg!(feature = "wgpu") {
let (compositor, backend) =
iced_wgpu::window::compositor::new(
iced_wgpu::Settings {
default_font: settings.default_font,
default_text_size: settings.default_text_size,
antialiasing: settings.antialiasing,
..iced_wgpu::Settings::from_env()
},
compatible_window,
)?;
return Ok((
Compositor::Wgpu(compositor),
Renderer::new(crate::Backend::Wgpu(backend)),
));
} else {
panic!("`wgpu` feature was not enabled in `iced_renderer`");
}
}
Self::TinySkia => {
if cfg!(feature = "tiny-skia") {
let (compositor, backend) =
iced_tiny_skia::window::compositor::new(
iced_tiny_skia::Settings {
default_font: settings.default_font,
default_text_size: settings.default_text_size,
},
);
Ok((
Compositor::TinySkia(compositor),
Renderer::new(crate::Backend::TinySkia(backend)),
))
} else {
panic!("`wgpu` feature was not enabled in `iced_renderer`");
}
}
}
}
}