Skip to content

gpui: Prefer Mailbox present mode on Wayland to avoid FIFO stalls#57077

Merged
NeelChotai merged 2 commits into
zed-industries:mainfrom
higorprado:main
May 19, 2026
Merged

gpui: Prefer Mailbox present mode on Wayland to avoid FIFO stalls#57077
NeelChotai merged 2 commits into
zed-industries:mainfrom
higorprado:main

Conversation

@higorprado

@higorprado higorprado commented May 18, 2026

Copy link
Copy Markdown
Contributor

The WgpuRenderer defaults to VK_PRESENT_MODE_FIFO_KHR (vsync), which blocks vkQueuePresentKHR until the compositor releases a buffer via wl_surface.frame. On some Wayland compositor+driver combinations (notably NVIDIA proprietary + Hyprland, but also observed on KDE/GNOME + AMD RADV), these frame callbacks can be delayed or lost, stalling the entire calloop event loop for tens of seconds.

VK_PRESENT_MODE_MAILBOX_KHR does not block on vblank: it replaces the pending frame in a single-entry queue. This avoids the stall entirely. The renderer already falls back to Fifo automatically if Mailbox is unsupported by the driver.

The WgpuSurfaceConfig has had a preferred_present_mode field since #50815 (added for Android lifecycle transitions with the same rationale). This commit sets it to Mailbox in the Wayland window creation path only. X11 is not affected.

Self-Review Checklist:

  • I've reviewed my own diff for quality, security, and reliability
  • Unsafe blocks (if any) have justifying comments
  • The content is consistent with the UI/UX checklist
  • Tests cover the new/changed behavior
  • Performance impact has been considered and is acceptable

Note on tests: This change is in the Wayland platform's window creation path (WaylandWindowState::new). The surface configuration is delegated to WgpuRenderer which already has test coverage for preferred_present_mode fallback logic. A full integration test would require a running Wayland compositor in CI. Verified manually and tested against the renderer's unwrap_or(Fifo) safety net by inspecting surface_caps.present_modes on both NVIDIA proprietary and Mesa RADV drivers.

Closes: #50229
Closes: #55345
Closes: #39097
Closes: #50734

Refs: #38497, #52009, #52403, #50574, #49961, #47750, #46203, #50195, #50283, #42164, #39156, #39234, #35948, #32618

Release Notes:

  • Fixed UI freezes on Linux (Wayland) when on certain GPU/driver combinations

The WgpuRenderer defaults to VK_PRESENT_MODE_FIFO_KHR (vsync),
which blocks vkQueuePresentKHR until the compositor releases a
buffer via wl_surface.frame. On some Wayland compositor+driver
combinations (notably NVIDIA proprietary + Hyprland, but also
observed on KDE/GNOME + AMD RADV), these frame callbacks can be
delayed or lost, stalling the entire calloop event loop for
tens of seconds.

VK_PRESENT_MODE_MAILBOX_KHR does not block on vblank — it
replaces the pending frame in a single-entry queue. This avoids
the stall entirely. The renderer already falls back to Fifo
automatically if Mailbox is unsupported by the driver.

The WgpuSurfaceConfig has had a preferred_present_mode field
since zed-industries#50815 (added for Android lifecycle transitions with the
same rationale). This commit sets it to Mailbox in the Wayland
window creation path only. X11 is not affected.

Closes: zed-industries#50229
Closes: zed-industries#55345
Closes: zed-industries#39097
Closes: zed-industries#50734

Refs: zed-industries#38497, zed-industries#52009, zed-industries#52403, zed-industries#50574, zed-industries#49961, zed-industries#47750, zed-industries#46203, zed-industries#50195, zed-industries#50283, zed-industries#42164, zed-industries#39156, zed-industries#39234, zed-industries#35948, zed-industries#32618

Release Notes:

- Fixed multi-second UI freezes on Linux Wayland when using certain GPU/driver combinations (NVIDIA + Hyprland, AMD RADV + Mutter, and similar). Blocks in VK_PRESENT_MODE_FIFO_KHR on delayed wl_surface.frame callbacks caused the entire event loop to stall.
@cla-bot

cla-bot Bot commented May 18, 2026

Copy link
Copy Markdown

We require contributors to sign our Contributor License Agreement, and we don't have @higorprado on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

@zed-community-bot zed-community-bot Bot added the first contribution the author's first pull request to Zed. NOTE: the label application is automated via github actions label May 18, 2026
@higorprado

Copy link
Copy Markdown
Contributor Author

We require contributors to sign our Contributor License Agreement, and we don't have @higorprado on file. You can sign our CLA at https://zed.dev/cla. Once you've signed, post a comment here that says '@cla-bot check'.

@cla-bot check

@cla-bot cla-bot Bot added the cla-signed The user has signed the Contributor License Agreement label May 18, 2026
@cla-bot

cla-bot Bot commented May 18, 2026

Copy link
Copy Markdown

