summaryrefslogtreecommitdiffstats
path: root/renderer
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón <hector0193@gmail.com>2023-04-27 16:09:39 +0200
committerLibravatar GitHub <noreply@github.com>2023-04-27 16:09:39 +0200
commitc31ab8eee6a49a48b4e6ad92207b8ee0360a0eff (patch)
tree0b099fc1e3810c2709a40627e11da5dc4988822b /renderer
parente3730106e9d4f75de199e1b83cf285b8ff031968 (diff)
parenta755472ee35dfb7839f989becafc6028921a3b99 (diff)
downloadiced-c31ab8eee6a49a48b4e6ad92207b8ee0360a0eff.tar.gz
iced-c31ab8eee6a49a48b4e6ad92207b8ee0360a0eff.tar.bz2
iced-c31ab8eee6a49a48b4e6ad92207b8ee0360a0eff.zip
Merge pull request #1811 from iced-rs/incremental-rendering
Incremental rendering
Diffstat (limited to 'renderer')
-rw-r--r--renderer/src/compositor.rs133
1 files changed, 88 insertions, 45 deletions
diff --git a/renderer/src/compositor.rs b/renderer/src/compositor.rs
index 218e7e33..48ed4b1f 100644
--- a/renderer/src/compositor.rs
+++ b/renderer/src/compositor.rs
@@ -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))
}
@@ -162,11 +123,10 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> {
),
#[cfg(feature = "tiny-skia")]
(
- Self::TinySkia(compositor),
+ Self::TinySkia(_compositor),
crate::Backend::TinySkia(backend),
Surface::TinySkia(surface),
) => iced_tiny_skia::window::compositor::present(
- compositor,
backend,
surface,
primitives,
@@ -183,3 +143,86 @@ 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 {
+ #[cfg(feature = "wgpu")]
+ Self::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,
+ )?;
+
+ Ok((
+ Compositor::Wgpu(compositor),
+ Renderer::new(crate::Backend::Wgpu(backend)),
+ ))
+ }
+ #[cfg(feature = "tiny-skia")]
+ Self::TinySkia => {
+ 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)),
+ ))
+ }
+ #[cfg(not(feature = "wgpu"))]
+ Self::Wgpu => {
+ panic!("`wgpu` feature was not enabled in `iced_renderer`")
+ }
+ #[cfg(not(feature = "tiny-skia"))]
+ Self::TinySkia => {
+ panic!(
+ "`tiny-skia` feature was not enabled in `iced_renderer`"
+ );
+ }
+ }
+ }
+}