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); -                        }                      },                  }              }  | 
