Summary
When Surface::get_current_texture returns Lost, the surface is no longer valid for the current swap chain. The correct recovery path is to reconfigure (or recreate) the surface without necessarily discarding the adapter or device. Only if reconfiguration fails because the adapter no longer supports the surface do you need to pick a new adapter/device.
Root Cause
- The operating system has destroyed the underlying swap‑chain resources (e.g., window resize, display mode change, driver reset).
wgpupropagates this as aSurfaceError::Lost.- The surface’s configuration becomes stale, but the logical device and adapter remain usable.
Why This Happens in Real Systems
- Window events such as minimization, moving between monitors, or DPI changes can trigger an implicit swap‑chain loss.
- GPU driver resets or power‑state transitions (sleep/resume) also invalidate the swap chain.
- Cross‑platform abstractions (Vulkan, DX12, Metal) each have their own “surface lost” semantics, which
wgpunormalizes intoLost.
Real-World Impact
- Rendering loops that ignore
Lostwill panic or silently drop frames. - Mis‑interpreting the error as a device failure leads to unnecessary device recreation, causing:
- Long stalls while GPU pipelines are rebuilt.
- Resource leaks if old resources are not correctly dropped.
- Visible flicker or blank windows for the user.
Example or Code (if necessary and relevant)
match surface.get_current_texture() {
Ok(frame) => {
// normal rendering path
}
Err(wgpu::SurfaceError::Lost) => {
// Reconfigure the surface with the same device
surface.configure(&device, &config);
}
Err(wgpu::SurfaceError::OutOfMemory) => {
// Fatal – terminate or fallback
panic!("Out of memory");
}
Err(wgpu::SurfaceError::Timeout) => {
// Skip this frame, try again next loop
}
}
How Senior Engineers Fix It
- Detect
Lostand immediately callsurface.configure(orsurface.reconfigure) with the existing device and a freshSurfaceConfiguration. - Validate the reconfiguration result; if it returns an error, fall back to:
- Query
adapter.get_surface_supportto ensure the adapter still supports the surface. - If unsupported, request a new adapter from the instance and recreate the device.
- Re‑create the surface if the window handle changed.
- Query
- Encapsulate this logic in a reusable helper so the main render loop stays clean.
- Log the occurrence with context (window size, DPI, platform) to aid post‑mortem analysis.
Why Juniors Miss It
- Confusing documentation: many tutorials skip error handling or treat every error as fatal.
- Assuming “lost” means device loss, leading to the costly habit of tearing down the whole graphics stack.
- Lack of experience with swap‑chain lifecycle on different OSes, so they don’t anticipate window‑event‑driven surface loss.
- Skipping defensive checks after
configure, which hides the need to fallback to a new adapter.