protonscr

src/SerializedSurface.cpp : Assertion Failed: OnChromePaintBufferClientDisconnect m_mapShMemFD ...

steamclosed appid 1437overlayWeb Component
ValveSoftware/steam-for-linux#13682 · opened 2026-10-03 by CeMeKi · updated 2026-10-21 · 16 comments · github · game page · search this game
CCeMeKi 2026-10-03 github

Steam overlay helper (gameoverlayui) stops accepting connections; Proton games freeze permanently on alt-tab (KDE Plasma Wayland)

##Disclaimer
This diagnosis has been made with llms, I do have the issue and all the steps were executed entirely by me, the report has been written by the llm too, llm is Sonnet5.5 medium.

Summary

With the Steam overlay enabled, alt-tabbing out of a game freezes it permanently. The game's dxvk-submit thread is blocked in connect() on /tmp/steam_chrome_overlay_uid1000_spid<gamepid>, a socket owned by that game's gameoverlayui helper. The helper is still alive and listening but no longer accepts connections (queue full), so the game's render path never recovers. Disabling the overlay per game avoids the freeze.

Affected games

Warframe (230410), Deadlock (1422450), Risk of Rain 2 (632360), all via Proton. Tried: Proton Experimental, Hotfix, and several GE-Proton versions. Same result on all.

