core: disable EGL vsync throttling on new surfaces

With the default swap interval of 1, eglSwapBuffers blocks until
the compositor sends wl_buffer.release. When a monitor is DPMS-off,
the compositor never releases the buffer, stalling the main thread
indefinitely. This prevents authentication from completing and
leaves the lock screen frozen.

Set the swap interval to 0 on each new EGL surface so swaps are
non-blocking. Frame pacing is already controlled by wl_surface.frame
callbacks, so this does not cause unbounded rendering.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Tristan Bull 2026-05-05 10:53:31 -07:00
parent 37f615cff7
commit 9b5bf2d1e5

View file

@ -105,6 +105,13 @@ void CSessionLockSurface::configure(const Vector2D& size_, uint32_t serial_) {
readyForFrame = false;
return;
}
// Disable vsync throttling so eglSwapBuffers never blocks waiting for
// wl_buffer.release. Without this, a DPMS-off monitor can stall the main
// thread indefinitely because the compositor never releases the buffer.
// Rendering rate is already governed by wl_surface.frame callbacks.
g_pEGL->makeCurrent(eglSurface);
eglSwapInterval(g_pEGL->eglDisplay, 0);
}
if (readyForFrame && !(SAMESIZE && SAMESCALE)) {