Table of Contents
At the start of March, I got my hands on a Steam Deck. The reason I got one is simple: I was among some of the first folks who was able to place a reservation when it was initially announced, and as a result, I was among the first batch of folks who ended up receiving their Steam Deck (a Q1 slot, if you will).
As someone who enjoyed tinkering with Linux when I was younger, I have come to the conclusion that this is already an absolutely amazing handheld with the ability to reliably play a large selection of Windows games, on Linux.
A particular section in the preceding paragraph there (“reliably play a large selection of Windows games, on Linux”) was what I was concerned about the most: I was not certain that the Deck would run many games properly, since we are attempting to run Windows binaries on a Linux environment, without the overhead of virtualisation.
Prior to receiving the Steam Deck, I did try Manjaro on my desktop computer and tried a variety of games from my Steam library on the system. I remember not being impressed by the experience.1
In the months since I last tried Proton on Linux, it seems that many pieces have fallen into place, it seems: many games that did not run when I last tried running them on Linux do actually run now on the Steam Deck.
Hardware impressions
I own various handhelds, and the Steam Deck is probably the most comfortable one, in terms of how holding the device feels. It’s definitely more comfortable than handling the Nintendo Switch’s tiny JoyCon controllers. While the Deck is definitely a bit bigger than the Switch, I enjoy holding it.
In terms of build quality, I’m satisfied with the Steam Deck. The lack of metal in the build does make it feel less premium than, say, the OLED Switch. I think that’s okay, given the hardware that’s in here. I’d put it somewhere between the original Switch and the OLED model in terms of build quality.
The screen looks fine. It’s no OLED panel, but with a resolution of 800p it is a good target for mobile gaming. The aspect ratio lends itself well to older and newer games. If you wish to play games at 720p, you’ll have black bars at the top and bottom of the screen, and I think that’s fine.
There’s also an option to use the screen at a very low brightness, as well as various software options for yellow filters. Because of this, the Deck is probably the best handheld for late-night gaming. The screen does not have the greatest color coverage (68% sRGB) but that did not actively bother me during gameplay.
Battery life is interesting: Valve promises between 2 and 8 hours of battery life, and I can see how that might fluctuate: older games will use far less power and newer releases will be much more power-intensive.
Fortunately, Valve has included a menu that allows you to limit the maximum framerate and throttle processor performance, so you might be able to optimize where necessary. This performance statistics feature can be as detailed as you’d like it to be, with various different “steps” available that each increase the amount of information in the overlay.
The buttons on the Steam Deck are nice, and remind me a lot of the buttons on an Xbox controller. All of the buttons feel comfortable to press. I initially thought that the Deck would be rather heavy and big but those concerns were mostly unfounded. Pressing buttons doesn’t feel awkward.
I also like that the USB-C port is located at the top of the unit, which makes it easier to use the Steam Deck with a variety of chargers while keeping the Deck docked upright.
The microSD card slot (located at the bottom of the unit) is also helpful and allows you to add additional storage to your unit. In my experience, the SD card storage is actually quite fast. Your results will vary based on the speed of the SD card in question, but I did not get the impression that games loaded incredibly slowly.
(There is, of course, a difference between the internal SSD and SD card in terms of read & write speeds, but making expandable storage available makes sense. Especially the base model is most likely quite starved for additional space. Games can be quite big nowadays!)
My only real complaint with the hardware that I can think of is that the built-in fan is rather loud and produces an annoying sound.
Unfortunately, due to the Steam Deck using a x86 processor, it is less power-efficient and runs hotter than comparable ARM chips (i.e. what is used in the Switch and mobile phones, for example).
SteamOS impressions
SteamOS is actually two things: when you boot up your Steam Deck, you’ll enter the Steam shell. It’s Steam, optimized for the Deck. It’s great. But you also have access to the underlying Arch Linux setup as well. More on that later.
Let’s start with the most important part: yes, much of the software on the Deck is getting frequent updates. That much is true, and as a tinkerer who enjoys installing software updates, this is fun!
But… is this ready for the regular consumer? Maybe not. Parts of the Steam Deck experience can be frustrating: various parts of the UI can be a bit unintuitive, and various parts of the UI seem to be a bit sluggish when you navigate around.
You also probably shouldn’t count on a great desktop experience without docking the system but I think that is fine, honestly, because this is primarily a portable gaming device.
Regardless, you can totally use the desktop Linux environment on the Deck, it’s just not the greatest experience. The screen is also quite small for desktop usage.
You do have access to a full KDE Plasma desktop, where you can install and use a variety of software. You could, with a dock and display, use the Deck as a regular Linux computer, because at the end of the day, it’s a PC.
Steam Play
Tinkering with Linux
A little bit of personal history first: between 2008 and 2011 (back when I was a teen) I used to run a mini blog about tinkering with Linux. On this blog, for years I wrote various posts about Ubuntu, Fedora, or whatever distro I was into at the moment.2
I used to really enjoy tinkering on my Linux setup, but that ended in 2011 when I got my first MacBook and started attending college. I was a total Mac user at the time, but I was trying to run some software natively on my MacBook by using Wine.
I succeeded but thought that it was a hassle, and there were a bunch of problems, unfortunately. More modern framework requirements would sometimes cause issues, and various programs would simply not run. Nonetheless, it was great that I could natively run some Windows programs on my Mac.3
Wine
What’s Wine exactly, you might ask? It’s a compatibility layer that lets you run Windows executables on any Linux-based system. It also happens to run on the Mac (or it used to, when 32-bit programs were still supported), where I really ended up using this extensively.
I ended up using a virtualised Windows 8 installation on my Mac eventually, and ended up buying a Surface Pro when I got a job just so I could have a nicer gaming experience.
To say that I was a bit concerned when Valve announced the Steam Deck is an understatement: I knew that this meant they’d be running SteamOS, and that they’d need to use some system that would allow running these Windows games.
Introducing Steam Play
Using Wine as a basis for this seemed like a logical choice, but the big question for me was graphics support: drivers on Linux have historically been an issue and running DirectX games in the past was not exactly easy.
Enter Proton (also known as Steam Play): Valve’s open-source solution to enable running various Windows games natively on Linux.
They’ve been working on this for a while now, and as we speak, plenty of new games can actually run on Linux now through this layer. Even Elden Ring can run without issues on the Steam Deck, which is an amazing achievement.
Understanding Proton
I was wondering: running Windows games on Linux… how the heck is this even accomplished? I went and consulted the Proton repository (it is open-source after all!) and what I found was interesting.
From this point on in the post, I go over some of the pieces that make up Proton in this post. Feel free to skip this if you do not find this interesting.
Core Technologies
As someone who used Linux a decade ago, let me start with the stuff that I immediately recognized. I’ve included the official project description for each of these.
Wine
Without Wine, there’d be no Proton, that’s for sure. So, what is it?
Wine is a program which allows running Microsoft Windows programs (including DOS, Windows 3.x, Win32, and Win64 executables) on Unix. It consists of a program loader which loads and executes a Microsoft Windows binary, and a library (called Winelib) that implements Windows API calls using their Unix, X11 or Mac equivalents. The library may also be used for porting Windows code into native Unix executables.
FFmpeg
You might also be familiar with FFmpeg, which is often used for transcoding videos, but can do more than just video transcoding:
FFmpeg is a collection of libraries and tools to process multimedia content such as audio, video, subtitles and related metadata.
GStreamer
Playing back media is also important (as some games contain media assets in the form of videos), and GStreamer can handle audio playback and streaming without issues.
GStreamer is a library for constructing graphs of media-handling components. The applications it supports range from simple Ogg/Vorbis playback, audio/video streaming to complex audio (mixing) and video (non-linear editing) processing.
In addition to GStreamer, various plugins that extend the base functionality seem to be included as well.
Fonts
You might think that I am joking, but Windows comes with a selection of proprietary fonts, and to maintain compatibility Proton must provide fonts with similar metrics in order not to break existing applications that rely on specific fonts. (If you have a machine running Windows, you could arguably copy the fonts over.)
Understanding graphics APIs: DirectX and Vulkan
Before you can understand some of the other core technologies at play here, you must understand what DirectX is, and how important its role is in the current gaming landscape.
What is DirectX?
Since most games are focused on releasing either on console or on Windows computers, it is a very common choice to opt into using DirectX APIs. What is DirectX, then? Wikipedia to the rescue:
Microsoft DirectX is a collection of application programming interfaces (APIs) for handling tasks related to multimedia, especially game programming and video.
To be more precise, DirectX provides a low-level graphics API. You need a graphics API to get those mind-boggling visuals to appear on your computer screen in real-time.
It’s a Microsoft product (being part of Windows), and it is, as a result, proprietary technology. There are many versions of DirectX still use, with the latest version being 12 at the time of writing.
Older games will use DirectX 10, 11 or maybe even older versions like 9 or 8. If Valve aims to get these games running, they need to provide a translation layer or drop-in replacement for each of these DirectX versions.
Now, there are other similar initiatives that have historically positioned themselves as alternatives to DirectX. Vulkan, for example, is seemingly popular.
So, let’s ask the obvious question…
What is Vulkan?
Vulkan is a cross-platform industry standard enabling developers to target a wide range of devices with the same graphics API.
Ah! The key part here is cross-platform. You can target various platforms with Vulkan: Windows, Linux, Mac (via MoltenVK4) Android, but also consoles (like the Switch) without needing to adopt various different graphics APIs.
This makes Vulkan an obvious choice if you plan on releasing a cross-platform game. Okay, but what does Vulkan have to do with Proton, I hear you ask?
Meet DXVK & VKD3D
Let’s start with DXVK:
A Vulkan-based translation layer for Direct3D 9/10/11 which allows running 3D applications on Linux using Wine.
Okay, so this attempts to make it possible to run older DirectX compatible games via Wine. Cool. It acts as a drop-in replacement.
Then, we’ve got VKD3D. (Which is a nice reference to DirectX’s key technology, D3D5.) Valve maintains a separate fork called VKD3D-Proton.
VKD3D-Proton is a fork of VKD3D, which aims to implement the full Direct3D 12 API on top of Vulkan. The project serves as the development effort for Direct3D 12 support in Proton.
This is honestly where most of the magic happens if you’re running some of the most recent games. Valve can also make certain improvements that are simply impossible to make on Windows. For example: Elden Ring!
A great example is how Valve is dealing with shader caching on the Steam Deck: since all units have the same CPU and GPU, all Steam Deck hardware can benefit from shared shader caches. This means less stuttering in games you’ll play on the device.
For example, Elden Ring is known to stutter the first time you enter a new area for this reason (async shader compute). By downloading the cached files (which happens automatically before launching the game) you’ll experience less stuttering, even if it is your first attempt at playing the game on your device.
DXVK-NVAPI
NVIDIA, the company responsible for the GeForce GPUs also have their own library that Valve have also had to account for (in order to support additional features).
DXVK-NVAPI: This repository provides an alternative implementation of NVIDIA’s NVAPI library for usage with DXVK and VKD3D-Proton. Its way of working is similar to DXVK-AGS, but adjusted and enhanced for NVAPI.
In the repository, they note:
DXVK-NVAPI does not and will never cover the complete surface of NVIDIA’s NVAPI. It is not meant as a full replacement, but rather as an addition to DXVK and VKD3D-Proton to enable several GPU features.
More Proton
These are the main parts that make Windows games possible on Linux, which is pretty damn impressive.
If you’d like a more thorough explanation, there’s also an interesting video I recommend, which, as far as I can tell, is made by the same person responsible for the ProtonGE fork.
I also recommend checking out ProtonDB if you are curious about Linux support for various popular games.
Conclusion
I’m sure that the Steam Deck will receive more software updates over the next couple of weeks and months, and that more games will become compatible when Steam Play gets improved.
(After all, even in the limited period of time since the Deck’s release there have been quite a few updates already.)
So far, I’ve been pleasantly surprised by the device, and I’m excited to be able to play more of my library on this nice handheld PC.
I haven’t been this impressed by new hardware since Apple released their M1 chip in late 2020, and the last time I was excited about a mobile handheld like this, it was when the Nintendo Switch launched, now half a decade ago.
Manjaro itself ran well, but there were various issues running games using Steam Play. For example, I was unable to run Persona 4 Golden back then, but with Proton Experimental that game runs perfectly on the Steam Deck today. (Finally, P4G has been released from the PS Vita, and is available on mobile once more!) ↩
My blog was not super popular, but I got a lot of random visitors who used Google Search on how to set up Ubuntu (with GNOME) on their computers. At the time, there used to be an option to install Ubuntu without additional partitioning using a tool called Wubi which was removed from Ubuntu in 2013. I think that was, for a good while, my most popular post. ↩
Barring various locale-related issues, using Wine was a good experience. For various obscure visual novels that I was reading at the time, virtualization was the better option. ↩
“MoltenVK is a layered implementation of Vulkan 1.1 graphics and compute functionality, that is built on Apple’s Metal graphics and compute framework on macOS, iOS, and tvOS. MoltenVK allows you to use Vulkan graphics and compute functionality to develop modern, cross-platform, high-performance graphical games and applications, and to run them across many platforms, including macOS, iOS, tvOS, Simulators, and Mac Catalyst on macOS 11.0+, and all Apple architectures, including Apple Silicon.” Source: MoltenVK repo. ↩
D3D stands for Direct3D: “Direct3D is a graphics application programming interface (API) for Microsoft Windows. Part of DirectX, Direct3D is used to render three-dimensional graphics in applications where performance is important, such as games.” Source: Wikipedia. ↩