diff options
author | 2021-07-22 13:23:36 -0500 | |
---|---|---|
committer | 2021-07-22 13:23:36 -0500 | |
commit | e5010b8ab87b2e30feea366396bc060c8e793d8d (patch) | |
tree | 73738efeafd4cf4151a9adb7523a31c848fa0cae | |
parent | a7d2834a6d15466eecca29bb6357d3539cb652cd (diff) | |
download | iced-e5010b8ab87b2e30feea366396bc060c8e793d8d.tar.gz iced-e5010b8ab87b2e30feea366396bc060c8e793d8d.tar.bz2 iced-e5010b8ab87b2e30feea366396bc060c8e793d8d.zip |
redo custom error for Compositor::draw()
-rw-r--r-- | graphics/src/window.rs | 2 | ||||
-rw-r--r-- | graphics/src/window/compositor.rs | 41 | ||||
-rw-r--r-- | wgpu/src/window/compositor.rs | 64 | ||||
-rw-r--r-- | winit/src/application.rs | 12 |
4 files changed, 63 insertions, 56 deletions
diff --git a/graphics/src/window.rs b/graphics/src/window.rs index 6813643d..365ddfbc 100644 --- a/graphics/src/window.rs +++ b/graphics/src/window.rs @@ -4,7 +4,7 @@ mod compositor; #[cfg(feature = "opengl")] mod gl_compositor; -pub use compositor::{Compositor, CompositorDrawError}; +pub use compositor::{Compositor, SwapChainError}; #[cfg(feature = "opengl")] pub use gl_compositor::GLCompositor; diff --git a/graphics/src/window/compositor.rs b/graphics/src/window/compositor.rs index 9f7cb43f..9811d95d 100644 --- a/graphics/src/window/compositor.rs +++ b/graphics/src/window/compositor.rs @@ -52,33 +52,32 @@ pub trait Compositor: Sized { background_color: Color, output: &<Self::Renderer as iced_native::Renderer>::Output, overlay: &[T], - ) -> Result<mouse::Interaction, CompositorDrawError>; + ) -> Result<mouse::Interaction, SwapChainError>; } /// Result of an unsuccessful call to [`Compositor::draw`]. -#[derive(Debug)] -pub enum CompositorDrawError { - /// The swapchain is outdated. Try rendering again next frame. - SwapchainOutdated(Box<dyn std::error::Error>), - /// A fatal swapchain error occured. Rendering cannot continue. - FatalSwapchainError(Box<dyn std::error::Error>), +/// Result of an unsuccessful call to [`SwapChain::get_current_frame`]. +#[derive(Clone, PartialEq, Eq, Debug)] +pub enum SwapChainError { + /// A timeout was encountered while trying to acquire the next frame. + Timeout, + /// The underlying surface has changed, and therefore the swap chain must be updated. + Outdated, + /// The swap chain has been lost and needs to be recreated. + Lost, + /// There is no more memory left to allocate a new frame. + OutOfMemory, } -impl std::error::Error for CompositorDrawError {} +impl std::error::Error for SwapChainError {} -impl std::fmt::Display for CompositorDrawError { +impl std::fmt::Display for SwapChainError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - CompositorDrawError::SwapchainOutdated(e) => write!( - f, - "Swapchain is outdated: {}. Try rendering next frame.", - e - ), - CompositorDrawError::FatalSwapchainError(e) => write!( - f, - "Fatal swapchain error: {}. Rendering cannot continue.", - e - ), - } + write!(f, "{}", match self { + Self::Timeout => "A timeout was encountered while trying to acquire the next frame", + Self::Outdated => "The underlying surface has changed, and therefore the swap chain must be updated", + Self::Lost => "The swap chain has been lost and needs to be recreated", + Self::OutOfMemory => "There is no more memory left to allocate a new frame", + }) } } diff --git a/wgpu/src/window/compositor.rs b/wgpu/src/window/compositor.rs index fd8fec6e..fb25fca4 100644 --- a/wgpu/src/window/compositor.rs +++ b/wgpu/src/window/compositor.rs @@ -135,8 +135,7 @@ impl iced_graphics::window::Compositor for Compositor { background_color: Color, output: &<Self::Renderer as iced_native::Renderer>::Output, overlay: &[T], - ) -> Result<mouse::Interaction, iced_graphics::window::CompositorDrawError> - { + ) -> Result<mouse::Interaction, iced_graphics::window::SwapChainError> { match swap_chain.get_current_frame() { Ok(frame) => { let mut encoder = self.device.create_command_encoder( @@ -145,27 +144,31 @@ impl iced_graphics::window::Compositor for Compositor { }, ); - let _ = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { - label: Some("iced_wgpu::window::Compositor render pass"), - color_attachments: &[wgpu::RenderPassColorAttachment { - view: &frame.output.view, - resolve_target: None, - ops: wgpu::Operations { - load: wgpu::LoadOp::Clear({ - let [r, g, b, a] = background_color.into_linear(); - - wgpu::Color { - r: f64::from(r), - g: f64::from(g), - b: f64::from(b), - a: f64::from(a), - } - }), - store: true, - }, - }], - depth_stencil_attachment: None, - }); + let _ = + encoder.begin_render_pass(&wgpu::RenderPassDescriptor { + label: Some( + "iced_wgpu::window::Compositor render pass", + ), + color_attachments: &[wgpu::RenderPassColorAttachment { + view: &frame.output.view, + resolve_target: None, + ops: wgpu::Operations { + load: wgpu::LoadOp::Clear({ + let [r, g, b, a] = + background_color.into_linear(); + + wgpu::Color { + r: f64::from(r), + g: f64::from(g), + b: f64::from(b), + a: f64::from(a), + } + }), + store: true, + }, + }], + depth_stencil_attachment: None, + }); let mouse_interaction = renderer.backend_mut().draw( &mut self.device, @@ -192,12 +195,17 @@ impl iced_graphics::window::Compositor for Compositor { Ok(mouse_interaction) } Err(error) => match error { - wgpu::SwapChainError::OutOfMemory => { - Err(iced_graphics::window::CompositorDrawError::FatalSwapchainError(Box::new(error))) + wgpu::SwapChainError::Timeout => { + Err(iced_graphics::window::SwapChainError::Timeout) + } + wgpu::SwapChainError::Outdated => { + Err(iced_graphics::window::SwapChainError::Outdated) } - _ => { - // Try again next frame. - Err(iced_graphics::window::CompositorDrawError::SwapchainOutdated(Box::new(error))) + wgpu::SwapChainError::Lost => { + Err(iced_graphics::window::SwapChainError::Lost) + } + wgpu::SwapChainError::OutOfMemory => { + Err(iced_graphics::window::SwapChainError::OutOfMemory) } }, } diff --git a/winit/src/application.rs b/winit/src/application.rs index b04fc609..1d32a5f3 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -391,16 +391,16 @@ async fn run_instance<A, E, C>( // Maybe we can use `ControlFlow::WaitUntil` for this. } Err(error) => match error { - window::CompositorDrawError::SwapchainOutdated(_) => { + // This is an unrecoverable error. + window::SwapChainError::OutOfMemory => { + panic!("{}", error); + } + _ => { debug.render_finished(); - // Swapchain is outdated. Try rendering again next frame. + // Try rendering again next frame. window.request_redraw(); } - window::CompositorDrawError::FatalSwapchainError(e) => { - // Fatal swapchain error. Rendering cannot continue. - panic!("{}", e); - } }, } } |