diff --git a/crates/gpui_windows/src/events.rs b/crates/gpui_windows/src/events.rs index 3506ae2a2cc22d57c4cefba1a4c5a1850c411453..b039fc3f9cd4ef2b8bd11dc0e0f424d790e2e97d 100644 --- a/crates/gpui_windows/src/events.rs +++ b/crates/gpui_windows/src/events.rs @@ -1136,6 +1136,7 @@ impl WindowsWindowInner { { panic!("Device lost: {err}"); } + self.state.force_render_after_recovery.set(true); Some(0) } @@ -1143,10 +1144,12 @@ impl WindowsWindowInner { fn draw_window(&self, handle: HWND, force_render: bool) -> Option { let mut request_frame = self.state.callbacks.request_frame.take()?; - // we are instructing gpui to force render a frame, this will - // re-populate all the gpu textures for us so we can resume drawing in - // case we disabled drawing earlier due to a device loss - self.state.renderer.borrow_mut().mark_drawable(); + let force_render = force_render || self.state.force_render_after_recovery.take(); + if force_render { + // Re-enable drawing after a device loss recovery. The forced render + // will rebuild the scene with fresh atlas textures. + self.state.renderer.borrow_mut().mark_drawable(); + } request_frame(RequestFrameOptions { require_presentation: false, force_render, diff --git a/crates/gpui_windows/src/window.rs b/crates/gpui_windows/src/window.rs index 62e88c47dfc10fedf6d636e2c6d6cbdcdc2e37c5..e5dc37e74d5956a0d1a0501d26b4edec30762910 100644 --- a/crates/gpui_windows/src/window.rs +++ b/crates/gpui_windows/src/window.rs @@ -59,6 +59,7 @@ pub struct WindowsWindowState { pub hovered: Cell, pub renderer: RefCell, + pub force_render_after_recovery: Cell, pub click_state: ClickState, pub current_cursor: Cell>, @@ -149,6 +150,7 @@ impl WindowsWindowState { last_reported_capslock: Cell::new(last_reported_capslock), hovered: Cell::new(hovered), renderer: RefCell::new(renderer), + force_render_after_recovery: Cell::new(false), click_state, current_cursor: Cell::new(current_cursor), nc_button_pressed: Cell::new(nc_button_pressed),