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>
This commit is contained in:
Clement Rey 2022-11-16 18:03:57 +01:00 committed by GitHub
parent 9268f43896
commit f7019926dc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -102,6 +102,8 @@ impl WebPainter for WebPainterWgpu {
pixels_per_point: f32, pixels_per_point: f32,
textures_delta: &egui::TexturesDelta, textures_delta: &egui::TexturesDelta,
) -> Result<(), JsValue> { ) -> Result<(), JsValue> {
let size_in_pixels = [self.canvas.width(), self.canvas.height()];
let render_state = if let Some(render_state) = &self.render_state { let render_state = if let Some(render_state) = &self.render_state {
render_state render_state
} else { } else {
@ -110,32 +112,6 @@ impl WebPainter for WebPainterWgpu {
)); ));
}; };
// Resize surface if needed
let size_in_pixels = [self.canvas.width(), self.canvas.height()];
if size_in_pixels[0] != self.surface_configuration.width
|| size_in_pixels[1] != self.surface_configuration.height
{
self.surface_configuration.width = size_in_pixels[0];
self.surface_configuration.height = size_in_pixels[1];
self.surface
.configure(&render_state.device, &self.surface_configuration);
}
let frame = match self.surface.get_current_texture() {
Ok(frame) => frame,
#[allow(clippy::single_match_else)]
Err(e) => match (*self.on_surface_error)(e) {
SurfaceErrorAction::RecreateSurface => {
self.surface
.configure(&render_state.device, &self.surface_configuration);
return Ok(());
}
SurfaceErrorAction::SkipFrame => {
return Ok(());
}
},
};
let mut encoder = let mut encoder =
render_state render_state
.device .device
@ -169,6 +145,35 @@ impl WebPainter for WebPainterWgpu {
) )
}; };
// Resize surface if needed
let is_zero_sized_surface = size_in_pixels[0] == 0 || size_in_pixels[1] == 0;
let frame = if is_zero_sized_surface {
None
} else {
if size_in_pixels[0] != self.surface_configuration.width
|| size_in_pixels[1] != self.surface_configuration.height
{
self.surface_configuration.width = size_in_pixels[0];
self.surface_configuration.height = size_in_pixels[1];
self.surface
.configure(&render_state.device, &self.surface_configuration);
}
let frame = match self.surface.get_current_texture() {
Ok(frame) => frame,
#[allow(clippy::single_match_else)]
Err(e) => match (*self.on_surface_error)(e) {
SurfaceErrorAction::RecreateSurface => {
self.surface
.configure(&render_state.device, &self.surface_configuration);
return Ok(());
}
SurfaceErrorAction::SkipFrame => {
return Ok(());
}
},
};
{ {
let renderer = render_state.renderer.read(); let renderer = render_state.renderer.read();
let frame_view = frame let frame_view = frame
@ -195,6 +200,9 @@ impl WebPainter for WebPainterWgpu {
renderer.render(&mut render_pass, clipped_primitives, &screen_descriptor); renderer.render(&mut render_pass, clipped_primitives, &screen_descriptor);
} }
Some(frame)
};
{ {
let mut renderer = render_state.renderer.write(); let mut renderer = render_state.renderer.write();
for id in &textures_delta.free { for id in &textures_delta.free {
@ -208,7 +216,10 @@ impl WebPainter for WebPainterWgpu {
.into_iter() .into_iter()
.chain(std::iter::once(encoder.finish())), .chain(std::iter::once(encoder.finish())),
); );
if let Some(frame) = frame {
frame.present(); frame.present();
}
Ok(()) Ok(())
} }