Skip to content

Commit 68b9b98

Browse files
committed
Split local state from Engine in iced_wgpu
1 parent 363b0e9 commit 68b9b98

22 files changed

Lines changed: 727 additions & 599 deletions

File tree

benches/wgpu.rs

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -80,16 +80,15 @@ fn benchmark<'a>(
8080

8181
let format = wgpu::TextureFormat::Bgra8UnormSrgb;
8282

83-
let mut engine = iced_wgpu::Engine::new(
83+
let engine = iced_wgpu::Engine::new(
8484
adapter,
85-
device,
86-
queue,
85+
device.clone(),
86+
queue.clone(),
8787
format,
8888
Some(Antialiasing::MSAAx4),
8989
);
9090

91-
let mut renderer =
92-
Renderer::new(device, &engine, Font::DEFAULT, Pixels::from(16));
91+
let mut renderer = Renderer::new(engine, Font::DEFAULT, Pixels::from(16));
9392

9493
let viewport =
9594
graphics::Viewport::with_physical_size(Size::new(3840, 2160), 2.0);
@@ -134,24 +133,14 @@ fn benchmark<'a>(
134133

135134
cache = Some(user_interface.into_cache());
136135

137-
let mut encoder =
138-
device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
139-
label: None,
140-
});
141-
142-
renderer.present::<&str>(
143-
&mut engine,
144-
device,
145-
queue,
146-
&mut encoder,
136+
let submission = renderer.present::<&str>(
147137
Some(Color::BLACK),
148138
format,
149139
&texture_view,
150140
&viewport,
151141
&[],
152142
);
153143

154-
let submission = engine.submit(queue, encoder);
155144
let _ = device.poll(wgpu::Maintain::WaitForSubmissionIndex(submission));
156145

157146
i += 1;

core/src/renderer.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,12 @@ impl Default for Style {
106106
/// a window nor a compositor.
107107
pub trait Headless {
108108
/// Creates a new [`Headless`] renderer;
109-
fn new(default_font: Font, default_text_size: Pixels) -> Self;
109+
fn new(
110+
default_font: Font,
111+
default_text_size: Pixels,
112+
) -> impl Future<Output = Option<Self>>
113+
where
114+
Self: Sized;
110115

111116
/// Draws offscreen into a screenshot, returning a collection of
112117
/// bytes representing the rendered pixels in RGBA order.

examples/integration/src/main.rs

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,9 @@ pub fn main() -> Result<(), winit::error::EventLoopError> {
3535
Loading,
3636
Ready {
3737
window: Arc<winit::window::Window>,
38-
device: wgpu::Device,
39-
queue: wgpu::Queue,
4038
surface: wgpu::Surface<'static>,
4139
format: wgpu::TextureFormat,
42-
engine: Engine,
40+
device: wgpu::Device,
4341
renderer: Renderer,
4442
scene: Scene,
4543
state: program::State<Controls>,
@@ -146,13 +144,9 @@ pub fn main() -> Result<(), winit::error::EventLoopError> {
146144
// Initialize iced
147145
let mut debug = Debug::new();
148146
let engine =
149-
Engine::new(&adapter, &device, &queue, format, None);
150-
let mut renderer = Renderer::new(
151-
&device,
152-
&engine,
153-
Font::default(),
154-
Pixels::from(16),
155-
);
147+
Engine::new(&adapter, device.clone(), queue, format, None);
148+
let mut renderer =
149+
Renderer::new(engine, Font::default(), Pixels::from(16));
156150

157151
let state = program::State::new(
158152
controls,
@@ -166,11 +160,9 @@ pub fn main() -> Result<(), winit::error::EventLoopError> {
166160

167161
*self = Self::Ready {
168162
window,
169-
device,
170-
queue,
171163
surface,
172164
format,
173-
engine,
165+
device,
174166
renderer,
175167
scene,
176168
state,
@@ -193,10 +185,8 @@ pub fn main() -> Result<(), winit::error::EventLoopError> {
193185
let Self::Ready {
194186
window,
195187
device,
196-
queue,
197188
surface,
198189
format,
199-
engine,
200190
renderer,
201191
scene,
202192
state,
@@ -264,10 +254,6 @@ pub fn main() -> Result<(), winit::error::EventLoopError> {
264254

265255
// And then iced on top
266256
renderer.present(
267-
engine,
268-
device,
269-
queue,
270-
&mut encoder,
271257
None,
272258
frame.texture.format(),
273259
&view,
@@ -276,7 +262,6 @@ pub fn main() -> Result<(), winit::error::EventLoopError> {
276262
);
277263

278264
// Then we submit the work
279-
engine.submit(queue, encoder);
280265
frame.present();
281266

282267
// Update the mouse cursor
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0e355b080ad33905145e9f70a3b29e2481197c8fc8f42491acd5358238ebbd5f
1+
804a1bb6d49e3b3158463202960447d9e7820b967280f41dd0c34c00d3edf2c3

graphics/src/compositor.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,11 @@ pub trait Compositor: Sized {
8686
/// the texture ordered as `RGBA` in the `sRGB` color space.
8787
///
8888
/// [`Renderer`]: Self::Renderer
89-
fn screenshot<T: AsRef<str>>(
89+
fn screenshot(
9090
&mut self,
9191
renderer: &mut Self::Renderer,
9292
viewport: &Viewport,
9393
background_color: Color,
94-
overlay: &[T],
9594
) -> Vec<u8>;
9695
}
9796

@@ -197,12 +196,11 @@ impl Compositor for () {
197196
Ok(())
198197
}
199198

200-
fn screenshot<T: AsRef<str>>(
199+
fn screenshot(
201200
&mut self,
202201
_renderer: &mut Self::Renderer,
203202
_viewport: &Viewport,
204203
_background_color: Color,
205-
_overlay: &[T],
206204
) -> Vec<u8> {
207205
vec![]
208206
}

renderer/src/compositor.rs

Lines changed: 0 additions & 1 deletion
This file was deleted.

renderer/src/fallback.rs

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ use crate::core::image;
33
use crate::core::renderer;
44
use crate::core::svg;
55
use crate::core::{
6-
self, Background, Color, Image, Point, Rectangle, Size, Svg, Transformation,
6+
self, Background, Color, Font, Image, Pixels, Point, Rectangle, Size, Svg,
7+
Transformation,
78
};
89
use crate::graphics;
910
use crate::graphics::compositor;
@@ -350,29 +351,18 @@ where
350351
}
351352
}
352353

353-
fn screenshot<T: AsRef<str>>(
354+
fn screenshot(
354355
&mut self,
355356
renderer: &mut Self::Renderer,
356357
viewport: &graphics::Viewport,
357358
background_color: Color,
358-
overlay: &[T],
359359
) -> Vec<u8> {
360360
match (self, renderer) {
361361
(Self::Primary(compositor), Renderer::Primary(renderer)) => {
362-
compositor.screenshot(
363-
renderer,
364-
viewport,
365-
background_color,
366-
overlay,
367-
)
362+
compositor.screenshot(renderer, viewport, background_color)
368363
}
369364
(Self::Secondary(compositor), Renderer::Secondary(renderer)) => {
370-
compositor.screenshot(
371-
renderer,
372-
viewport,
373-
background_color,
374-
overlay,
375-
)
365+
compositor.screenshot(renderer, viewport, background_color)
376366
}
377367
_ => unreachable!(),
378368
}
@@ -614,6 +604,41 @@ mod geometry {
614604
}
615605
}
616606

607+
impl<A, B> renderer::Headless for Renderer<A, B>
608+
where
609+
A: renderer::Headless,
610+
B: renderer::Headless,
611+
{
612+
async fn new(
613+
default_font: Font,
614+
default_text_size: Pixels,
615+
) -> Option<Self> {
616+
if let Some(renderer) = A::new(default_font, default_text_size).await {
617+
return Some(Self::Primary(renderer));
618+
}
619+
620+
B::new(default_font, default_text_size)
621+
.await
622+
.map(Self::Secondary)
623+
}
624+
625+
fn screenshot(
626+
&mut self,
627+
size: Size<u32>,
628+
scale_factor: f32,
629+
background_color: Color,
630+
) -> Vec<u8> {
631+
match self {
632+
crate::fallback::Renderer::Primary(renderer) => {
633+
renderer.screenshot(size, scale_factor, background_color)
634+
}
635+
crate::fallback::Renderer::Secondary(renderer) => {
636+
renderer.screenshot(size, scale_factor, background_color)
637+
}
638+
}
639+
}
640+
}
641+
617642
impl<A, B> compositor::Default for Renderer<A, B>
618643
where
619644
A: compositor::Default,

renderer/src/lib.rs

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@ pub type Compositor = renderer::Compositor;
2323

2424
#[cfg(all(feature = "wgpu", feature = "tiny-skia"))]
2525
mod renderer {
26-
use crate::core::renderer;
27-
use crate::core::{Color, Font, Pixels, Size};
28-
2926
pub type Renderer = crate::fallback::Renderer<
3027
iced_wgpu::Renderer,
3128
iced_tiny_skia::Renderer,
@@ -35,31 +32,6 @@ mod renderer {
3532
iced_wgpu::window::Compositor,
3633
iced_tiny_skia::window::Compositor,
3734
>;
38-
39-
impl renderer::Headless for Renderer {
40-
fn new(default_font: Font, default_text_size: Pixels) -> Self {
41-
Self::Secondary(iced_tiny_skia::Renderer::new(
42-
default_font,
43-
default_text_size,
44-
))
45-
}
46-
47-
fn screenshot(
48-
&mut self,
49-
size: Size<u32>,
50-
scale_factor: f32,
51-
background_color: Color,
52-
) -> Vec<u8> {
53-
match self {
54-
crate::fallback::Renderer::Primary(_) => unreachable!(
55-
"iced_wgpu does not support headless mode yet!"
56-
),
57-
crate::fallback::Renderer::Secondary(renderer) => {
58-
renderer.screenshot(size, scale_factor, background_color)
59-
}
60-
}
61-
}
62-
}
6335
}
6436

6537
#[cfg(all(feature = "wgpu", not(feature = "tiny-skia")))]

test/src/lib.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,10 @@ where
186186
load_font(font).expect("Font must be valid");
187187
}
188188

189-
let mut renderer =
190-
Renderer::new(default_font, settings.default_text_size);
189+
let mut renderer = iced_runtime::futures::futures::executor::block_on(
190+
Renderer::new(default_font, settings.default_text_size),
191+
)
192+
.expect("Create new headless renderer");
191193

192194
let raw = UserInterface::build(
193195
element,

tiny_skia/src/lib.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -407,8 +407,11 @@ impl compositor::Default for Renderer {
407407
}
408408

409409
impl renderer::Headless for Renderer {
410-
fn new(default_font: Font, default_text_size: Pixels) -> Self {
411-
Self::new(default_font, default_text_size)
410+
async fn new(
411+
default_font: Font,
412+
default_text_size: Pixels,
413+
) -> Option<Self> {
414+
Some(Self::new(default_font, default_text_size))
412415
}
413416

414417
fn screenshot(
@@ -420,11 +423,6 @@ impl renderer::Headless for Renderer {
420423
let viewport =
421424
Viewport::with_physical_size(size, f64::from(scale_factor));
422425

423-
window::compositor::screenshot::<&str>(
424-
self,
425-
&viewport,
426-
background_color,
427-
&[],
428-
)
426+
window::compositor::screenshot(self, &viewport, background_color)
429427
}
430428
}

0 commit comments

Comments
 (0)