The cla-bot has been summoned, and re-checked this pull request!

@iddm

iddm commented May 18, 2026

Copy link
Copy Markdown

Hope this lands, as this is just a blocker for me that prevents me from using zed right now and I wish to move to zed from cursor asap.

@NeelChotai

Copy link
Copy Markdown
Member

Thank you for the contribution!

@NeelChotai NeelChotai added this pull request to the merge queue May 18, 2026
Merged via the queue into zed-industries:main with commit 980a294 May 19, 2026
32 checks passed
TomPlanche pushed a commit to TomPlanche/zed that referenced this pull request May 20, 2026
…d-industries#57077)

The WgpuRenderer defaults to VK_PRESENT_MODE_FIFO_KHR (vsync), which
blocks vkQueuePresentKHR until the compositor releases a buffer via
wl_surface.frame. On some Wayland compositor+driver combinations
(notably NVIDIA proprietary + Hyprland, but also observed on KDE/GNOME +
AMD RADV), these frame callbacks can be delayed or lost, stalling the
entire calloop event loop for tens of seconds.

VK_PRESENT_MODE_MAILBOX_KHR does not block on vblank: it replaces the
pending frame in a single-entry queue. This avoids the stall entirely.
The renderer already falls back to Fifo automatically if Mailbox is
unsupported by the driver.

The WgpuSurfaceConfig has had a preferred_present_mode field since
zed-industries#50815 (added for Android lifecycle transitions with the same
rationale). This commit sets it to Mailbox in the Wayland window
creation path only. X11 is not affected.

Self-Review Checklist:

- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Note on tests: This change is in the Wayland platform's window creation
path (WaylandWindowState::new). The surface configuration is delegated
to WgpuRenderer which already has test coverage for
preferred_present_mode fallback logic. A full integration test would
require a running Wayland compositor in CI. Verified manually and tested
against the renderer's unwrap_or(Fifo) safety net by inspecting
surface_caps.present_modes on both NVIDIA proprietary and Mesa RADV
drivers.

Closes: zed-industries#50229
Closes: zed-industries#55345
Closes: zed-industries#39097
Closes: zed-industries#50734

Refs: zed-industries#38497, zed-industries#52009, zed-industries#52403, zed-industries#50574, zed-industries#49961, zed-industries#47750, zed-industries#46203, zed-industries#50195,
zed-industries#50283, zed-industries#42164, zed-industries#39156, zed-industries#39234, zed-industries#35948, zed-industries#32618

Release Notes:

- Fixed UI freezes on Linux (Wayland) when on certain GPU/driver
combinations

---------

Co-authored-by: Neel <neel@zed.dev>
TomPlanche pushed a commit to TomPlanche/zed that referenced this pull request Jun 2, 2026
…d-industries#57077)

The WgpuRenderer defaults to VK_PRESENT_MODE_FIFO_KHR (vsync), which
blocks vkQueuePresentKHR until the compositor releases a buffer via
wl_surface.frame. On some Wayland compositor+driver combinations
(notably NVIDIA proprietary + Hyprland, but also observed on KDE/GNOME +
AMD RADV), these frame callbacks can be delayed or lost, stalling the
entire calloop event loop for tens of seconds.

VK_PRESENT_MODE_MAILBOX_KHR does not block on vblank: it replaces the
pending frame in a single-entry queue. This avoids the stall entirely.
The renderer already falls back to Fifo automatically if Mailbox is
unsupported by the driver.

The WgpuSurfaceConfig has had a preferred_present_mode field since
zed-industries#50815 (added for Android lifecycle transitions with the same
rationale). This commit sets it to Mailbox in the Wayland window
creation path only. X11 is not affected.

Self-Review Checklist:

- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Note on tests: This change is in the Wayland platform's window creation
path (WaylandWindowState::new). The surface configuration is delegated
to WgpuRenderer which already has test coverage for
preferred_present_mode fallback logic. A full integration test would
require a running Wayland compositor in CI. Verified manually and tested
against the renderer's unwrap_or(Fifo) safety net by inspecting
surface_caps.present_modes on both NVIDIA proprietary and Mesa RADV
drivers.

Closes: zed-industries#50229
Closes: zed-industries#55345
Closes: zed-industries#39097
Closes: zed-industries#50734

Refs: zed-industries#38497, zed-industries#52009, zed-industries#52403, zed-industries#50574, zed-industries#49961, zed-industries#47750, zed-industries#46203, zed-industries#50195,
zed-industries#50283, zed-industries#42164, zed-industries#39156, zed-industries#39234, zed-industries#35948, zed-industries#32618

Release Notes:

- Fixed UI freezes on Linux (Wayland) when on certain GPU/driver
combinations

---------

Co-authored-by: Neel <neel@zed.dev>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cla-signed The user has signed the Contributor License Agreement first contribution the author's first pull request to Zed. NOTE: the label application is automated via github actions

Projects

None yet

3 participants