System

  • OS: Kubuntu 26.04.1 LTS, KDE Plasma on a Wayland session (no X11 session offered)
  • Kernel: 7.0.0-38-generic
  • GPU: AMD Radeon RX 7600 XT, Mesa 26.0.8 (Vulkan 1.4.341, OpenGL 4.6)
  • Steam: Valve's official .deb, Steam Beta client (webhelper log shows buildid 1790904859)
  • Plasma/KWin version: plasmashell 6.6.6
  • Steam System Information: Computer Information:
    Manufacturer: Micro-Star International Co., Ltd.
    Model: B650 GAMING PLUS WIFI (MS-7E26)
    Form Factor: Desktop
    No Touch Input Detected
    Processor Information:
    CPU Vendor: AuthenticAMD
    CPU Brand: AMD Ryzen 5 7600 6-Core Processor
    CPU Family: 0x19
    CPU Model: 0x61
    CPU Stepping: 0x2
    CPU Type: 0x0
    Speed: 5171 MHz
    12 logical processors
    6 physical processors
    Hyper-threading: Supported
    FCMOV: Supported
    SSE2: Supported
    SSE3: Supported
    SSSE3: Supported
    SSE4a: Supported
    SSE41: Supported
    SSE42: Supported
    AES: Supported
    AVX: Supported
    AVX2: Supported
    AVX512F: Supported
    AVX512PF: Unsupported
    AVX512ER: Unsupported
    AVX512CD: Supported
    AVX512VNNI: Supported
    SHA: Supported
    CMPXCHG16B: Supported
    LAHF/SAHF: Supported
    BMI1: Supported
    BMI2: Supported
    F16C: Supported
    FMA: Supported
    Operating System:
    Ubuntu 26.04.1 LTS (64 bit)
    Kernel Name: Linux
    Kernel Version: 7.0
    glibc Version: 2.43
    X Server Vendor: The X.Org Foundation
    X Server Release: 12401010
    X Window Manager: KWin
    Steam Runtime Version: steam-runtime_1.0.20260714.251828
    Client Information:
    Version: 1790904859
    Browser GPU Acceleration Status: Disabled
    Browser Canvas: Unavailable
    Browser Canvas out-of-process rasterization: Disabled
    Browser Direct Rendering Display Compositor: Disabled
    Browser Compositing: Disabled
    Browser Multiple Raster Threads: Enabled
    Browser OpenGL: Disabled
    Browser Rasterization: Disabled
    Browser Raw Draw: Disabled
    Browser Skia Graphite: Disabled
    Browser Video Decode: Disabled
    Browser Video Encode: Disabled
    Browser Vulkan: Disabled
    Browser WebGL: Unavailable
    Browser WebGL2: Unavailable
    Browser WebGPU: Disabled
    Browser WebNN: Disabled
    Video Card:
    Driver: AMD AMD Radeon RX 7600 XT (radeonsi, navi33, ACO, DRM 3.64, 7.0.0-38-generic)
    Driver Version: 4.6 (Compatibility Profile) Mesa 26.0.8-1ubuntu0.3
    OpenGL Version: 4.6
    Desktop Color Depth: 24 bits per pixel
    Monitor Refresh Rate: 59 Hz
    VendorID: 0x1002
    DeviceID: 0x7480
    Revision Not Detected
    Number of Monitors: 1
    Number of Logical Video Cards: 1
    Primary Display Resolution: 1920 x 1080
    Desktop Resolution: 1920 x 1080
    Primary Display Size: 20.75" x 11.65" (23.78" diag), 52.7cm x 29.6cm (60.4cm diag)
    Primary VRAM: 16384 MB
    Sound card:
    Audio device: ATI R6xx HDMI
    Memory:
    RAM: 15665 Mb
    VR Hardware:
    VR Headset: None detected
    No VR configuration with trackers detected
    Most number of trackers in a session: 0
    Miscellaneous:
    UI Language: English
    LANG: en_US.UTF-8
    Total Hard Disk Space Available: 928721 MB
    Largest Free Hard Disk Block: 94354 MB
    Storage:
    Number of SSDs: 3
    SSD sizes: 1000G,1000G,256G
    Number of HDDs: 0
    Number of removable drives: 0

Steps to reproduce

  1. Enable the Steam overlay (default).
  2. Launch one of the games above through Steam with any Proton version.
  3. Alt-tab out of the game.
  4. The game freezes and never recovers. The only way out is killing the process.

Deadlock also freezes without alt-tabbing at all.

What I found

GPU and kernel are not involved: no GPU resets or ring timeouts in journalctl -b -k, and no thread of the game is in D state. All game threads sit at ~0% CPU while frozen (not a busy loop).

Frozen Risk of Rain 2 (PID 12513):

  • Thread dxvk-submit (TID 12578) is in unix_wait_for_peer.
  • /proc/12513/task/12578/stack:
  unix_wait_for_peer
  unix_stream_connect
  __sys_connect_file
  __sys_connect
  __x64_sys_connect
  • /proc/12513/task/12578/syscall shows syscall 42 (connect), fd 0x13b, address length 110.
  • The sockaddr read from the game's memory (/proc/12513/mem) is the abstract socket:
    \0/tmp/steam_chrome_overlay_uid1000_spid12513
  • ss -xlpn shows that socket is owned by gameoverlayui (PID 12621) and has a full backlog:
  u_str LISTEN 11 10  /tmp/steam_chrome_overlay_uid1000_spid12513  users:(("gameoverlayui",pid=12621,fd=24))

Recv-Q 11 > backlog limit 10. A healthy helper for another running game showed Recv-Q 0.

  • After I killed the game, helper 12621 was still alive with the same full queue, so it stays unresponsive on its own.
  • UnityGfxDeviceW and the WSI swapchain threads are all waiting on futexes behind the blocked submit thread.
  • gameoverlayui showed ~0.2% CPU, waiting on a futex.

So the game's connect() has no timeout, and it waits forever on a helper that is not accepting.

Related log lines

In steam console output, shortly before the game stopped:

src/SerializedSurface.cpp (1437) : Assertion Failed: OnChromePaintBufferClientDisconnect m_mapShMemFD has 1 entries, m_mapChromePaintBufferHandleToData 0 entries.

The webhelper.txt log shows the overlay browser windows starting normally and has no errors.

Ruled out

  • Proton version (Experimental, Hotfix, several GE versions)
  • PROTON_ENABLE_WAYLAND=1 (removed, still freezes)
  • Borderless vs fullscreen, DirectX version
  • Steam Game Recording disabled; GPU-accelerated web views disabled
  • Steam beta client and Valve's .deb
  • Integrated GPU disabled in BIOS (second amdgpu device removed)
  • KWin direct scanout disabled (KWIN_DRM_NO_DIRECT_SCANOUT=1)
  • OpenRazer driver and daemons removed
  • Steam run as root earlier; home ownership was repaired afterwards

Confirmation

During a freeze (game PID 84103, overlay helper PID 84214), I ran kill -9 on only the gameoverlayui helper. Three seconds later no game thread was in unix_wait_for_peer any more: dxvk-submit was in futex_do_wait and UnityGfxDeviceW in futex_wait_multiple. <Add: the game resumed rendering / the game crashed / the game ran without an overlay.> This confirms the game's connect() to the overlay helper's socket is what blocks the render path, and that the helper is the process that has stopped responding.

Still missing: a backtrace of the stuck helper before killing it.

Workaround

Disable "Enable the Steam Overlay while in-game" per game. The freeze then does not happen.

Expected behavior

The game should not hang if the overlay helper is stuck, and the helper should keep accepting connections after a focus change.

Ffcostin 2026-10-06 github

I experience a similar symptom when attempting to play the native linux build of Slay the Spire 2 through Steam on Ubuntu 26.04.1 LTS. If both symptoms have a common cause, it suggests the issue may not be specific to proton.

Your system information

  • Steam client version: branch: Steam Beta Update, version: 1791249696, build date: Tue, Oct 6, 2026 11:21 AM UTC +11:00
  • Distribution: Ubuntu 26.04.1 LTS
  • Opted into Steam client beta?: yes
  • Have you checked for system updates?: yes
  • GPU: AMD Ryzen 5 5600

Please describe your issue in as much detail as possible

I have Slay the Spire 2 configured to run in windowed mode. Sometimes after launching the game, the game freezes & stops responding. The issue may be triggered by alt-tab or changing focus by clicking outside & inside the game window.

After the game freezes, the following "Assertion Failed" message is visible in system logs:

steam[$PID]: src/SerializedSurface.cpp (1437) : Assertion Failed: OnChromePaintBufferClientDisconnect m_mapShMemFD has 1 entries, m_mapChromePaintBufferHandleToData 2 entries

What I expected to happen instead: the game & steam overlay functions without the game hanging.

Workaround

Disabling the steam overlay seems to prevent this issue:

Steam -> Settings -> In Game -> Enable the Steam Overlay while in-game -> Disable

More context

I recently upgraded from Ubuntu 24.04 LTS to Ubuntu 26.04.1 LTS. This issue did not happen with Ubuntu 24 LTS.

RRobotRoss 2026-10-10 github

Can confirm the steam overlay is the cause. It essentially stops responding, which in turn brings the entire game down.

crystalyne@hortonator:~/.var/app/com.valvesoftware.Steam$ ls -l /proc/129720/fd/513
ss -xlnp | awk '$3>0'
lrwx------. 1 crystalyne crystalyne 64 Oct  9 22:54 /proc/129720/fd/513 -> 'socket:[1741405]'
Netid State  Recv-Q Send-Q                                                                                            Local Address:Port    Peer Address:PortProcess                                                                 
u_str LISTEN 11     10                                                                   /tmp/steam_chrome_overlay_uid1000_spid5126 1706691            * 0    users:(("gameoverlayui",pid=129822,fd=24))                             
crystalyne@hortonator:~/.var/app/com.valvesoftware.Steam$

Your system information

Steam client version: branch: Steam Beta Update, version: 1791592380, build date: Sat, Oct 10, 2026 1:12 AM UTC +01:00
Distribution: Fedora Silverblue 44
Opted into Steam client beta?: yes
Have you checked for system updates?: yes
GPU: AMD RX 6900 XT
Aambiso 2026-10-15 github

i tasked my slopbot to find the root cause for this and the first release that introduced this - if anyone cares for it here are the results:

slop

I reproduced the same full-listener-queue hang in native Linux Dota 2 (Vulkan) and investigated it with strace, GDB, and static comparisons of the shipped binaries. I found a candidate change in the October 1 beta that may help narrow this down, but have not established a first-bad build by runtime testing.

Confirmed failure and recovery

  • Dota’s render thread blocks in gameoverlayrenderer.so → blocking Unix-domain connect() to /tmp/steam_chrome_overlay_uid1000_spid<gamepid>.
  • The corresponding gameoverlayui helper is alive, owns the listener, and stops accepting connections. Its queue reaches 11 with backlog 10. Its regular frame callback continues running.
  • The helper logs the same diagnostic reported above:
    SerializedSurface.cpp (1437): OnChromePaintBufferClientDisconnect m_mapShMemFD has 1 entries, m_mapChromePaintBufferHandleToData 0 entries.
    
  • Calling the helper’s existing acceptance routine once through GDB briefly restored rendering; the game subsequently froze again as the queue refilled.
  • A temporary, memory-only hook that calls that acceptance routine once from CSerializedSurface’s regular frame callback drained the queue to zero. Repeated rapid Alt-Tab, opening/closing the overlay, and spectating subsequently stopped reproducing the freeze. This is an experimental workaround, not a proposed production patch; it changes timing. No installed Steam files were changed by the hook.

My reproductions involved Alt-Tab between Dota and another application, including Steam or a terminal; moving the game between workspaces was not required.

Candidate regression: renderer teardown added in the October 1 beta

I downloaded both complete bins_ubuntu12 archives from Valve’s CDN and verified their SHA-256 hashes against the archived manifests:

Build Manifest Role in comparison
1790721607 d0fa08908341 Immediately preceding beta; not runtime-confirmed good
1790904859 3dd6737b71ea October 1 beta; also the affected build in the original report

In the 64-bit gameoverlayrenderer.so, the latter build adds a block to the CBaseOverlayRenderer destructors. Approximate pseudocode inferred from disassembly; global/mutex names are placeholders:

lock(mutex);
if (active_renderer == this) {
    existing_connection_teardown(this);
    active_renderer = nullptr;
}
unlock(mutex);
// Continue pre-existing member/socket destruction.

The teardown routine sends IPC message 0x19 when the connection is valid and the IPC sender is available, closes socket member this + 0x154, and resets it to -1. The predecessor already closed that socket in the destructor, but did not call this disconnect-notification routine from that destruction path.

The static call chain is:

VulkanSteamOverlayDestroySwapChain
  → erase the swapchain's renderer from the map
  → CVulkanRenderer destructor
  → CBaseOverlayRenderer destructor
  → newly added conditional connection teardown / IPC 0x19

Useful ELF virtual addresses (before ASLR), for the two archived 64-bit renderer libraries:

Routine 1790721607 1790904859
VulkanSteamOverlayDestroySwapChain 0x5dd90 0x5df90
Map erasure reaching renderer destruction 0x5d990 0x5db90
CVulkanRenderer destructor variants 0x5c980, 0x5c990 0x5cb80, 0x5cb90
Changed base destructor variants 0x58be0, 0x58ce0 0x58d40, 0x58ea0
Existing connection teardown routine 0x57770 0x57850

In 1790904859, the added destructor blocks compare against global pointer 0xcb7f0; calls to teardown occur at 0x58e43 and 0x58f93. Class identities were checked against RTTI. The teardown routine also gains a null check around its IPC sender in this release.

This corresponds in time to the official October 1 beta notes, which mention a fix for Vulkan games recreating their swapchain. That correspondence is a lead, not proof that the advertised fix caused this hang.

Why the helper may fail to service reconnects

In the helper path identified in the current build, accepting a connection is nested inside sending a shared Chrome paint-buffer FD to the game:

shared paint-buffer drawing
  → if buffer is not already marked cached/sent: send its FD
    → if client socket lookup misses: accept a connection

Consequently, drawing an already-cached buffer skips this acceptance path; without that drawing path, it is not reached either. The regular frame callback does not independently service the listener in the inspected code.

With the overlay held open after the recovery hook was installed, a five-second GDB capture counted 357 shared-buffer draw calls and zero descriptor-send calls. The sampled cache entry for handle 0x22 had its cached/sent flag set to 1.

For current Steam build 1791918634, 32-bit vgui2_s.so addresses are: acceptance routine 0x2137b0; FD-send routine 0x215c40 (calls acceptance on socket lookup miss); cache branch 0x218958 skipping toward 0x218dfa; regular frame callback 0x20c020. Dota’s blocking renderer connect() call is at gameoverlayrenderer.so + 0x57a64.

Between the two adjacent beta packages above, vgui2_s.so’s entire .text section differs in only five bytes, all diagnostic immediate arguments apparently representing assertion line numbers. The accept/cache/frame-callback instruction bytes are unchanged. chromehtml.so is byte-identical. gameoverlayui.so also changes and has not been ruled out.

Static link from IPC 0x19 to the helper diagnostic

I also decoded the helper's IPC dispatch jump table, rather than inferring the message meaning from its number:

  • In both adjacent betas, gameoverlayui.so jump table 0x20c834, entry 0x19, selects handler 0x2bb270. It obtains the overlay surface through virtual slot +0x2a8, then calls its slot +0x58 at 0x2bb288. The two case blocks have identical bytes.
  • In current build 1791918634, the equivalent table is 0x20ca34, handler 0x2bb490, virtual call 0x2bb4a8.
  • Current vgui2_s.so's IOverlaySurface vtable starts at 0x600824. Slot +0x58 points to thunk 0x20c300, which adjusts this by -0x198 and enters 0x20c150: the routine containing the OnChromePaintBufferClientDisconnect diagnostic.
  • That inspected routine checks/prints remaining map entries but contains no map-clearing or cached-flag-reset operations. This does not exclude cleanup in another part of the system.

Thus there is a concrete static link between the newly added renderer-side notification and the diagnostic observed during the hang. Runtime evidence that the failing Alt-Tab actually takes the new destructor branch is still missing.

What remains unproven

The static comparison establishes that the destructor-side disconnect notification was added in this package transition. It does not establish that this is the first release with the hang, or that the new conditional path executes during the failing Alt-Tab transitions. The cache observations were made after recovery and do not establish the initial invalidation failure.

The most useful next checks appear to be:

  1. Capture the teardown caller during swapchain recreation, together with the active-renderer pointer comparison, then follow IPC 0x19 and the next connection attempt. This would distinguish the candidate destructor change from other callers of the existing teardown routine.
  2. Check what invalidates per-client shared-buffer sent/cache state on disconnect, and whether recreating a renderer for the same game PID can reuse a handle still marked sent to the previous connection.
  3. Exercise repeated swapchain destruction/recreation with the overlay closed and with an already-cached visible buffer. Listener servicing should remain independent of whether a new texture FD needs to be sent, and the render thread should not wait indefinitely for a full listener queue.

The frame-callback hook only demonstrates the listener-service dependency. It is not a production fix: the existing acceptance routine also performs a blocking accepted-client handshake, so simply moving that whole routine into every frame callback would need additional care.

Suggested fix direction

Based on the recovery experiment, the primary fix appears to be servicing the listener independently of shared-buffer drawing and descriptor-cache misses. The following are proposed changes, not source-level findings:

  1. Service incoming connections through the helper's event loop, including while the overlay is hidden or all buffers are cached. Accept queued connections without blocking, and process their handshakes asynchronously with bounded resource use. Simply calling the existing acceptance routine every frame is not sufficient as a production fix: it also performs a blocking accepted-client handshake. On Linux, accepted sockets do not inherit O_NONBLOCK; that needs to be set explicitly, e.g. with accept4(..., SOCK_NONBLOCK | SOCK_CLOEXEC) (accept(2)).
  2. Audit descriptor-cache ownership across reconnects. A buffer marked sent must have been sent successfully to the current connection, not merely an earlier renderer with the same game PID. If that invariant is not already maintained elsewhere, invalidate the affected per-client state on disconnect or associate it with a connection generation, and resend the required descriptors. Our inspected disconnect callback does not perform that cleanup, but we have not excluded cleanup elsewhere.
  3. Keep overlay connection establishment and descriptor reception from indefinitely blocking game rendering. Use asynchronous handling with deadlines/retries so rendering can continue while the overlay connection is unavailable or being re-established. This would contain the impact even if the helper encounters another failure.
Illustrative pseudocode for separating listener service from drawing

These sketches express the intended invariants, not Valve's API or a drop-in patch. Error handling, protocol validation, FD ownership, and synchronization would need to follow the actual implementation.

// Helper event loop; runs regardless of overlay visibility or texture work.
// The listener itself is nonblocking and registered for level-triggered reads.
on_listener_readable() {
    while (accept_budget_remaining() && pending_peer_capacity_available()) {
        fd = accept4(listener, SOCK_NONBLOCK | SOCK_CLOEXEC);
        if (would_block(fd)) break;
        if (interrupted(fd)) continue;
        if (failed(fd)) { handle_accept_error(); break; }
        watch_pending_peer(fd, handshake_deadline());
    }
    // If capacity is exhausted, pause readiness notifications and re-arm
    // when capacity returns; also expire incomplete handshakes.
}

on_pending_peer_readable(peer) {
    result = peer.handshake.read_available_nonblocking();
    if (result == incomplete) return; // Preserve partial input; keep deadline.
    if (result == eof_or_error || !validate_handshake(peer)) {
        close_and_release(peer);
        return;
    }
    register_ready_connection(peer, fresh_connection_id());
}

Buffer delivery should then depend on connection state, without being responsible for accepting that connection:

ensure_buffer_available(peer, buffer) {
    key = (buffer.id, buffer.generation);
    if (!peer.ready || peer.sent.contains(key) || peer.in_flight.contains(key))
        return;

    peer.in_flight.insert(key);
    queue_nonblocking_fd_delivery(peer.connection_id, buffer, completion);
    // Completion removes in_flight and marks sent only at the protocol's
    // success point. On failure, do not mark sent; retry or retire the peer.
}

on_connection_closed(connection_id) {
    retire_that_connection_and_its_pending_io(connection_id);
    // Its sent/in_flight state dies with it. A replacement peer starts empty.
    // A late completion/close from the old connection must not mutate the new
    // connection's state merely because both identify the same game PID.
}

On the renderer side, connection/FD handshake work would advance asynchronously with deadlines. The render path would consume only ready overlay state and continue rendering the game when that state is unavailable, rather than entering a blocking connect() or descriptor receive.

A useful regression test would repeatedly destroy/recreate Vulkan swapchains for the same game process, with the overlay both hidden and displaying already-cached buffers. Verify that fresh connections are accepted, required FDs are resent to each connection, stale sockets/FDs are released, and rendering continues. A client that connects but delays its handshake should not stall the helper either.

I would not recommend reverting the destructor change solely on this evidence: it may be necessary for the advertised swapchain crash fix. The static comparison identifies a candidate trigger; the listener-starvation failure and the benefit of independent listener servicing are supported by the runtime observations above.

Environment and unsuccessful alternatives

Runtime investigation: Steam 1791918634, native Dota build 25894101, NixOS, GNOME Wayland, private xwayland-satellite 0.8.3, RX 7900 XTX / Mesa 26.2.4.

Disabling Steam web-view GPU acceleration, testing [xwayland-satellite PR #499](https://github.com/Supreeeme/xwayland-satellite/pull/499) (ICCCM focus changes), and suppressing the startup overlay toast did not prevent the hang. No GPU reset or OOM was found. A sampled browser GPU presentation wait was not a persistent GPU stall. These did not explain the reproducible full socket queue or the recovery from servicing it.

SHA-256 identities for the adjacent-release comparison
1790721607 bins_ubuntu12 archive
ffda075bc03991f565c10298e8756c5c2c76a4c6fdb998c31a81d8ca584e027f
1790904859 bins_ubuntu12 archive
590d35091f87ced96517a69c0ddcf9a13c7b8554a472fa69c669af7ce8a87687

1790721607 ubuntu12_64/gameoverlayrenderer.so
ede84aed04c4e52c4e651856c95eb37c7a0892f4607712831d048d47f7d373c0
1790904859 ubuntu12_64/gameoverlayrenderer.so
e0248c176ad8cb55deb19433fde62f3335abfd179be9dcc637975adbff2616d8

1790721607 ubuntu12_32/vgui2_s.so
e354d4b8f4ffedf5250acdb63bbd50653250b0ea9df7ed2f1fdef8a5d4b656f3
1790904859 ubuntu12_32/vgui2_s.so
84a125ed71ce9cdd4394c299acf5ba6a5e7f8f3628cb526660d09ef1f6d433ce
KKleinerKobold 2026-10-15 · hidden on GitHub github

diagnostic-excerpts.txt

Got the same:
Summary

Native Linux Dota 2 freezes while the GNOME desktop remains responsive. During a live freeze, GDB showed the Vulkan render thread blocked in connect() inside Steam's gameoverlayrenderer.so, called from VulkanSteamOverlayPresent().

The target socket belonged to the game's gameoverlayui helper. Its listener had a queue of 11 with a backlog of 10. Killing only this helper immediately restored gameplay without restarting Dota or Steam.

This appears to match https://github.com/ValveSoftware/steam-for-linux/issues/13682 and provides another confirmed recovery in native Dota 2 on GNOME Wayland.

System information

  • OS: EndeavourOS (Arch-based), x86_64
  • Kernel: 7.2.7-1-cachyos
  • Desktop/session: GNOME on Wayland
  • GNOME Shell: 51.0-1; Mutter: 51.1-1
  • CPU: AMD Ryzen 9 5900X
  • GPU: AMD Radeon Navi 31, PCI ID 1002:744c, approximately 20 GiB VRAM
  • Kernel graphics driver: amdgpu
  • Mesa / vulkan-radeon / lib32-vulkan-radeon: 26.2.4-1
  • Steam client build: 1791918634
  • Steam package: 1.0.0.87-3 (native distribution package)
  • Steam beta opt-in: not independently confirmed; startup log used the public steam_client_ubuntu12 manifest
  • Game: Dota 2, AppID 570, build ID 25966409
  • Runtime: native Linux executable under Steam Linux Runtime Sniper, Vulkan; not Proton
  • Date: October 15, 2026

Launch options in use:

+@panorama_min_comp_layer_dimension 0 -prewarm_panorama -console -high -novid -noforcemaccel -noforcemspd -useforcedmparms

Observed behavior / reproduction

  1. Launch native Dota 2 with the Steam overlay enabled.
  2. Play normally. Two freezes occurred in the same evening, including one within roughly ten minutes of relaunching.
  3. Dota stops updating and does not respond to closing its window from GNOME's overview. The desktop remains usable.

The exact triggering action is unknown. Alt-Tab or a particular in-game action has not been established as the trigger in this case.

Captured evidence

Game PID: 9170; render-thread TID: 9462; overlay-helper PID: 9485.

The render thread remained in this call chain across separate GDB captures:

connect()
  gameoverlayrenderer.so
  gameoverlayrenderer.so
  VulkanSteamOverlayPresent()
  vkQueuePresentKHR() [steamoverlayvulkanlayer.so]
  librendersystemvulkan.so

The render thread's syscall registers showed orig_rax = 42 (connect), fd 42, and sockaddr length 110. The sockaddr contained the Unix-domain socket path:

/tmp/steam_chrome_overlay_uid1000_spid9170

ss -xlnp showed:

u_str LISTEN 11 10 /tmp/steam_chrome_overlay_uid1000_spid9170 ... users:(("gameoverlayui",pid=9485,fd=24))

The main game thread was waiting in ThreadAtomicWait() in libtier0.so. Kernel logs contained no GPU timeout/reset or OOM-kill around this freeze. Available system RAM was approximately 17 GiB.

Recovery test

  1. Sent SIGTERM to overlay helper PID 9485. It remained alive and the game stayed blocked.
  2. Sent SIGKILL to that helper only. Dota PID 9170 was left running.
  3. The helper's listener disappeared, and the render thread left the blocked connect() call.
  4. Gameplay resumed immediately, confirmed on screen by the user.

No Steam binaries, game files, launch options, or persistent settings were changed during this test. GDB was detached after each capture.

Expected behavior

A stalled overlay helper should not indefinitely block the game's render thread. The game should continue rendering, or the overlay connection should fail with a bounded timeout.

Workaround status

Terminating the stuck gameoverlayui helper restored this running game. Disabling the overlay for subsequent Dota launches has been recommended but has not yet been tested in this case.

Attachments

diagnostic-excerpts.txt contains the relevant render-thread backtraces before recovery and the main/render-thread backtraces after recovery. Home-directory paths have been anonymized.

DDondandelion 2026-10-15 github

Hi! I'm a Steam Deck user, and I'm experiencing the same issue described here.

The problem occurs in multiple games when I use Alt+Tab in Desktop Mode. After switching between windows a few times, the game freezes completely: the image stops updating, and the Steam Overlay no longer opens. The desktop itself may remain partially functional, but I cannot interact with the frozen game.

I've tested several games, including Vampire Survivors, GTFO, Deadlock, Dota 2, and Counter-Strike. The issue occurs with different Proton versions and in both windowed and fullscreen modes.

I'm running SteamOS on the Stable update channel. Switching to the Steam Client Beta did not fix the issue, and restarting the system after updating Mesa didn't help either.

However, disabling the Steam Overlay for the affected game completely resolved the issue in my testing. The game no longer freezes after repeated Alt+Tab switching.

My Steam client information:

  • Steam Branch: Steam Deck Stable
  • Steam Version: 1791918634
  • Steam Client Build Date: October 13, 2026, 21:44 (UTC+03:00)
  • Steam Web Build Date: October 13, 2026, 21:45 (UTC+03:00)

Hopefully, this information helps narrow down the cause. It seems possible that the issue is related to the Steam Overlay or its interaction with the Desktop Mode graphics stack.

Rrhian-cs 2026-10-16 github

Hi! Got the same issue on Final Fantasy XIV (Fedora 44, GNOME Wayland (mutter 50.x), RX 9070 XT (RADV), Steam stable channel)

HHeroHunterIguess 2026-10-16 github

I also got this same issue multiple times in only a few minutes when playing Terraria on EndeavourOS (Wayland/MangoWM), the only way to close for me was also force stopping the process. GPU: RX 7600 XT.

Cclagiordano 2026-10-16 github
Same assertion here, and it also affects native Linux games — not only Proton.

System:

  • Steam client: 1791918634 (Stable, build date Tue Oct 13 2026), not opted into beta
  • OS: Debian unstable (sid), GNOME Shell 50.5 on Wayland
  • GPU: NVIDIA GeForce RTX 3070 Ti Laptop GPU, proprietary driver 550.163.01 (hybrid laptop, Intel iGPU + NVIDIA dGPU; games run with __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia)
  • Affected: Valheim (892970, native Linux client) and Last Epoch (899770, Proton) — both freeze the same way

Same assert as #13740 (closed as a duplicate of this):

src/SerializedSurface.cpp (1437) : Assertion Failed: OnChromePaintBufferClientDisconnect m_mapShMemFD has 1 entries, m_mapChromePaintBufferHandleToData 0 entries.

Symptom:
The game window hangs completely after a short time (often on alt-tab or workspace switch; one freeze ~2 minutes after launch). Only fix is killing the process. While a game runs, gameoverlayui enters a crash/restart loop: repeated breakpad init + "reaping pid: ... -- gameoverlayui" every ~10 s, and minidumps are written to /tmp/dumps (auto-uploaded). The Steam console log also shows from gameoverlayui:

../common/pipes.cpp (900) : Fatal assert; application exiting

Regression boundary (in case it helps bisect):

  • Previous stable build (overlay stamp 20260903013152, Sep 3): clean for ~2 weeks, including a 5h42m Valheim session with the same alt-tab / workspace-switch usage — zero SerializedSurface assertions.
  • Current stable build (overlay stamp 20261013184430, Oct 13; rolled out here Oct 15, 13:49): freezes from the very first session; 170+ overlay assertions across multiple boots and hundreds of gameoverlayui restarts since.

Workaround confirms it's the overlay:
Disabling "Enable the Steam Overlay while in-game" globally (Steam → Settings → In Game) fully fixes it: 20+ minutes of alt-tab and workspace switching, no freeze, zero new assertions. With the overlay enabled the freeze reproduces every session.

Happy to attach Steam logs or minidumps if useful.

KKleinerKobold 2026-10-16 github

I also have problems with Dota2, game freezes out of nowhere. I am on arch with wayland. After removing the overlay everything runs normal.

Yygreyeb 2026-10-16 github

I can reproduce since the Oct 13 stable client update playing Valheim (892970) via Proton on Fedora 44, GNOME Wayland 50.5, RX 9060 XT (amdgpu), kernel 7.2.10 / Mesa 26.2.4. Game still alive but frozen after Alt-Tab, only killing the process helps. My first failure came 63 minutes after the client self-update. Disabling the overlay fixes it.

Llostgoat 2026-10-17 github

Thanks for the detailed report. The latest steam beta should have a fix for this issue, can you update to the latest beta client and check if it is fixed on your side?

Mmisterj05 2026-10-17 github

Not OP but issue seems to be fixed for me on beta.

EDIT:
Steam Beta Branch: Steam Beta Update
Steam Version: 1792192922
Steam Client Build Date: Fri, Oct 16, 2026 5:56 PM UTC -04:00
Linux Kernel: 7.2.9
CPU: AMD Ryzen 5700x
GPU: AMD 9060 XT
I can't reproduce on Proton or Native Linux builds (Tested Valheim, Project Zomboid and Slay the Spire 1 natively).

Ffcostin 2026-10-17 github

Updating to the latest steam beta client (1792192922) did not resolve this issue for me

details

impacted game : slay the spire 2 (native linux build)

when started in window mode, game hangs with black screen. symptom of failed assertion message no longer visible in system log.

as before, disabling steam overlay works around the issue & game can open normally.

Steam Beta Branch: Steam Beta Update
Steam Version: 1792192922
Steam Client Build Date: Sat, Oct 17, 2026 8:56 AM UTC +11:00

Distribution: Ubuntu 26.04.1 LTS
Opted into Steam client beta?: yes
Have you checked for system updates?: yes
GPU: AMD Ryzen 5 5600

Aana-rchy 2026-10-17 github

latest steam beta client still has issues for me, in particular it doesnt let me switch from terraria to another column on a niri workspace, and when the game is fullscreen and i try switching workspace, it un-fullscreens. i can get around it not letting me switch to another column by not making the window be full screen width. persists even without overlay so idk if this is the right place to post this even but im not sure where else i would. it atleast doesnt crash on the beta version it seems

CCeMeKi 2026-10-17 github

OP here, the issue is in fact fixed for me in the latest beta update; Considering some other users are still having problems with it should I leave this issue open or close it?

Llostgoat 2026-10-17 github

Thanks for checking everyone.

Well will close this issue as the bug described by OP is fixed. For those of you still experiencing problems, please open a new issue and please include your steam logs as specified by the issue template.

Ccpuccino 2026-10-21 · hidden on GitHub github

I updated to steam beta - and steam won't launch anymore - BPM just crashes.

Nvm, just had to re-open steam a few times.

Related threads

Proton versions

Launch options

Upstream links