From a7d2834a6d15466eecca29bb6357d3539cb652cd Mon Sep 17 00:00:00 2001
From: Billy Messenger <BillyDM@tutamail.com>
Date: Thu, 22 Jul 2021 13:08:13 -0500
Subject: add custom error for Compositor::draw()

---
 winit/src/application.rs | 41 ++++++++++++++++++++++++++---------------
 1 file changed, 26 insertions(+), 15 deletions(-)

(limited to 'winit/src')

diff --git a/winit/src/application.rs b/winit/src/application.rs
index 903d03e2..b04fc609 100644
--- a/winit/src/application.rs
+++ b/winit/src/application.rs
@@ -366,7 +366,7 @@ async fn run_instance<A, E, C>(
                     viewport_version = current_viewport_version;
                 }
 
-                if let Ok(new_mouse_interaction) = compositor.draw(
+                match compositor.draw(
                     &mut renderer,
                     &mut swap_chain,
                     state.viewport(),
@@ -374,23 +374,34 @@ async fn run_instance<A, E, C>(
                     &primitive,
                     &debug.overlay(),
                 ) {
-                    debug.render_finished();
+                    Ok(new_mouse_interaction) => {
+                        debug.render_finished();
 
-                    if new_mouse_interaction != mouse_interaction {
-                        window.set_cursor_icon(conversion::mouse_interaction(
-                            new_mouse_interaction,
-                        ));
+                        if new_mouse_interaction != mouse_interaction {
+                            window.set_cursor_icon(
+                                conversion::mouse_interaction(
+                                    new_mouse_interaction,
+                                ),
+                            );
 
-                        mouse_interaction = new_mouse_interaction;
-                    }
-
-                // TODO: Handle animations!
-                // Maybe we can use `ControlFlow::WaitUntil` for this.
-                } else {
-                    debug.render_finished();
+                            mouse_interaction = new_mouse_interaction;
+                        }
 
-                    // Rendering could not complete, try again next frame.
-                    window.request_redraw();
+                        // TODO: Handle animations!
+                        // Maybe we can use `ControlFlow::WaitUntil` for this.
+                    }
+                    Err(error) => match error {
+                        window::CompositorDrawError::SwapchainOutdated(_) => {
+                            debug.render_finished();
+
+                            // Swapchain is outdated. Try rendering again next frame.
+                            window.request_redraw();
+                        }
+                        window::CompositorDrawError::FatalSwapchainError(e) => {
+                            // Fatal swapchain error. Rendering cannot continue.
+                            panic!("{}", e);
+                        }
+                    },
                 }
             }
             event::Event::WindowEvent {
-- 
cgit