diff --git a/vello/src/lib.rs b/vello/src/lib.rs index acf2a11ce..2ef6f6d22 100644 --- a/vello/src/lib.rs +++ b/vello/src/lib.rs @@ -427,41 +427,49 @@ impl Renderer for VelloRenderer { if self.capture { self.render_capture_image() } else { - if let Ok(surface_texture) = self.surface.surface.get_current_texture() { - self.renderer - .render_to_texture( - &self.device, - &self.queue, - &self.scene, - &self.surface.target_view, - &vello::RenderParams { - base_color: palette::css::TRANSPARENT, // Background color - width: self.surface.config.width, - height: self.surface.config.height, - antialiasing_method: vello::AaConfig::Msaa16, - }, - ) - .unwrap(); - - // Perform the copy - let mut encoder = - self.device - .create_command_encoder(&wgpu::CommandEncoderDescriptor { - label: Some("Surface Blit"), - }); - self.surface.blitter.copy( + let surface_texture = match self.surface.surface.get_current_texture() { + Ok(surface_texture) => surface_texture, + Err(wgpu::SurfaceError::Lost | wgpu::SurfaceError::Outdated) => { + self.surface + .surface + .configure(&self.device, &self.surface.config); + return None; + } + _ => return None, + }; + self.renderer + .render_to_texture( &self.device, - &mut encoder, + &self.queue, + &self.scene, &self.surface.target_view, - &surface_texture - .texture - .create_view(&wgpu::TextureViewDescriptor::default()), - ); - self.queue.submit([encoder.finish()]); + &vello::RenderParams { + base_color: palette::css::TRANSPARENT, // Background color + width: self.surface.config.width, + height: self.surface.config.height, + antialiasing_method: vello::AaConfig::Msaa16, + }, + ) + .unwrap(); + + // Perform the copy + let mut encoder = self + .device + .create_command_encoder(&wgpu::CommandEncoderDescriptor { + label: Some("Surface Blit"), + }); + self.surface.blitter.copy( + &self.device, + &mut encoder, + &self.surface.target_view, + &surface_texture + .texture + .create_view(&wgpu::TextureViewDescriptor::default()), + ); + self.queue.submit([encoder.finish()]); - // Queue the texture to be presented on the surface - surface_texture.present(); - } + // Queue the texture to be presented on the surface + surface_texture.present(); None } } diff --git a/vger/src/lib.rs b/vger/src/lib.rs index 14e0c4b61..f18fb172e 100644 --- a/vger/src/lib.rs +++ b/vger/src/lib.rs @@ -710,29 +710,35 @@ impl Renderer for VgerRenderer { if self.capture { self.render_image() } else { - if let Ok(frame) = self.surface.get_current_texture() { - let texture_view = frame - .texture - .create_view(&wgpu::TextureViewDescriptor::default()); - let desc = wgpu::RenderPassDescriptor { - label: None, - color_attachments: &[Some(wgpu::RenderPassColorAttachment { - view: &texture_view, - resolve_target: None, - ops: wgpu::Operations { - load: wgpu::LoadOp::Clear(wgpu::Color::TRANSPARENT), - store: StoreOp::Store, - }, - depth_slice: None, - })], - depth_stencil_attachment: None, - timestamp_writes: None, - occlusion_query_set: None, - }; - - self.vger.encode(&desc); - frame.present(); - } + let frame = match self.surface.get_current_texture() { + Ok(frame) => frame, + Err(wgpu::SurfaceError::Lost | wgpu::SurfaceError::Outdated) => { + self.surface.configure(&self.device, &self.config); + return None; + } + _ => return None, + }; + let texture_view = frame + .texture + .create_view(&wgpu::TextureViewDescriptor::default()); + let desc = wgpu::RenderPassDescriptor { + label: None, + color_attachments: &[Some(wgpu::RenderPassColorAttachment { + view: &texture_view, + resolve_target: None, + ops: wgpu::Operations { + load: wgpu::LoadOp::Clear(wgpu::Color::TRANSPARENT), + store: StoreOp::Store, + }, + depth_slice: None, + })], + depth_stencil_attachment: None, + timestamp_writes: None, + occlusion_query_set: None, + }; + + self.vger.encode(&desc); + frame.present(); None } }