Skip to content

Commit 938c56a

Browse files
teh-cmcemilk
andcommitted
wgpu backend: do not try to render zero-sized surfaces (#2313)
* wgpu backend: do not try to render zero-sized surfaces * reverse if Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
1 parent 05e183f commit 938c56a

File tree

1 file changed

+63
-52
lines changed

1 file changed

+63
-52
lines changed

crates/eframe/src/web/web_painter_wgpu.rs

+63-52
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ impl WebPainter for WebPainterWgpu {
102102
pixels_per_point: f32,
103103
textures_delta: &egui::TexturesDelta,
104104
) -> Result<(), JsValue> {
105+
let size_in_pixels = [self.canvas.width(), self.canvas.height()];
106+
105107
let render_state = if let Some(render_state) = &self.render_state {
106108
render_state
107109
} else {
@@ -110,32 +112,6 @@ impl WebPainter for WebPainterWgpu {
110112
));
111113
};
112114

113-
// Resize surface if needed
114-
let size_in_pixels = [self.canvas.width(), self.canvas.height()];
115-
if size_in_pixels[0] != self.surface_configuration.width
116-
|| size_in_pixels[1] != self.surface_configuration.height
117-
{
118-
self.surface_configuration.width = size_in_pixels[0];
119-
self.surface_configuration.height = size_in_pixels[1];
120-
self.surface
121-
.configure(&render_state.device, &self.surface_configuration);
122-
}
123-
124-
let frame = match self.surface.get_current_texture() {
125-
Ok(frame) => frame,
126-
#[allow(clippy::single_match_else)]
127-
Err(e) => match (*self.on_surface_error)(e) {
128-
SurfaceErrorAction::RecreateSurface => {
129-
self.surface
130-
.configure(&render_state.device, &self.surface_configuration);
131-
return Ok(());
132-
}
133-
SurfaceErrorAction::SkipFrame => {
134-
return Ok(());
135-
}
136-
},
137-
};
138-
139115
let mut encoder =
140116
render_state
141117
.device
@@ -169,31 +145,63 @@ impl WebPainter for WebPainterWgpu {
169145
)
170146
};
171147

172-
{
173-
let renderer = render_state.renderer.read();
174-
let frame_view = frame
175-
.texture
176-
.create_view(&wgpu::TextureViewDescriptor::default());
177-
let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
178-
color_attachments: &[Some(wgpu::RenderPassColorAttachment {
179-
view: &frame_view,
180-
resolve_target: None,
181-
ops: wgpu::Operations {
182-
load: wgpu::LoadOp::Clear(wgpu::Color {
183-
r: clear_color.r() as f64,
184-
g: clear_color.g() as f64,
185-
b: clear_color.b() as f64,
186-
a: clear_color.a() as f64,
187-
}),
188-
store: true,
189-
},
190-
})],
191-
depth_stencil_attachment: None,
192-
label: Some("egui_render"),
193-
});
194-
195-
renderer.render(&mut render_pass, clipped_primitives, &screen_descriptor);
196-
}
148+
// Resize surface if needed
149+
let is_zero_sized_surface = size_in_pixels[0] == 0 || size_in_pixels[1] == 0;
150+
let frame = if is_zero_sized_surface {
151+
None
152+
} else {
153+
if size_in_pixels[0] != self.surface_configuration.width
154+
|| size_in_pixels[1] != self.surface_configuration.height
155+
{
156+
self.surface_configuration.width = size_in_pixels[0];
157+
self.surface_configuration.height = size_in_pixels[1];
158+
self.surface
159+
.configure(&render_state.device, &self.surface_configuration);
160+
}
161+
162+
let frame = match self.surface.get_current_texture() {
163+
Ok(frame) => frame,
164+
#[allow(clippy::single_match_else)]
165+
Err(e) => match (*self.on_surface_error)(e) {
166+
SurfaceErrorAction::RecreateSurface => {
167+
self.surface
168+
.configure(&render_state.device, &self.surface_configuration);
169+
return Ok(());
170+
}
171+
SurfaceErrorAction::SkipFrame => {
172+
return Ok(());
173+
}
174+
},
175+
};
176+
177+
{
178+
let renderer = render_state.renderer.read();
179+
let frame_view = frame
180+
.texture
181+
.create_view(&wgpu::TextureViewDescriptor::default());
182+
let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
183+
color_attachments: &[Some(wgpu::RenderPassColorAttachment {
184+
view: &frame_view,
185+
resolve_target: None,
186+
ops: wgpu::Operations {
187+
load: wgpu::LoadOp::Clear(wgpu::Color {
188+
r: clear_color.r() as f64,
189+
g: clear_color.g() as f64,
190+
b: clear_color.b() as f64,
191+
a: clear_color.a() as f64,
192+
}),
193+
store: true,
194+
},
195+
})],
196+
depth_stencil_attachment: None,
197+
label: Some("egui_render"),
198+
});
199+
200+
renderer.render(&mut render_pass, clipped_primitives, &screen_descriptor);
201+
}
202+
203+
Some(frame)
204+
};
197205

198206
{
199207
let mut renderer = render_state.renderer.write();
@@ -208,7 +216,10 @@ impl WebPainter for WebPainterWgpu {
208216
.into_iter()
209217
.chain(std::iter::once(encoder.finish())),
210218
);
211-
frame.present();
219+
220+
if let Some(frame) = frame {
221+
frame.present();
222+
}
212223

213224
Ok(())
214225
}

0 commit comments

Comments
 (0)