Skip to content

Commit e060129

Browse files
committed
Merge branch 'master' into beacon
2 parents 121102e + ced4276 commit e060129

30 files changed

Lines changed: 874 additions & 592 deletions

File tree

.github/workflows/test.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ jobs:
55
runs-on: ${{ matrix.os }}
66
env:
77
RUSTFLAGS: --deny warnings
8+
ICED_TEST_BACKEND: tiny-skia
89
strategy:
910
matrix:
1011
os: [ubuntu-latest, windows-latest, macOS-latest]

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,23 +133,13 @@ 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(
143-
&mut engine,
144-
device,
145-
queue,
146-
&mut encoder,
136+
let submission = renderer.present(
147137
Some(Color::BLACK),
148138
format,
149139
&texture_view,
150140
&viewport,
151141
);
152142

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

156145
i += 1;

core/src/renderer.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,19 @@ 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+
backend: Option<&str>,
113+
) -> impl Future<Output = Option<Self>>
114+
where
115+
Self: Sized;
116+
117+
/// Returns the unique name of the renderer.
118+
///
119+
/// This name may be used by testing libraries to uniquely identify
120+
/// snapshots.
121+
fn name(&self) -> String;
110122

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

examples/integration/src/main.rs

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,9 @@ pub fn main() -> Result<(), winit::error::EventLoopError> {
3636
Loading,
3737
Ready {
3838
window: Arc<winit::window::Window>,
39-
device: wgpu::Device,
40-
queue: wgpu::Queue,
4139
surface: wgpu::Surface<'static>,
4240
format: wgpu::TextureFormat,
43-
engine: Engine,
41+
device: wgpu::Device,
4442
renderer: Renderer,
4543
scene: Scene,
4644
controls: Controls,
@@ -146,25 +144,26 @@ pub fn main() -> Result<(), winit::error::EventLoopError> {
146144
let controls = Controls::new();
147145

148146
// Initialize iced
149-
let engine =
150-
Engine::new(&adapter, &device, &queue, format, None);
151-
let renderer = Renderer::new(
152-
&device,
153-
&engine,
154-
Font::default(),
155-
Pixels::from(16),
156-
);
147+
let renderer = {
148+
let engine = Engine::new(
149+
&adapter,
150+
device.clone(),
151+
queue,
152+
format,
153+
None,
154+
);
155+
156+
Renderer::new(engine, Font::default(), Pixels::from(16))
157+
};
157158

158159
// You should change this if you want to render continuously
159160
event_loop.set_control_flow(ControlFlow::Wait);
160161

161162
*self = Self::Ready {
162163
window,
163-
device,
164-
queue,
165164
surface,
166165
format,
167-
engine,
166+
device,
168167
renderer,
169168
scene,
170169
controls,
@@ -188,10 +187,8 @@ pub fn main() -> Result<(), winit::error::EventLoopError> {
188187
let Self::Ready {
189188
window,
190189
device,
191-
queue,
192190
surface,
193191
format,
194-
engine,
195192
renderer,
196193
scene,
197194
controls,
@@ -285,18 +282,13 @@ pub fn main() -> Result<(), winit::error::EventLoopError> {
285282
*cache = interface.into_cache();
286283

287284
renderer.present(
288-
engine,
289-
device,
290-
queue,
291-
&mut encoder,
292285
None,
293286
frame.texture.format(),
294287
&view,
295288
viewport,
296289
);
297290

298291
// Then we submit the work
299-
engine.submit(queue, encoder);
300292
frame.present();
301293

302294
// Update the mouse cursor

examples/multi_window/src/main.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use iced::widget::{
2-
button, center, center_x, column, horizontal_space, scrollable, text,
3-
text_input,
2+
button, center, center_x, column, container, horizontal_space, scrollable,
3+
text, text_input,
44
};
55
use iced::window;
66
use iced::{
@@ -189,13 +189,12 @@ impl Window {
189189
let new_window_button =
190190
button(text("New Window")).on_press(Message::OpenWindow);
191191

192-
let content = scrollable(
193-
column![scale_input, title_input, new_window_button]
194-
.spacing(50)
195-
.width(Fill)
196-
.align_x(Center),
197-
);
192+
let content = column![scale_input, title_input, new_window_button]
193+
.spacing(50)
194+
.width(Fill)
195+
.align_x(Center)
196+
.width(200);
198197

199-
center_x(content).width(200).into()
198+
container(scrollable(center_x(content))).padding(10).into()
200199
}
201200
}

examples/todos/snapshots/creates_a_new_task.sha256 renamed to examples/todos/snapshots/creates_a_new_task-tiny-skia.sha256

File renamed without changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
804a1bb6d49e3b3158463202960447d9e7820b967280f41dd0c34c00d3edf2c3

graphics/src/compositor.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ pub trait Compositor: Sized {
7979
surface: &mut Self::Surface,
8080
viewport: &Viewport,
8181
background_color: Color,
82+
on_pre_present: impl FnOnce(),
8283
) -> Result<(), SurfaceError>;
8384

8485
/// Screenshots the current [`Renderer`] primitives to an offscreen texture, and returns the bytes of
@@ -190,6 +191,7 @@ impl Compositor for () {
190191
_surface: &mut Self::Surface,
191192
_viewport: &Viewport,
192193
_background_color: Color,
194+
_on_pre_present: impl FnOnce(),
193195
) -> Result<(), SurfaceError> {
194196
Ok(())
195197
}

renderer/src/fallback.rs

Lines changed: 47 additions & 1 deletion
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;
@@ -321,6 +322,7 @@ where
321322
surface: &mut Self::Surface,
322323
viewport: &graphics::Viewport,
323324
background_color: Color,
325+
on_pre_present: impl FnOnce(),
324326
) -> Result<(), compositor::SurfaceError> {
325327
match (self, renderer, surface) {
326328
(
@@ -332,6 +334,7 @@ where
332334
surface,
333335
viewport,
334336
background_color,
337+
on_pre_present,
335338
),
336339
(
337340
Self::Secondary(compositor),
@@ -342,6 +345,7 @@ where
342345
surface,
343346
viewport,
344347
background_color,
348+
on_pre_present,
345349
),
346350
_ => unreachable!(),
347351
}
@@ -600,6 +604,48 @@ mod geometry {
600604
}
601605
}
602606

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+
backend: Option<&str>,
616+
) -> Option<Self> {
617+
if let Some(renderer) =
618+
A::new(default_font, default_text_size, backend).await
619+
{
620+
return Some(Self::Primary(renderer));
621+
}
622+
623+
B::new(default_font, default_text_size, backend)
624+
.await
625+
.map(Self::Secondary)
626+
}
627+
628+
fn name(&self) -> String {
629+
delegate!(self, renderer, renderer.name())
630+
}
631+
632+
fn screenshot(
633+
&mut self,
634+
size: Size<u32>,
635+
scale_factor: f32,
636+
background_color: Color,
637+
) -> Vec<u8> {
638+
match self {
639+
crate::fallback::Renderer::Primary(renderer) => {
640+
renderer.screenshot(size, scale_factor, background_color)
641+
}
642+
crate::fallback::Renderer::Secondary(renderer) => {
643+
renderer.screenshot(size, scale_factor, background_color)
644+
}
645+
}
646+
}
647+
}
648+
603649
impl<A, B> compositor::Default for Renderer<A, B>
604650
where
605651
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")))]

0 commit comments

Comments
 (0)