gpui_windows: Force scene rebuild after GPU device recovery
Lukas Wirth
created
Same issue as on Linux: after device recovery clears the atlas, a
WM_PAINT arriving during the 200ms recovery sleep could call
draw_window with force_render=false, which unconditionally called
mark_drawable() (clearing skip_draws) and then presented a stale
scene against the empty atlas.
Fix this by adding a force_render_after_recovery flag to the window
state, set during handle_device_lost. The first draw_window call
after recovery reads this flag and forces a full scene rebuild,
matching the Linux approach.
@@ -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<isize> {
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,