Separate Compositor::new from Compositor::create_renderer

This commit is contained in:
Héctor Ramón Jiménez 2023-12-02 20:49:47 +01:00
parent ea42af766f
commit b152ecda63
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
7 changed files with 35 additions and 75 deletions

View file

@ -22,10 +22,10 @@ pub trait Compositor: Sized {
fn new<W: HasRawWindowHandle + HasRawDisplayHandle>( fn new<W: HasRawWindowHandle + HasRawDisplayHandle>(
settings: Self::Settings, settings: Self::Settings,
compatible_window: Option<&W>, compatible_window: Option<&W>,
) -> Result<(Self, Self::Renderer), Error>; ) -> Result<Self, Error>;
/// Creates a [`Self::Renderer`] for the [`Compositor`]. /// Creates a [`Self::Renderer`] for the [`Compositor`].
fn renderer(&self) -> Self::Renderer; fn create_renderer(&self) -> Self::Renderer;
/// Crates a new [`Surface`] for the given window. /// Crates a new [`Surface`] for the given window.
/// ///

View file

@ -26,7 +26,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> {
fn new<W: HasRawWindowHandle + HasRawDisplayHandle>( fn new<W: HasRawWindowHandle + HasRawDisplayHandle>(
settings: Self::Settings, settings: Self::Settings,
compatible_window: Option<&W>, compatible_window: Option<&W>,
) -> Result<(Self, Self::Renderer), Error> { ) -> Result<Self, Error> {
let candidates = let candidates =
Candidate::list_from_env().unwrap_or(Candidate::default_list()); Candidate::list_from_env().unwrap_or(Candidate::default_list());
@ -34,9 +34,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> {
for candidate in candidates { for candidate in candidates {
match candidate.build(settings, compatible_window) { match candidate.build(settings, compatible_window) {
Ok((compositor, renderer)) => { Ok(compositor) => return Ok(compositor),
return Ok((compositor, renderer))
}
Err(new_error) => { Err(new_error) => {
error = new_error; error = new_error;
} }
@ -46,14 +44,14 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> {
Err(error) Err(error)
} }
fn renderer(&self) -> Self::Renderer { fn create_renderer(&self) -> Self::Renderer {
match self { match self {
Compositor::TinySkia(compositor) => { Compositor::TinySkia(compositor) => {
Renderer::TinySkia(compositor.renderer()) Renderer::TinySkia(compositor.create_renderer())
} }
#[cfg(feature = "wgpu")] #[cfg(feature = "wgpu")]
Compositor::Wgpu(compositor) => { Compositor::Wgpu(compositor) => {
Renderer::Wgpu(compositor.renderer()) Renderer::Wgpu(compositor.create_renderer())
} }
} }
} }
@ -232,29 +230,21 @@ impl Candidate {
self, self,
settings: Settings, settings: Settings,
_compatible_window: Option<&W>, _compatible_window: Option<&W>,
) -> Result<(Compositor<Theme>, Renderer<Theme>), Error> { ) -> Result<Compositor<Theme>, Error> {
match self { match self {
Self::TinySkia => { Self::TinySkia => {
let (compositor, backend) = let compositor = iced_tiny_skia::window::compositor::new(
iced_tiny_skia::window::compositor::new( iced_tiny_skia::Settings {
iced_tiny_skia::Settings { default_font: settings.default_font,
default_font: settings.default_font, default_text_size: settings.default_text_size,
default_text_size: settings.default_text_size, },
}, );
);
Ok(( Ok(Compositor::TinySkia(compositor))
Compositor::TinySkia(compositor),
Renderer::TinySkia(iced_tiny_skia::Renderer::new(
backend,
settings.default_font,
settings.default_text_size,
)),
))
} }
#[cfg(feature = "wgpu")] #[cfg(feature = "wgpu")]
Self::Wgpu => { Self::Wgpu => {
let (compositor, backend) = iced_wgpu::window::compositor::new( let compositor = iced_wgpu::window::compositor::new(
iced_wgpu::Settings { iced_wgpu::Settings {
default_font: settings.default_font, default_font: settings.default_font,
default_text_size: settings.default_text_size, default_text_size: settings.default_text_size,
@ -264,14 +254,7 @@ impl Candidate {
_compatible_window, _compatible_window,
)?; )?;
Ok(( Ok(Compositor::Wgpu(compositor))
Compositor::Wgpu(compositor),
Renderer::Wgpu(iced_wgpu::Renderer::new(
backend,
settings.default_font,
settings.default_text_size,
)),
))
} }
#[cfg(not(feature = "wgpu"))] #[cfg(not(feature = "wgpu"))]
Self::Wgpu => { Self::Wgpu => {

View file

@ -28,20 +28,11 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> {
fn new<W: HasRawWindowHandle + HasRawDisplayHandle>( fn new<W: HasRawWindowHandle + HasRawDisplayHandle>(
settings: Self::Settings, settings: Self::Settings,
_compatible_window: Option<&W>, _compatible_window: Option<&W>,
) -> Result<(Self, Self::Renderer), Error> { ) -> Result<Self, Error> {
let (compositor, backend) = new(settings); Ok(new(settings))
Ok((
compositor,
Renderer::new(
backend,
settings.default_font,
settings.default_text_size,
),
))
} }
fn renderer(&self) -> Self::Renderer { fn create_renderer(&self) -> Self::Renderer {
Renderer::new( Renderer::new(
Backend::new(), Backend::new(),
self.settings.default_font, self.settings.default_font,
@ -130,14 +121,11 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> {
} }
} }
pub fn new<Theme>(settings: Settings) -> (Compositor<Theme>, Backend) { pub fn new<Theme>(settings: Settings) -> Compositor<Theme> {
( Compositor {
Compositor { settings,
settings, _theme: PhantomData,
_theme: PhantomData, }
},
Backend::new(),
)
} }
pub fn present<T: AsRef<str>>( pub fn present<T: AsRef<str>>(

View file

@ -139,16 +139,14 @@ impl<Theme> Compositor<Theme> {
pub fn new<Theme, W: HasRawWindowHandle + HasRawDisplayHandle>( pub fn new<Theme, W: HasRawWindowHandle + HasRawDisplayHandle>(
settings: Settings, settings: Settings,
compatible_window: Option<&W>, compatible_window: Option<&W>,
) -> Result<(Compositor<Theme>, Backend), Error> { ) -> Result<Compositor<Theme>, Error> {
let compositor = futures::executor::block_on(Compositor::request( let compositor = futures::executor::block_on(Compositor::request(
settings, settings,
compatible_window, compatible_window,
)) ))
.ok_or(Error::GraphicsAdapterNotFound)?; .ok_or(Error::GraphicsAdapterNotFound)?;
let backend = compositor.create_backend(); Ok(compositor)
Ok((compositor, backend))
} }
/// Presents the given primitives with the given [`Compositor`] and [`Backend`]. /// Presents the given primitives with the given [`Compositor`] and [`Backend`].
@ -214,20 +212,11 @@ impl<Theme> graphics::Compositor for Compositor<Theme> {
fn new<W: HasRawWindowHandle + HasRawDisplayHandle>( fn new<W: HasRawWindowHandle + HasRawDisplayHandle>(
settings: Self::Settings, settings: Self::Settings,
compatible_window: Option<&W>, compatible_window: Option<&W>,
) -> Result<(Self, Self::Renderer), Error> { ) -> Result<Self, Error> {
let (compositor, backend) = new(settings, compatible_window)?; new(settings, compatible_window)
Ok((
compositor,
Renderer::new(
backend,
settings.default_font,
settings.default_text_size,
),
))
} }
fn renderer(&self) -> Self::Renderer { fn create_renderer(&self) -> Self::Renderer {
Renderer::new( Renderer::new(
self.create_backend(), self.create_backend(),
self.settings.default_font, self.settings.default_font,

View file

@ -181,8 +181,8 @@ where
}; };
} }
let (compositor, mut renderer) = let compositor = C::new(compositor_settings, Some(&window))?;
C::new(compositor_settings, Some(&window))?; let mut renderer = compositor.create_renderer();
for font in settings.fonts { for font in settings.fonts {
use crate::core::text::Renderer; use crate::core::text::Renderer;

View file

@ -181,8 +181,8 @@ where
}; };
} }
let (mut compositor, renderer) = let mut compositor = C::new(compositor_settings, Some(&main_window))?;
C::new(compositor_settings, Some(&main_window))?; let renderer = compositor.create_renderer();
let windows = Windows::new( let windows = Windows::new(
&application, &application,

View file

@ -97,7 +97,7 @@ where
physical_size.width, physical_size.width,
physical_size.height, physical_size.height,
); );
let renderer = compositor.renderer(); let renderer = compositor.create_renderer();
self.ids.push(id); self.ids.push(id);
self.raw.push(window); self.raw.push(window);