Blog / Post

Steam on the Switch, or three cursed flags

Steam ships native ARM64 binaries that draw absolutely nothing on the Switch’s Tegra X1. Three cursed launch flags later, the full store and Big Picture UI finally render.

00 Preamble

If you’ve followed the L4S Fedora story you already know the Switch is, to me, a small miracle of a machine — a Tegra X1 that Nvidia was kind enough to give us real Linux kernel sources for. So of course, at some point, the question stops being “can it run Linux ?” and becomes “can it run Steam ?”.

Short answer : yes. Long answer : yes, but the thing fought back for a while, and the fight came down to exactly three launch flags. This is the story of those three flags, written down mostly so future-me stops rediscovering them every time.

This one is for the curious and the technically inclined. There’s shell.

01 The setup

The device is a Switch running Fedora 42 KDE on L4T (kernel 4.9.140-l4t, aarch64, Tegra X1, OpenGL 4.6 / Vulkan 1.2.131), KDE Plasma on X11. Steam itself comes from Switchdeck (https://github.com/SildurFX/Switchdeck), installed into ~/.local/share/Steam.

The nice surprise : the client and steamwebhelper here are native ARM64 (steamrtarm64/), not running through box64. So we’re not emulating x86 to draw a store page — it’s the real arm64 Steam runtime.

The not-so-nice surprise : straight out of the box, the official launcher gives you a blank screen and a webhelper crash loop. Beautiful native binaries, painting absolutely nothing.

02 Why it doesn’t render

Three separate things go wrong, and they hide behind each other, so you fix one and earn the right to see the next. In order of discovery :

The GPU process suicides. The stock launcher passes the full official CEF flag set (-cef-single-process -cef-in-process-gpu -cef-disable-seccomp-sandbox and friends). This client doesn’t support that combo and walks straight into a NOTREACHED crash loop. The cruel part : -cef-in-process-gpu is silently ignored, so a GPU subprocess spawns anyway, fails, and you get the famous error_code=1002“GPU process isn’t usable. Goodbye”. Goodbye indeed.

The presenter can’t find its window. Even with CEF behaving, the official LD_LIBRARY_PATH prepends the pressure-vessel runtime libs in front of steamrtarm64. That breaks the CEF X11 software presenter — you get XGetWindowAttributes failed for window 0 and, again, nothing paints.

The client window never maps. Last one, and the most annoying because webhelper looks healthy. The official launcher exports __GL_THREADED_OPTIMIZATIONS=1. On Tegra X1 that breaks the Steam client window specifically — the helper processes are alive and happy, but no window is ever mapped to the screen.

03 The three flags

So we keep a pristine copy of the launcher (launch-steam.sh.orig-official) and apply exactly three edits to launch-steam.sh :

1. Minimal CEF flags. Throw away $STEAM_FLAGS and use only :

-cef-disable-gpu -cef-disable-sandbox

-cef-disable-gpu forces software CEF rendering, which is what we want — no GPU subprocess to crash.

2. Clean LD_LIBRARY_PATH — just the arm64 runtime, no pressure-vessel in front :

LD_LIBRARY_PATH="$STEAMROOT/steamrtarm64:${LD_LIBRARY_PATH-}"

3. Turn the threaded GL opt off (official sets it to 1) :

export __GL_THREADED_OPTIMIZATIONS=0

After the three : webhelper stable at ~9-10 processes, no GPU crashes, the full store and Big Picture UI render, and you’re logged in. From a blank screen to a working storefront on three lines.

04 A couple of field notes

  • The launcher uses set -u, and the one-time init block dereferences XDG_CURRENT_DESKTOP. So if you start Steam over SSH you must export XDG_CURRENT_DESKTOP=KDE or it dies before it even tries.
  • Steam opens minimized to the tray. To force the window : steamrtarm64/steam steam://open/main.
  • One gotcha that has nothing to do with Steam : the WiFi power-saves aggressively when the screen blanks, and the device drops off the network for long stretches. Keep the screen awake during remote work or you’ll think everything crashed when really the Switch just went to sleep on you.

Reinstalling? Answer N.

If you ever rerun install-steam.sh, answer N to the delete prompt — it keeps your steamapps, userdata and compat tools, and it deliberately downgrades the client, because newer builds illegal-instruction crash on this hardware and steam.cfg is what pins it.

05 What’s next ?

Steam runs, games are a different rabbit hole (box64, DXVK-Sarek, VKD3D…) and that’s a story for another day. As always I’ll keep a bit of mystery floating.

Special thanks

Special thanks to everyone in the Switchroot / Linux 4 Switch crew, and to SildurFX for Switchdeck.

Sources & further reading

Enjoyed this? This work is patron-funded. Patrons get early builds, devlogs, and a vote on which device I attack next — everything I make stays free and open.