summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Billy Messenger <BillyDM@tutamail.com>2021-07-22 13:23:36 -0500
committerLibravatar Billy Messenger <BillyDM@tutamail.com>2021-07-22 13:23:36 -0500
commite5010b8ab87b2e30feea366396bc060c8e793d8d (patch)
tree73738efeafd4cf4151a9adb7523a31c848fa0cae
parenta7d2834a6d15466eecca29bb6357d3539cb652cd (diff)
downloadiced-e5010b8ab87b2e30feea366396bc060c8e793d8d.tar.gz
iced-e5010b8ab87b2e30feea366396bc060c8e793d8d.tar.bz2
iced-e5010b8ab87b2e30feea366396bc060c8e793d8d.zip
redo custom error for Compositor::draw()
-rw-r--r--graphics/src/window.rs2
-rw-r--r--graphics/src/window/compositor.rs41
-rw-r--r--wgpu/src/window/compositor.rs64
-rw-r--r--winit/src/application.rs12
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);
- }
},
}
}