<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet type="text/xsl" href="/index.xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>./techtipsy</title><link>https://ounapuu.ee/categories/gaming/</link><description>Recent content on ./techtipsy, a blog written by Herman Õunapuu.</description><generator>Hugo -- gohugo.io</generator><language>en-GB</language><managingEditor>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</managingEditor><webMaster>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</webMaster><lastBuildDate>Sun, 24 May 2026 06:00:00 +0300</lastBuildDate><atom:link href="https://ounapuu.ee/categories/gaming/index.xml" rel="self" type="application/rss+xml"/><item><title>You can run Forza Horizon 6 on an unsupported AMD RX 400/500 series GPU on SteamOS</title><link>https://ounapuu.ee/posts/2026/05/24/forza/</link><pubDate>Sun, 24 May 2026 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2026/05/24/forza/</guid><description>Compatibility layers can work in more ways than I thought.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2026/05/24/forza/media/cover_hu_ee486cb9b26a259d.jpg" width="1200" height="630" alt="You can run Forza Horizon 6 on an unsupported AMD RX 400/500 series GPU on SteamOS" /><p>This post serves as a personal bookmark and a mirror
of <a href="https://www.reddit.com/r/linux_gaming/comments/1ti2xpd/fixes_for_forza_horizon_6_fh101_cpu_cores_or/">this fantastic guide by Ok-Pace-1900 on /r/linux_gaming</a>
to ensure that this information does not get lost.</p>
<p>I learned the hard way that the GPU I have in a DIY Steam Machine PC, the AMD RX
480, <a href="https://forza.net/news/forza-horizon-6-thank-you">is strictly unsupported by Forza Horizon 6.</a></p>
<blockquote>
<p>Forza Horizon 6 will not work for AMD users with GPUs based on the Polaris or Vega architectures and older (for
example Radeon 400 and 500 series players). These architectures are below our minimum supported specification.</p>
</blockquote>
<p>I knew that asking for a refund on Steam would be the easy way out. Deciding against it, I did a quick search for the
FH201 error code and stumbled on the Reddit post mentioned above. My CPU is good enough for Forza Horizon 6 (Intel
i5-10500), so the additional launch options command that worked for me is the following:</p>
<pre tabindex="0"><code>VKD3D_FEATURE_LEVEL=12_1 VKD3D_CONFIG=descriptor_heap,no_upload_h_vram RADV_EXPERIMENTAL=heap,sync2 radv_wait_for_vm_map_updates=true %command% 
</code></pre>








<figure class="center">
  <a href="/posts/2026/05/24/forza/media/gaming.jpg">
    <img src="/posts/2026/05/24/forza/media/gaming_hu_6d44b8474b83d8ff.webp"
     width="1000"
     height="591"
     loading="lazy"
     decoding="async"
     alt="It&#39;s Forza time!">

  </a>
  <figcaption class="center">It&#39;s Forza time!</figcaption>
</figure>

<p>Simple fix, but the context around this is actually kind of funny. The way a lot of Windows-only games work on SteamOS
is via a translation layer referred to as Proton. With this trick, you can pretend that your GPU has some DirectX
features that it actually does not have, but it doesn&rsquo;t matter since it can be successfully emulated via translation to
Vulkan, which the GPU supports well!</p>
<p>As a result, I can play Forza Horizon 6 on a hacky SteamOS build, with 1080p low or medium settings. Low settings is a
60 FPS experience, with medium settings some areas like Tokyo can struggle a bit and drop below it to ~40 FPS.</p>
<p>Now all I need to do is to get rid of the urge to splurge on a great GPU, which would also require a case and PSU
upgrade&hellip;</p>
<p>Slightly off-topic, but can <em>you</em> monitor your gaming PC via Prometheus Node Exporter and visualize it in Grafana? :)</p>









<figure class="center">
  <a href="/posts/2026/05/24/forza/media/node-exporter.png">
    <img src="/posts/2026/05/24/forza/media/node-exporter_hu_5c71223cb1c6ecfe.webp"
     width="1000"
     height="373"
     loading="lazy"
     decoding="async"
     alt="DIY Steam Machine metrics, visible in Grafana. Because I can.">

  </a>
  <figcaption class="center">DIY Steam Machine metrics, visible in Grafana. Because I can.</figcaption>
</figure>

]]></content:encoded></item><item><title>SteamOS on a ThinkPad P14s gen 4 (AMD) is quite nice</title><link>https://ounapuu.ee/posts/2026/02/09/year-of-the-linux-desktop/</link><pubDate>Mon, 09 Feb 2026 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2026/02/09/year-of-the-linux-desktop/</guid><description>This is the year of the Linux (gaming) desktop. Or laptop.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2026/02/09/year-of-the-linux-desktop/media/cover_hu_fedc9f8a0aa21ac7.jpg" width="1200" height="630" alt="SteamOS on a ThinkPad P14s gen 4 (AMD) is quite nice" /><p>In April 2024, I wrote on the Lenovo ThinkPad P14s gen 4
and <a href="/posts/2024/04/12/lenovo-p14s-gen4/">how it does not suck under Linux.</a></p>
<p>That is still true. It&rsquo;s been fantastic, and a very reliable laptop during all that time.</p>
<p>The P14s gen 4 comes with a CPU that is still solid today, the AMD Ryzen 7 PRO 7840U, and that comes with impressive
integrated graphics in the form of an AMD Radeon 780M.</p>
<p><a href="/posts/2024/06/02/steam-deck/">I&rsquo;ve had a Steam Deck.</a></p>
<p><a href="/posts/2025/12/01/steam-machine/">I&rsquo;ve also accidentally built a Steam Machine.</a></p>
<p>I <em>had</em> to put SteamOS on this laptop to see how well it does. I did a quick Bazzite test the last time around, but
after being impressed with how well the stock SteamOS image runs on a random machine with an AMD GPU, I had to test
that, too.</p>
<h2 id="installing-steamos-on-usb-storage">
  <a class="heading-anchor" href="#installing-steamos-on-usb-storage">Installing SteamOS on USB storage<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The normal way to install SteamOS on a machine is
to <a href="https://help.steampowered.com/en/faqs/view/65B4-2AA3-5F37-4227">take the Steam Deck recovery image</a> and to install
it on your own machine that has one NVMe SSD.</p>
<p>I didn&rsquo;t want to do <em>exactly</em> that, I wanted to run it off of an USB SATA SSD, which the recovery image does not
support, as it hard-codes the target SSD for the SteamOS installation to <code>/dev/nvme0n1</code>. There&rsquo;s a handy project out
there <a href="https://github.com/louij2/steamos_custom_install">that customizes the recovery script</a> to allow you to install
SteamOS to <em>any</em> target device, but I learned about that after the fact.</p>
<p>I went a slightly different route: I imaged the SteamOS installation from
my <a href="/posts/2025/12/01/steam-machine/">DIY Steam Machine build,</a> wrote it to the 4TB USB SSD that I had available for
testing, and after that I resized the <code>/home</code> partition to take up the full disk. <em>Bam,</em> clean SteamOS on a USB SSD!</p>
<p>Oh, and before I did that, I did the same process but to a 128 GB Samsung FIT USB 3.0 thumb drive.</p>
<p><strong><em>It worked.</em></strong></p>
<p>The game library images did load a bit slowly, but it was a great demonstration of how low you can go with the hardware
requirements. I wouldn&rsquo;t recommend <em>actually</em> installing games on such a setup as that would likely kill the USB thumb
drive very quickly.</p>
<h2 id="performance">
  <a class="heading-anchor" href="#performance">Performance<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I ran the SteamOS setup on this laptop over a USB-C dock that only supports running at up to 4K at 30Hz, so I did
testing at 1080p 60Hz setup. You&rsquo;re unlikely to want to run this setup at 4K anyway, unless you&rsquo;re a fan of light, easy
to run games like Katamari or Donut County.</p>
<p>In most games, the experience was enjoyable. 1080p resolution, maybe change the settings to medium or low in some cases,
and you&rsquo;ll likely have a solid gaming experience.</p>
<p>Forza Horizon 4? No problem, 1080p high settings and a solid, consistent experience.</p>
<p>Need for Speed Hot Pursuit Remastered was an equally enjoyable experience, and I did not have to turn the settings down
from high/ultra.</p>
<p>God of War Ragnarök was pushing the setup to the limits. With 1080p, low/medium settings you can expect 30+ FPS. If you
include AMD FSR settings in the mix and also enable FSR frame generation, you can have a perfectly enjoyable 50-60 FPS
experience. Some UI hints were a bit &ldquo;laggy&rdquo; with frame generation, but I&rsquo;m genuinely surprised how well that rendering
trick worked. I&rsquo;ll admit it, my eyesight is not the best, but given the choice of a crisp but laggy picture, and a
slightly blurrier but smoother experience, I&rsquo;d pick the latter. After a pint of Winter Stout, you won&rsquo;t even notice the
difference.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>Wreckfest was also heaps fun. It did push the limits of the GPU at times, but running it at 1080p and medium/high
settings is perfectly enjoyable.</p>
<p>The observed power usage throughout the heaviest games measured via SteamOS performance metrics (<code>mangohud</code>) were around
30-40 W, with the GPU using up the most of that budget. In most games, the CPU was less heavily loaded, and in the games
that required good single thread performance, it could provide it.</p>
<h2 id="the-steamos-revolution">
  <a class="heading-anchor" href="#the-steamos-revolution">The SteamOS revolution<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I like SteamOS. It&rsquo;s intentionally locked down in some aspects (but you can unlock it with one command), and the
Flatpak-only approach to software installation will make some people mad, but I like this balance. It almost feels like
a proper console-type experience, <em>almost</em>.</p>
<p>Valve does not officially support running SteamOS on random devices, but they haven&rsquo;t explicitly prevented it either.
I <em><strong>love</strong></em> that.</p>
<p>Take any computer from AMD that has been manufactured from the last 5 years, slap SteamOS on it, and there is a very
high chance that you&rsquo;ll have a lovely gaming experience, with the level of detail and resolution varying depending on
what hardware you pick.</p>
<p>A top of the line APU from AMD seems to do the job well enough for most casual gamers like
myself, and if <a href="https://frame.work/ee/en/desktop?tab=gaming">the AMD Strix Halo based systems were more affordable,</a> I
would definitely recommend getting one if you want a small but efficient SteamOS machine.</p>
<p>Last year, we saw the proliferation of gaming-oriented Linux distros.</p>
<p>The Steam Machine is shipping this year.</p>
<p><a href="https://www.youtube.com/watch?v=URbW3j_GYKg">DankPods is covering gaming on Linux.</a></p>
<p>2026 <em><strong>has</strong></em> to be the year of the Linux (gaming) desktop.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>that&rsquo;s the <em>tipsy</em> part in <em>techtipsy</em>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Oops, I accidentally built a Steam Machine</title><link>https://ounapuu.ee/posts/2025/12/01/steam-machine/</link><pubDate>Mon, 01 Dec 2025 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/12/01/steam-machine/</guid><description>I was longing for a Steam Deck that had more oomph. Guess Valve felt that way, too.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/12/01/steam-machine/media/cover_hu_1163f60b6daf33d9.jpg" width="1200" height="630" alt="Oops, I accidentally built a Steam Machine" /><p><a href="/posts/2024/06/02/steam-deck/">I like the Steam Deck.</a> It&rsquo;s what convinced me that gaming on Linux is actually viable
now.</p>
<p>But after playing through games like God of War Ragnarök<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, I felt like I needed an upgrade. I love playing with the
Steam Deck, but what I love more is playing without having to worry about playing around with graphics settings a lot.
Great story and gameplay can only hide the fact that you&rsquo;re running at 720p 30Hz on a big screen for a little bit.</p>
<p>I also get to play relatively rarely, so I might as well make it a better, more enjoyable experience. Quality vs
quantity.</p>
<h2 id="the-specs">
  <a class="heading-anchor" href="#the-specs">The specs<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I went on a look-out for a used PC with roughly these requirements:</p>
<ul>
<li>any modern 6-core CPU or better
<ul>
<li>includes both Intel and AMD as the CPU does not matter much here<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></li>
</ul>
</li>
<li>an AMD GPU that can do 1080p/4K gaming, depending on the game
<ul>
<li>NVIDIA was out of the question due to lack of support on SteamOS</li>
<li>Intel GPUs are a risk that I was not willing to take right now</li>
</ul>
</li>
<li>16+GB RAM</li>
<li>has to support an NVMe drive
<ul>
<li>using the SteamOS recovery image method is dependent on this</li>
</ul>
</li>
<li>acceptable case, PSU and cooling setup
<ul>
<li>if it does not burn the house down and makes the machine cool and quiet, then I&rsquo;m fine with anything</li>
</ul>
</li>
</ul>
<p>The AMD GPU being a hard requirement turned out to be an interesting challenge. I wasn&rsquo;t looking into putting together a
custom build, but was rather going for a setup that works and that I can customize according to my specific needs. Turns
out that most of the PC-s out there on the market are all based around NVIDIA GPU-s, and AMD builds of this range are
relatively rare, with a guesstimate of the ratio being roughly 10 NVIDIA-based machines to 1 AMD-based machine. The good
side of this is that the selection process was made way simpler as I got to choose between 3-4 options in the end.</p>
<p>During my search I also saw some machines that I would call absolute overkill, and I <em>almost</em> got one in a bidding war,
but eventually I found a more sensible option. It also included a monitor, keyboard, mouse and three SSD-s that I didn&rsquo;t
really need, but the PC itself was decent.</p>
<p>Here&rsquo;s what I landed on:</p>
<ul>
<li>Intel i5-10500
<ul>
<li>6 cores 12 threads at a reasonable speed (4.2 GHz in real-life use)</li>
</ul>
</li>
<li>adequate Cooler Master CPU cooler that does a lot of RGB if needed</li>
<li>16 GB DDR4 RAM @ 2666 MT/s
<ul>
<li>I soon upgraded this to 32 GB because my brother had some leftover modules from his own memory upgrade</li>
<li>I forced the modules to run at 3200 MT/s. It&rsquo;s memtest-stable so good enough for me.</li>
</ul>
</li>
<li>AMD RX 6600XT with 8GB VRAM
<ul>
<li>some might scoff at the VRAM amount, but coming from a Steam Deck where 16GB was shared between CPU <em>and</em> GPU,
this is plenty!</li>
</ul>
</li>
<li>512GB NVMe SSD</li>
<li>three 256GB SATA SSD-s
<ul>
<li>previous owner put them in as RAID0, which is clever and works well as a game library</li>
</ul>
</li>
<li>some Gigabyte motherboard that works
<ul>
<li>it really doesn&rsquo;t matter here</li>
</ul>
</li>
<li>some Fractal Design case, possibly a Define-series one
<ul>
<li>all I know is that it&rsquo;s huuuuuuuuuge</li>
</ul>
</li>
</ul>









<figure class="center">
  <a href="/posts/2025/12/01/steam-machine/media/internals.jpg">
    <img src="/posts/2025/12/01/steam-machine/media/internals_hu_bf4c78ee5ba4e1f5.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="The inside look into the build.">

  </a>
  <figcaption class="center">The inside look into the build.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/12/01/steam-machine/media/rgb.jpg">
    <img src="/posts/2025/12/01/steam-machine/media/rgb_hu_7d50a9a9017e9a2e.webp"
     width="751"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="The RGB glow doubles as a night light.">

  </a>
  <figcaption class="center">The RGB glow doubles as a night light.</figcaption>
</figure>

<p>All-in-all, it cost me 365 EUR in Estonia in October 2025, and so far I&rsquo;ve made about 25 EUR back from the SSD sales
alone, with some items still up for sale. It&rsquo;s not as portable as a Steam Deck, but it&rsquo;s cheaper even if we account for
the cost of the game controller and cables/accessories/adapters that you usually need.</p>
<h2 id="the-setup">
  <a class="heading-anchor" href="#the-setup">The setup<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Regarding the operating system choice, I tried both SteamOS from the Steam Deck recovery image,
and <a href="https://bazzite.gg/">Bazzite</a>. Both work fine and in the default couch gaming mode you won&rsquo;t notice a difference,
but I ended up defaulting to SteamOS because I had my setup and configuration changes tuned around that. The SteamOS
recovery image approach does assume that you have an NVMe drive available, so if you lack one, you&rsquo;re better off trying
Bazzite as that can be installed on any drive.</p>
<p>I replaced the NVMe SSD with a cheap 128GB one and utilized the bigger drive
in <a href="/posts/2025/11/18/lattepanda-iota/">the LattePanda IOTA setup</a> that now serves as my home server.</p>
<p>As a game library drive, I took a 1TB Samsung SSD that I had around, which roughly matches the storage that I had
available on my Steam Deck that I ended up modding with a 1TB M.2 2230 SSD. With games like God of War Ragnarök taking
up around <strong><em>176GB</em></strong>, it&rsquo;s not going to be the most luxurious arrangement, but for now it&rsquo;s okay.</p>
<p>The Fractal case that it came up with was one that is fully metal, with sound dampening material present on the side
panels. It&rsquo;s a bit banged up, but still a pretty nice experience if you have the room for storing one in your setup. The
case had one flaw that I stumbled upon: the power button on the Fractal case liked to get stuck, which seems to be a
common issue with that model. I fixed that with a random power button that I sourced from a local electronic parts
supplier for a few euros and that works really well now, with the additional bonus of it being <em>slightly</em> more
cat-proof.</p>
<p>The default fan curves on the motherboard were a bit too aggressive, so I had to slightly tune them down, and now the
machine is quiet while doing a great job with keeping the internals cool. You can hear a subtle whirring when you&rsquo;re in
the same room with it, but during gaming it stays at reasonable volumes and is not noticeable. Certainly quieter than a
Steam Deck would be.</p>
<h2 id="the-gaming-experience">
  <a class="heading-anchor" href="#the-gaming-experience">The gaming experience<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The AMD GPU is a low/midrange model, but it gets the job done in 1080p gaming, and with a lot of titles it can do 4K
with ease. In God of War Ragnarök I stuck with 1080p and cranked the settings, but with games like Need for Speed Hot
Pursuit Remastered, I pushed the resolution to 4K with high/ultra settings, and it runs smoothly at 60Hz.</p>
<p>This setup also taught me that <em><strong>Linux supports HDR now</strong></em>, which was news to me! My tech setup usually lags behind the
state of the art, mostly because I don&rsquo;t really see a need to upgrade to the latest and greatest thing out there if the
current one works well enough, but this was a really nice surprise. My TV has a crappy HDR implementation, so I don&rsquo;t
get the full HDR experience, but it&rsquo;s nice to see the TV show that HDR logo when I start up the machine.</p>
<p>Regarding the gaming experience, I&rsquo;ve only noticed a few sore spots.</p>
<p>For whatever reason, the Need for Speed (2015) just does not start up on anything but an actual Steam Deck. It just
doesn&rsquo;t work here. I can&rsquo;t be arsed to investigate this yet, the wonky physics in this game are perhaps not worth that
effort.</p>
<p>It&rsquo;s also clear that the choice of an Intel CPU is generally fine, but in God of War Ragnarök it was running <em>too</em> well,
so the CPU kept dropping down to lower clock speeds, which then made the game performance inconsistent. Finding that
this was the issue was actually quite straightforward: when I first loaded the game, the shader compilation was taking
place in the background and even though the CPU was at a constant 100% usage, the game ran quite smoothly. It only
started stuttering after that was done, and the integrated <code>mangohud</code> setup helped confirm the issue as its most
detailed preset shows the frame time and CPU clock speed graphs really well.</p>
<p>Since this is just a Linux box, then you can of course run a few commands to fix it.<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup></p>
<p>Here&rsquo;s how I fixed it.</p>
<p>Create a desktop entry at <code>/home/deck/.local/bin/its-gaming-time.desktop</code> with the contents:</p>
<pre tabindex="0"><code>[Desktop Entry]
Name=Gaming Time!
Exec=/home/deck/.local/bin/its-gaming-time
Comment=
Icon=
Type=Application
Terminal=true
</code></pre><p>Create a file <code>/home/deck/.local/bin/its-gaming-time</code> with the contents:</p>
<pre tabindex="0"><code>#!/bin/bash
# Set performance mode
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

# Set min_perf_pct to 100 (forces min freq = max freq)
echo 100 | sudo tee /sys/devices/system/cpu/intel_pstate/min_perf_pct
</code></pre><p>Don&rsquo;t forget to mark the script as executable with <code>chmod +x /home/deck/.local/bin/its-gaming-time</code>.</p>
<p>Note that the script above does require that you have set up passwordless <code>sudo</code> on the SteamOS installation.
This can be configured in <code>/etc/sudoers.d/wheel</code>, just make sure that the line starting with <code>%wheel</code> looks like this:</p>
<pre tabindex="0"><code>%wheel ALL=(ALL) NOPASSWD: ALL
</code></pre><p>With all that set up, in desktop mode, right-click on the desktop shortcut, &ldquo;Add to Steam&rdquo;, and now you can run this
script any time in Steam gaming mode, even while a game is running!</p>
<p>All-in-all, I&rsquo;m very satisfied with the experience that a cheap gaming PC box provides with SteamOS. The installation is
painless, my wireless controllers just work, and aside from a few rare exceptions, my games run really well.</p>
<p>It&rsquo;s also way easier on my eyes and with the 4K resolution I can actually see oncoming cars better in games like Need
for Speed Hot Pursuit Remastered.<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup></p>
<h2 id="the-gabecube">
  <a class="heading-anchor" href="#the-gabecube">The GabeCube<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Less than three weeks after buying that gaming
PC, <a href="https://store.steampowered.com/sale/steammachine">the Steam Machine was officially announced.</a></p>
<p>The <strong><em>rumored</em></strong> specs suggesting a 6 core/12 thread CPU, 16GB DDR5 RAM, and a custom 8GB VRAM AMD GPU that seems
to be roughly comparable to an AMD RX 6600XT-ish level of performance.</p>
<p>It seems that I have accidentally built a Steam Machine. Oops.</p>
<p>Of course, the specs and final performance are not public at the time of writing, and the Steam Machine has many
benefits (better SteamOS compatibility, good WiFi, smaller size, likely more efficient and quiet), but it&rsquo;s still
interesting how close I got with my setup and selection criteria.</p>
<p>I was slightly disappointed that I got this machine right before that announcement, but then I reminded myself of the
fact that I can enjoy games on the big screen <em><strong>right now,</strong></em> and the Steam Machine is scheduled for a release in Q1
2026, which can be as late as 31st of March 2026.</p>
<p>And hey, when the Steam Machine <em>does</em> come out and I decide to get one, the current gaming desktop will make for a very
good home server candidate with all the room that it has available, and all the six SATA ports on the motherboard
sure look tempting. I&rsquo;m pretty sure that the Fractal case also allows something crazy like 17+ hard drives installed in
it.</p>
<p>This approach of building my own Steam Machine of sorts did lead to me selling my Steam Deck. Better to have someone
else enjoy it than having it sit in a box until its battery dies. That also serves as a major sign of confidence for
this big box that makes my sparse downtime sessions more fun.</p>
<p>If you have a machine with a modern AMD GPU, then give SteamOS a try, you might be surprised at how well it works. Even
a laptop with an AMD APU can do it, as long as you temper your expectations regarding the image quality.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>it&rsquo;s a banger, try it if you&rsquo;re into the story, or you just want to indiscriminately smash and kill.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>this is called <em>foreshadowing</em>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>some might see it as &ldquo;ugh, Linux moment&rdquo; type of thing, but I see it as freedom to fix issues that you would
otherwise be unable to even diagnose and address. Power to the players!&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p>you can probably tell that I had a blast replaying that game for the 5th time recently. It&rsquo;s not even the best NFS
game, and yet I love playing it over and over again.&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>About the time my ThinkPad T430 ran with an external GPU</title><link>https://ounapuu.ee/posts/2024/07/03/thinkpad-t430-egpu/</link><pubDate>Wed, 03 Jul 2024 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2024/07/03/thinkpad-t430-egpu/</guid><description>I had dumb ideas during my university days as well, but the budget was smaller.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2024/07/03/thinkpad-t430-egpu/media/cover_hu_edb0986a7ce4b00b.jpg" width="1200" height="630" alt="About the time my ThinkPad T430 ran with an external GPU" /><p>The ThinkPad T430 is not a remarkable laptop. It&rsquo;s thick, bulky and built like
a tank. I got mine in 2016 when the first university scholarship money dropped,
and it&rsquo;s still my backup laptop of choice.</p>
<p>Around 2017 I did something every reasonable poor computer science student
would do: I got an eGPU adapter for it to play some games. I never ended up
playing many games, but I loved tinkering with and testing this setup a lot.</p>
<p>These are my notes on the setup that I used to have. The notes used to be on
Reddit, but after yet another user-hostile change<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> I deleted my account
and all the content associated with it.</p>
<h2 id="the-specs">
  <a class="heading-anchor" href="#the-specs">The specs<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The ThinkPad T430 that I used had a CPU swap at one point, running an Intel
i7-3820QM. This upgrade doubled the CPU performance on the laptop compared
to the dual-core CPU that was in it before. This change was critical because
it opened the door to running lots of modern games at reasonable performance.</p>
<p>The eGPU adapter I ran with was the EXP GDC Beast v8.4, using the ExpressCard34
connector. This adapter turned the ExpressCard34 slot into a PCIe 2.0 x1 slot.
It&rsquo;s not really hotpluggable, but using this connector instead of something
like the internal Wi-Fi adapter slot made this setup much more portable. Done
gaming? Shut down, disconnect the ExpressCard cable and you&rsquo;re good to go!</p>
<p>This adapter is also a good example of connector reuse. The other end of the
ExpressCard plug is an HDMI port. Video signals require good quality cables, and
so does PCI Express.</p>









<figure class="center">
  <a href="/posts/2024/07/03/thinkpad-t430-egpu/media/egpu-connector.jpg">
    <img src="/posts/2024/07/03/thinkpad-t430-egpu/media/egpu-connector_hu_bcf4ea89c1948520.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="Close-up of the ExpressCard34 connector.">

  </a>
  <figcaption class="center">Close-up of the ExpressCard34 connector.</figcaption>
</figure>

<p>The eGPU was once powered by a simple ATX PSU with the jumper wire set on the
24-pin connector, but eventually I bought a Dell DA-2 power supply. The adapter
has a power connector designed specifically for that pinout and it made the setup
a lot cleaner.</p>









<figure class="center">
  <a href="/posts/2024/07/03/thinkpad-t430-egpu/media/egpu-atx.jpg">
    <img src="/posts/2024/07/03/thinkpad-t430-egpu/media/egpu-atx_hu_c7488d9aa2981290.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="The setup with an ATX PSU.">

  </a>
  <figcaption class="center">The setup with an ATX PSU.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/07/03/thinkpad-t430-egpu/media/egpu-psu.jpg">
    <img src="/posts/2024/07/03/thinkpad-t430-egpu/media/egpu-psu_hu_367576f51290bf0e.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="The setup with a Dell DA-2 PSU. Much cleaner, isn&#39;t it?">

  </a>
  <figcaption class="center">The setup with a Dell DA-2 PSU. Much cleaner, isn&#39;t it?</figcaption>
</figure>

<p>At one point I got a fully metal case for the eGPU. It made the setup a lot cleaner
and the risk of the GPU tipping over while turned on was also substantially reduced.</p>









<figure class="center">
  <a href="/posts/2024/07/03/thinkpad-t430-egpu/media/egpu-case.jpg">
    <img src="/posts/2024/07/03/thinkpad-t430-egpu/media/egpu-case_hu_aaa43de0ce81aed3.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="The case had no right to be this good for a janky setup.">

  </a>
  <figcaption class="center">The case had no right to be this good for a janky setup.</figcaption>
</figure>

<p>I tested a few GPU-s:</p>
<ul>
<li>AMD Radeon HD 6870</li>
<li>nVidia GTX 950</li>
<li>nVidia GTX 1080</li>
<li>AMD Radeon RX 480</li>
</ul>
<p>The HD 6870 was an old card back in 2017, and it did not run great at all with
this eGPU adapter. It was buggy and the performance sucked.</p>
<p>Loaner GPU-s, such as the RX 480 and GTX 1080 were much better experiences, as
long as you output the video signal to an external display right from the GPU.</p>
<p>The nVidia GTX 950 was the card I ran with for the longest time in this setup.
It worked well with this setup and had decent gaming performance.</p>









<figure class="center">
  <a href="/posts/2024/07/03/thinkpad-t430-egpu/media/gpuz-info.jpg">
    <img src="/posts/2024/07/03/thinkpad-t430-egpu/media/gpuz-info_hu_e074ca0f223b64ac.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="GPU-z info while the GPU is idle. Note that the PCIe link speed is set to gen 1.1 under &#34;Bus Interface&#34;.">

  </a>
  <figcaption class="center">GPU-z info while the GPU is idle. Note that the PCIe link speed is set to gen 1.1 under &#34;Bus Interface&#34;.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/07/03/thinkpad-t430-egpu/media/gpuz-linkspeed.jpg">
    <img src="/posts/2024/07/03/thinkpad-t430-egpu/media/gpuz-linkspeed_hu_c99b51ff47cc1c11.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="When the GPU is under load, the PCIe connection switches to PCIe 2.0.">

  </a>
  <figcaption class="center">When the GPU is under load, the PCIe connection switches to PCIe 2.0.</figcaption>
</figure>

<h2 id="egpu-tech-tips">
  <a class="heading-anchor" href="#egpu-tech-tips">eGPU tech tips<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>You will want to use an eGPU adapter with an external monitor for the best performance.
The PCIe bandwidth is very limited in a setup like this. Using the internal
display of the laptop will mean that the final rendered image will have to be
sent back from the eGPU to the CPU. 1x PCIe 2.0 lane is about 500 MB/s of bandwidth.
Sending 60+ frames in the native resolution (1600x900) will eat it all up.
The higher the resolution on the internal display, the fewer frames you&rsquo;ll get.</p>
<p>I tested out these two scenarios in CSGO. The internal display yielded about 61 FPS
while an external display would result in 100-180+ FPS.</p>
<p>The PCIe link bandwidth was not actually that noticeable in a lot of games, such
as GTA V, Rocket League and Dirt 3.</p>
<p>In some games, such as Dirt Rally (2015), it did not matter what settings
you went with, something about the game made it run poorly no matter what
graphics settings you went with. In cases like that you might as well cap the
framerate to something tolerable like 30 FPS and crank the graphics settings up.</p>
<h2 id="vfio-on-a-laptop">
  <a class="heading-anchor" href="#vfio-on-a-laptop">VFIO on a laptop???<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This setup was also around the time when I first learned about <a href="https://youtu.be/16dbAUrtMX4">the magical world
of VFIO and GPU passthrough.</a></p>
<p>The logical continuation of that discovery was to try it out on my laptop, and
to my surprise it actually worked. I could pass the eGPU to a VM and play GTA V
on it!</p>
<p>This setup ran on Antergos OS, a flavor of Arch Linux. <a href="https://en.wikipedia.org/wiki/Antergos">It&rsquo;s been so long since then that the flavor
of Arch Linux is now discontinued.</a><sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>









<figure class="center">
  <a href="/posts/2024/07/03/thinkpad-t430-egpu/media/egpu-vfio.jpg">
    <img src="/posts/2024/07/03/thinkpad-t430-egpu/media/egpu-vfio_hu_b6f5e698500d56ab.webp"
     width="800"
     height="600"
     loading="lazy"
     decoding="async"
     alt="Antergos OS on the host, Windows 10 on the guest VM running Furmark.">

  </a>
  <figcaption class="center">Antergos OS on the host, Windows 10 on the guest VM running Furmark.</figcaption>
</figure>

<p>The laptop was ideal for this purpose as well. You have the integrated GPU, display,
keyboard and mouse for the host system, and you can pass USB devices and the eGPU
to the VM.</p>
<p>There were the usual VFIO tricks that I had to try out to avoid the dreaded
<code>error code 43</code> issue, but after that it was smooth sailing.</p>
<p>The performance was very similar to what I saw on the host system.</p>
<p><a href="/posts/2024/07/03/thinkpad-t430-egpu/media/egpu.webm">Here&rsquo;s a clip of me recording this setup while playing GTA V.</a> Smartphone cameras have
come a long way since then.</p>
<h2 id="expresscard-egpu-s-in-2024">
  <a class="heading-anchor" href="#expresscard-egpu-s-in-2024">ExpressCard eGPU-s in 2024?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>What got me started with writing down my notes were <a href="https://youtu.be/390FuyadPIw">some YouTube videos that were
made on this topic recently.</a></p>
<p>A pimped-out ThinkPad T430 can still be a perfectly serviceable computer in 2024,
and an eGPU will completely sidestep the problem of the weak integrated GPU.</p>
<p>The T430 is not powerful enough to natively run a 3440x1440 ultrawide monitor at
60 Hz. It is even struggling to do it at 30 Hz. An eGPU adapter with a modern
low-power GPU, such as the AMD Radeon RX 6400, could solve this issue nicely and
give the ThinkPad T430 a new lease of life.</p>
<p>I&rsquo;d be lying if I wasn&rsquo;t considering remaking this setup with everything I&rsquo;ve
learned 6 years later. GPU pricing sucks, though.<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>
They still sell these eGPU kits in various forms, however the price has doubled
or even tripled over the years.</p>
<p>If you&rsquo;re interested in building a similar setup, then do check out <a href="https://egpu.io/">egpu.io</a>.
With an M.2 or Thunderbolt connector you can build a much more capable eGPU setup.</p>
<p><a href="https://www.youtube.com/watch?v=SH9RUpK4SsM">If you can get a PCI Express signal out of a computer, then you can probably
rig a GPU up to it.</a> Unless you&rsquo;re
Jeff Geerling, in which case you might need to <a href="https://www.jeffgeerling.com/blog/2023/external-gpus-working-on-raspberry-pi-5">recompile the kernel a few times.</a></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>guess which one.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>validates my view that it&rsquo;s still a good idea to stick to the big distros
that these short-lived Linux distros are based off of.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>I&rsquo;ve survived two cryptocurrency mining hype cycles, and now we are in an
LLM bubble. Great.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Steam Deck: I like it</title><link>https://ounapuu.ee/posts/2024/06/02/steam-deck/</link><pubDate>Sun, 02 Jun 2024 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2024/06/02/steam-deck/</guid><description>It runs Linux and you can peek under the hood if you want to, but that's not the point.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2024/06/02/steam-deck/media/cover_hu_de171b612b822e85.jpg" width="1200" height="630" alt="Steam Deck: I like it" /><p>I got a <a href="https://store.steampowered.com/steamdeck">Steam Deck</a>.</p>
<p>Only took me a year or so of contemplating getting
one, <a href="/posts/2022/12/01/holoiso-steam-deck-experience/">and trying out HoloISO, the unofficial SteamOS installer</a>
finally convinced me to get one.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>It took another year to actually get down to writing down my thoughts on it.</p>
<p>This post is written from the perspective of a software developer who used to play video games a lot as a teenager,
less so as an adult, and as someone who dabbles with Linux as a hobby.</p>
<h2 id="overview">
  <a class="heading-anchor" href="#overview">Overview<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The <a href="https://www.steamdeck.com/en/oled">Steam Deck OLED exists now</a>, but back when I got my Steam Deck, it came in three flavours, and in the interests of my
budget I opted for the cheapest option that came with
only 64 GB of storage (eMMC based).</p>









<figure class="center">
  <a href="/posts/2024/06/02/steam-deck/media/deck-packaging.jpg">
    <img src="/posts/2024/06/02/steam-deck/media/deck-packaging_hu_61f9f98d0950e0bc.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Steam Deck, the packaging, and cat.">

  </a>
  <figcaption class="center">Steam Deck, the packaging, and cat.</figcaption>
</figure>

<p>I also got a 512 GB microSD card to hold all the games.
All in all, this setup cost about 470 EUR. Certainly cheaper than the 512 GB NVMe SSD model that sold for 679 EUR at
the time of writing. The shipping estimate to Estonia was about 1-2 weeks, and mine arrived in almost exactly 1 week,
which was nice. And in one piece as well!</p>









<figure class="center">
  <a href="/posts/2024/06/02/steam-deck/media/deck-storage.jpg">
    <img src="/posts/2024/06/02/steam-deck/media/deck-storage_hu_64cca68031d3f7fe.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Half a terabyte of games, all in that small microSD card.">

  </a>
  <figcaption class="center">Half a terabyte of games, all in that small microSD card.</figcaption>
</figure>

<p>I don&rsquo;t have the official <a href="https://www.steamdeck.com/en/dock">Steam Deck Dock</a> (try saying that 10 times in a row), but what I do have is a vertical laptop
stand and a Dell WD19TB dock. As long as you leave a gap for airflow, then this combination works quite well if you
want to use the Steam Deck in a docked mode. The combination of this dock and the Steam Deck also works nicely, the
3440x1440p ultrawide monitor gets picked up fine and even the gigabit Ethernet port works at the rated speed.</p>
<p>However, it seems like the Steam Deck USB-C compatibility can be dependent on your monitor and dock choice. While the Dell
WD19TB dock worked great with an ultrawide monitor, a Lenovo Thinkpad USB-C dock would fail to output anything to
the same monitor quite often. Turning on the setting to enable safe resolutions for the external display
and setting the resolution manually usually fixes it, but it&rsquo;s still quite annoying.</p>









<figure class="center">
  <a href="/posts/2024/06/02/steam-deck/media/deck-dock.jpg">
    <img src="/posts/2024/06/02/steam-deck/media/deck-dock_hu_39dbc18f3acf6a04.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Steam Deck docked. ">

  </a>
  <figcaption class="center">Steam Deck docked. </figcaption>
</figure>

<h2 id="its-booting-linux">
  <a class="heading-anchor" href="#its-booting-linux">It&rsquo;s booting Linux!<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Not long after I set the Steam Deck up, I switched to desktop mode and opened a terminal window to confirm that yes,
this thing is running Linux. Arch Linux, in fact, or at least a modified version of it.</p>









<figure class="center">
  <a href="/posts/2024/06/02/steam-deck/media/deck-terminal.jpg">
    <img src="/posts/2024/06/02/steam-deck/media/deck-terminal_hu_a5e83bb27b56f91c.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="btw I run Arch">

  </a>
  <figcaption class="center">btw I run Arch</figcaption>
</figure>

<p>But in all other aspects, it&rsquo;s just like a normal computer, with an actual UEFI setup that you can browse.
With the Steam Deck, you get the polished experience of a gaming console and the
freedom to do whatever you want to with the software and hardware.</p>
<p>You can also boot any x86-based Linux distro, like Fedora Linux.</p>









<figure class="center">
  <a href="/posts/2024/06/02/steam-deck/media/deck-fedora.jpg">
    <img src="/posts/2024/06/02/steam-deck/media/deck-fedora_hu_2ee4a7319253bc45.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="If all my other computers stopped working, then I could totally work out of a Steam Deck.">

  </a>
  <figcaption class="center">If all my other computers stopped working, then I could totally work out of a Steam Deck.</figcaption>
</figure>

<p>Or if SteamOS 3 is too limiting for you, then check out projects like <a href="https://bazzite.gg/">Bazzite.</a>
The experience will be very similar, but it&rsquo;s easier to tweak the setup to your
liking. Bazzite also allows you to format storage as <code>btrfs</code> with compression
enabled, meaning that you can fit more games on your device with a very slight
increase in CPU usage. I&rsquo;m sticking with the official Steam Deck experience for
now, but I&rsquo;m tempted to try Bazzite for the <code>btrfs</code> aspect alone.</p>
<p>The desktop experience on the Steam Deck is quite nice. You can easily boot into it
from the graphical interface, and it runs on KDE Plasma. The design language of KDE is an eyesore, but it makes up for it with the responsive UI.</p>
<p>The touchpads are not that big, but they&rsquo;re plenty good for
clicking around. Manually popping up the on-screen keyboard by pressing <code>STEAM + X</code> is a bit annoying at first,
but it gets the job done.</p>
<p>Installing software can be done in the graphical environment via the &ldquo;Discover&rdquo; app that ships with the desktop
environment.
One thing you&rsquo;ll probably notice is that the selection of software is a bit limited, and that&rsquo;s mainly down to how
the Steam Deck is set up by default. All the apps you install are installed via <a href="https://flatpak.org/">Flatpak</a> and while the selection of apps
that are available as a Flatpak grows with time, not everything is yet present there.</p>
<p>I was surprised to see that the <a href="https://help.steampowered.com/en/faqs/view/671A-4453-E8D2-323C">Steam Deck Desktop FAQ</a>
actually has useful information for an enthusiast like myself, even mentioning what a flatpak is.</p>
<h2 id="peeking-under-the-hood">
  <a class="heading-anchor" href="#peeking-under-the-hood">Peeking under the hood<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>During the first couple of months I went the tinkerers&rsquo; path, enabled the SSH server, unlocked the root partition for
modifications and automated the setup of my Steam Deck. While this thing is running a flavor of Arch Linux, it&rsquo;s not
really designed for these types of manual modifications. I had to mess around to get the Arch default package manager
<code>pacman</code> to work, but at one point messing with <code>pacman</code> and running commands that I didn&rsquo;t know much about, I blew up
the OS by force-installing some packages and throwing out a crucial dependency. Whoops.</p>
<p>Well, at least the Steam Deck OS recovery setup is quite straightforward. Download the OS recovery image, put it on an
USB stick, boot it on the Steam Deck and re-image the OS. There are also options to attempt repairs or open a terminal
window in case you know how to fix the mess you&rsquo;ve created.</p>
<p>One downside of the SteamOS recovery setup became apparent when Valve released a buggy software update around
summer/fall of 2023. The update was buggy for many users, including myself, with games crashing or running poorly. On my
Deck the SD card was also automatically reformatted for some reason so I had to redownload all the games I had on that. When I went to
download the recovery image, I discovered that you could only go back to the current, buggy version of Steam Deck OS.</p>
<p>By fiddling with the download link I could navigate to a web directory where older recovery images were present. Those
weren&rsquo;t much help though. Although you could boot into an older version during the initial Steam Deck setup, it would
auto-update to the newest version automatically, with no obvious way to bypass it.</p>
<p>The real workaround would have been
to manually boot into the older version of the OS that sits on the other partition and not update for a while. I unfortunately
discovered that <em>after</em> I had re-imaged the Steam Deck, which formats the whole drive.</p>
<p>I&rsquo;ve now stopped with the tinkering. I still have an SSH server running on it, but it&rsquo;s
there so that I can install my favourite applications as flatpaks and deploy the
backup script, via Ansible. That&rsquo;s it.</p>
<h2 id="its-booting-windows">
  <a class="heading-anchor" href="#its-booting-windows">It&rsquo;s booting&hellip; Windows?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>









<figure class="center">
  <a href="/posts/2024/06/02/steam-deck/media/deck-windows.jpg">
    <img src="/posts/2024/06/02/steam-deck/media/deck-windows_hu_bae718fc31869609.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Cursed Steam Deck.">

  </a>
  <figcaption class="center">Cursed Steam Deck.</figcaption>
</figure>

<p>Don&rsquo;t worry, Valve doesn&rsquo;t even officially support running Windows on this thing,
and <a href="https://store.steampowered.com/news/app/1675200/view/3131696199122435099">while you can do it</a>, I don&rsquo;t
really recommend it. You&rsquo;ll be giving up all the nice things about SteamOS while
also taking on the hassle of running Windows, including unexpected Windows updates.</p>
<h2 id="games-are-too-damn-big">
  <a class="heading-anchor" href="#games-are-too-damn-big">Games are too damn big<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>512 GB of storage on something as small as a fingernail was something I would have never expected to see 10 years ago,
but here we are. There are even bigger microSD cards out there, but those also cost a lot more.</p>
<p>And even with this marvel of technology I ran into issues when installing games. Install GTA V, Forza Horizon 4, and
God of War, and just like that about half of all that storage is gone.</p>
<p>The 64 GB internal drive was also quite limiting, especially due to shader cache and compatibility layer (Proton) related
files taking up a majority of it. The situation has improved now, but I still went ahead and replaced it with a 1 TB
M.2 2230 NVMe SSD that I ordered online for 74 EUR in May 2023, which still makes it a cheaper option than the 512 GB model sold at the time.</p>
<p>The new SSD works well, it&rsquo;s fast and doesn&rsquo;t seem to affect battery life negatively.
Changing it was quite simple, all you need is an appropriate screwdriver, good fingernails or a plastic spudger to get
the case off, and some delicate care when working inside the Steam Deck.</p>
<p>Before I replaced my SSD, I tried all sorts of wild-ass ideas to fit more games on my Steam Deck.</p>
<p>First, I tried <a href="https://nextcloud.com/">Nextcloud</a>.
The idea is simple: I&rsquo;m not going to be playing all my games all the time, so it makes sense to offload some of those
to my home server and retrieve them over the fast local network whenever I want to play them. This idea makes even more
sense
if your internet speeds are not that great.</p>
<p>The results were mixed. The syncing part was working surprisingly well with the transfer speeds capping out at 1 Gbit/s
over Ethernet
and actually being faster than the microSD card itself at times. However, the usability of this setup is not that great.
You can select which folders to sync in the Nextcloud Client application, but Steam will still believe that a game is
installed even if the game files are missing as long as the app manifest file is present. This can lead to annoying
situations where you try to play a game and discover that the games files are not present on your Steam Deck.</p>
<p>The second solution I tried out was <code>iSCSI</code>. I
followed <a href="https://www.reddit.com/r/SteamDeck/comments/z7sh8v/how_to_connect_to_an_iscsi_disk/">this guide on Reddit</a>.
Getting iSCSI to work was tricky even for someone like myself who should be able to do this technical stuff properly,
but I ended up getting it working. I formatted the iSCSI device as ext4, mounted it and made it a Steam library folder
in Steam desktop mode.</p>
<p>The benefit of this solution is that as long as you have access to the server, the iSCSI storage device will show up
on your Steam Deck as any other drive and games will just work. If your network is good enough, you can play games that
are stored on your server, which might make a lot of sense for games that you generally play in docked mode.
Transferring games to your internal storage is also simple, performant and can be done entirely within the Steam UI.
The iSCSI setup is not that great mainly due to the technical complexity of the setup, making it a no-go for the more
casual audience. The performance over Wi-Fi was also lousy, and it&rsquo;s also difficult to justify having a good chunk of
your
home server storage being permanently held up by Steam games.</p>
<p>After all that hassle, I went with the solution that most people would have gone with already: store games on an
external SSD. Duh. It has the same benefits as the iSCSI setup, but it&rsquo;s faster and you can bypass
a lot of the technical complexity. The external SSD is also automatically mounted
when you connect it to the Steam Deck if it&rsquo;s formatted as <code>ext4</code>, making it a very convenient option for docked play.</p>









<figure class="center">
  <a href="/posts/2024/06/02/steam-deck/media/deck-extra-ssd.jpg">
    <img src="/posts/2024/06/02/steam-deck/media/deck-extra-ssd_hu_5ce32880716602dc.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Not as janky as you&#39;d think.">

  </a>
  <figcaption class="center">Not as janky as you&#39;d think.</figcaption>
</figure>

<p>If you happen to have a fast desktop PC with plenty of storage, or a home server,
then consider using the <a href="/posts/2023/09/11/steam-cache/">Steam local network game transfers.</a>
You won&rsquo;t fit more games onto the Steam Deck, but redownloading them will be
much faster.</p>
<p>We really need to start decoupling high resolution textures and other high quality assets from the base game at some
point because the current approach is just silly. For a device like Steam Deck you&rsquo;re rarely going to run those games with
the highest quality settings, meaning that those assets will just sit there on the disk taking up space.</p>
<p>A free optional DLC could work well in theory. In practice I&rsquo;m sure that game
publishers would quickly turn
a high quality texture pack into a paid DLC.</p>
<h2 id="the-part-where-i-play-games">
  <a class="heading-anchor" href="#the-part-where-i-play-games">The part where I play games<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Enough about the part where I tinker with the system. Let&rsquo;s talk about the games.</p>









<figure class="center">
  <a href="/posts/2024/06/02/steam-deck/media/deck-art-of-rally.jpg">
    <img src="/posts/2024/06/02/steam-deck/media/deck-art-of-rally_hu_e98a579c7f21a9c2.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="&#34;art of rally&#34; is a great game to play on the Steam Deck.">

  </a>
  <figcaption class="center">&#34;art of rally&#34; is a great game to play on the Steam Deck.</figcaption>
</figure>

<p>I had some idea about the game compatibility when I tried out <a href="https://github.com/HoloISO/holoiso">HoloISO</a>.
I&rsquo;m happy to report that the game compatibility is even better on the Steam Deck.
This fact alone is a minor miracle. Some years ago I was convinced that the only way to properly play games on Linux
was to <a href="/posts/2021/08/29/testing-gpu-passthrough-on-amd-ryzen-5700g/">set up a VM with Windows installed in it.</a></p>
<p>With the Steam Deck, you download the game and run it. Simple as.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<p>The Steam Deck is not the most powerful machine in the world, but it has a decent CPU in it. The GPU
is more akin to integrated GPU-s that ship in modern AMD Ryzen based laptops, it&rsquo;s still plenty of power
to run games at the native 1280x800 resolution.</p>
<p><a href="https://store.steampowered.com/app/1593500/God_of_War/">God of War (2018)</a> did stutter a bit, but in most situations you can expect around 40-60 FPS.</p>
<p><a href="https://store.steampowered.com/app/271590/Grand_Theft_Auto_V/">GTA V</a> was running fine as well, although the game is CPU limited at times and can drop to around 40 FPS in certain
sections of the map, especially in GTA Online.</p>
<p><a href="https://store.steampowered.com/app/1167630/Teardown/">Teardown</a> runs alright
after you lower the settings, and it&rsquo;s best
played in docked mode due to some fun mods being designed around keyboard
controls. It&rsquo;s really fun, but it will bring
the Steam Deck to its knees when you do some heavy destruction. Totally playable
though, and I&rsquo;ve had a lot of fun with this game.</p>
<p><a href="https://store.steampowered.com/app/228380/Wreckfest/">Wreckfest</a> runs well with medium or high settings. I feel the framerate dropping
a bit when heading into the first corner
and being part of a 24-car pile-up, but in all other situations it&rsquo;s smooth
enough.</p>
<p><a href="https://store.steampowered.com/app/47870/Need_For_Speed_Hot_Pursuit/">Need for Speed Hot Pursuit (2010)</a> runs very well and is an absolute blast on the
Steam Deck. Crank the settings to maximum and enjoy the thrilling police chases.</p>
<p><a href="https://store.steampowered.com/app/1262560/Need_for_Speed_Most_Wanted/">Need for Speed Most Wanted (2012)</a> is also great on the Steam Deck.</p>
<p><a href="https://store.steampowered.com/app/1262600/Need_for_Speed_Rivals/">Need for Speed Rivals (2013)</a> runs well after you apply the tweak that forces the game to run at
60 FPS. The game is a bit buggy even on Windows, so expect some bugs and crashes.</p>
<p>More modern Need for Speed titles, such as
<a href="https://store.steampowered.com/app/1262540/Need_for_Speed/">Need for Speed (2015)</a>,
<a href="https://store.steampowered.com/app/1262580/Need_for_Speed_Payback/">Need for Speed Payback (2017)</a>
and
<a href="https://store.steampowered.com/app/1222680/Need_for_Speed_Heat/">Need for Speed Heat (2019)</a>
are playable, but will typically run anywhere between 40-60 FPS. The handy
framerate capping
feature of the Steam Deck will help a lot in those cases since a stable 40-45
FPS is a much better experience than
a wildly fluctuating and unstable framerate.</p>
<p>More lightweight games run like a charm while using very little power. This includes titles
like <a href="https://store.steampowered.com/app/1794680/Vampire_Survivors/">Vampire Survivors</a><sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>
and <a href="https://store.steampowered.com/app/702670/Donut_County/">Donut County</a>.</p>
<p>What I really like about the Steam Deck is that performance tuning is very accessible. You can toggle <code>mangohud</code> with
various levels of detail to narrow down any performance troubles, and you have great control over the CPU and GPU
speeds. All of this can be done while the game is running.</p>









<figure class="center">
  <a href="/posts/2024/06/02/steam-deck/media/deck-mangohud.jpg">
    <img src="/posts/2024/06/02/steam-deck/media/deck-mangohud_hu_22de1e96d972e4d2.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="It&#39;s like MSI Afterburner overlay, but built-in and all set up for you.">

  </a>
  <figcaption class="center">It&#39;s like MSI Afterburner overlay, but built-in and all set up for you.</figcaption>
</figure>

<p>The APU in the Steam Deck tries its best to share the limited power that the system can pull between the CPU and GPU,
and in most cases it works well, but there are games where the CPU or the GPU demands can fluctuate a lot. In those
scenarios it helps if you lock the GPU clock speed to an amount that keeps the GPU usage to around 80% or less. Being
able to play with settings like this is one of the reasons why I got Forza Horizon 4 to be playable within minutes of
tinkering.</p>









<figure class="center">
  <a href="/posts/2024/06/02/steam-deck/media/deck-fh4.jpg">
    <img src="/posts/2024/06/02/steam-deck/media/deck-fh4_hu_a181eba620c52096.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Forza Horizon 4 on the Deck runs surprisingly well after you tweak a few settings.">

  </a>
  <figcaption class="center">Forza Horizon 4 on the Deck runs surprisingly well after you tweak a few settings.</figcaption>
</figure>

<p>There are a few games that I like to play but aren&rsquo;t working well on the Steam Deck, such as GTA III or Vice City, but
that is pretty much it. Over the one year that I&rsquo;ve had the Steam Deck, a lot of games have gained support, either
by Valve improving the Proton compatibility layer, or game publishers releasing updates that make the game work on the
Steam Deck.</p>
<p>One such example
is <a href="https://store.steampowered.com/app/12360/FlatOut_Ultimate_Carnage_Collectors_Edition/">FlatOut Ultimate Carnage</a>,
which seems to have been bought by a new publisher that removed the &ldquo;Games for
Windows Live&rdquo; mess and got the game &ldquo;Steam Deck Verified&rdquo; in the process.</p>
<p>The performance of the Steam Deck was actually quite surprising in a lot of
games. For example, I&rsquo;ve never
seen <a href="https://store.steampowered.com/app/12210/Grand_Theft_Auto_IV_The_Complete_Edition/">GTA IV</a>
run so well on any machine that I&rsquo;ve owned before.</p>









<figure class="center">
  <a href="/posts/2024/06/02/steam-deck/media/deck-gta4.jpg">
    <img src="/posts/2024/06/02/steam-deck/media/deck-gta4_hu_c09b521cf2150496.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The best GTA IV experience I&#39;ve ever had. ">

  </a>
  <figcaption class="center">The best GTA IV experience I&#39;ve ever had. </figcaption>
</figure>

<p>If you want to see if your favourite games are compatible with the Steam Deck I recommend you check
out <a href="https://www.protondb.com/">ProtonDB</a> for a detailed overview.
YouTube is your friend if you want to see some specific games being tested on the Steam Deck.</p>
<p>When it comes to emulating PS1, PS2 and PSP games, the Steam Deck is fantastic. There&rsquo;s plenty of performance to emulate
those consoles well, and for whatever reason playing the childhood classics on the Steam Deck feels so right. With PSP
the comparison is even more apt as it&rsquo;s basically a bigger PSP but with a much better battery life.</p>









<figure class="center">
  <a href="/posts/2024/06/02/steam-deck/media/deck-psp.jpg">
    <img src="/posts/2024/06/02/steam-deck/media/deck-psp_hu_cf25b34000d41f15.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Steam Deck and the whole PSP game library is a great match.">

  </a>
  <figcaption class="center">Steam Deck and the whole PSP game library is a great match.</figcaption>
</figure>

<p>More intensive games can discharge the battery in about 2-3 hours, but when
playing emulated games for older consoles you can expect up
to 7-8 hours of gameplay.</p>
<h2 id="non-steam-pc-gaming">
  <a class="heading-anchor" href="#non-steam-pc-gaming">Non-Steam PC gaming<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>It&rsquo;s clear from the name that this console is set up around Steam. As long as all
your games are purchased on Steam, you&rsquo;ll have a great time.</p>
<p>I do have some games from other sources, such as <a href="https://www.gog.com">GOG.</a></p>
<p>There exist community-supported launchers, such as <a href="https://heroicgameslauncher.com/">HeroicGamesLauncher</a>.
They work, but might require a bit of setup and fiddling to get things like cloud
synced game saves to work properly. In the case of <code>art of rally</code> on GOG, you&rsquo;ll
also lose out on multiplayer daily/weekly challenges.</p>
<p>If you have some older games on CD-s, or legally acquired archived copies of
PC games, then the situation gets tricky. There exist solutions like <a href="https://lutris.net/">Lutris</a>
or <a href="https://usebottles.com/">Bottles</a>, however I never quite had a good experience
with those, especially once you deviate from the happy path.</p>
<p>In my experience, if you want to have the best chance at playing your old
PC games, then you&rsquo;ll need to obtain a version of the game that has a no-CD patch
applied to it already, add it to Steam and set a version of the Proton compatibility layer.
Some legally dubious sources for these games label these packages as &ldquo;direct play&rdquo; as well.</p>
<p>There can also be a difference when running games via gaming or desktop mode.
Need for Speed Most Wanted (2005) did not work when started via gaming mode, but
it started up just fine in desktop mode.</p>
<p>Proton, the compatibility layer, is great for what it allows us to do, but I feel
like the concept and technical implementation is something that novice users
will never quite understand. This also becomes apparent when you look up discussions
online where novice users try to apply mods to their favourite games. It works out of the box on Windows, but
you need to grok the way Proton handles things for it to work on the Steam Deck.</p>
<p>I consider myself competent with computers and stuff,
but even I need to sit down and think about what&rsquo;s going on when working in this area.</p>
<h2 id="backups">
  <a class="heading-anchor" href="#backups">Backups<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I rely on <a href="https://github.com/mtkennerly/ludusavi">Ludusavi</a> to collect all my
game saves,
and I use <code>rsync</code> to back them up to my home server.</p>
<p>I made a desktop entry for the backup script. By right-clicking it in desktop
mode and
selecting <code>Add to Steam</code>, it will appear in your Steam library like any other
game or application.
This means that I don&rsquo;t have to quit gaming mode to back up the Steam Deck.</p>
<p>The backup script also updates all the applications that I&rsquo;ve installed as a
flatpak, and shuts the device down after it&rsquo;s done.</p>
<h2 id="its-big">
  <a class="heading-anchor" href="#its-big">It&rsquo;s big.<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The Steam Deck is big.</p>
<p>This does mean that Valve can pack a lot of compute power and cooling into it,
but it comes with the trade-off
of it not fitting that well into a backpack. The hardcase that it ships with is
great for preventing damage
to the Steam Deck, but it takes up a lot of space.</p>
<p>I don&rsquo;t find the size uncomfortable, quite the opposite actually, but for others
it might be a problem.</p>
<p>I&rsquo;ve had the opportunity to briefly play on a Nintendo Switch Lite. There&rsquo;s
something
that feels special about that form factor. The performance is not great compared
to the Steam Deck, but I feel like the Nintendo Switch is in its own class of
portable gaming consoles.</p>
<p>I wonder how a Nintendo Switch sized Steam Deck would perform.</p>
<h2 id="the-controls">
  <a class="heading-anchor" href="#the-controls">The controls<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The controls on the Steam Deck are good. It takes the best aspects of the
<a href="https://en.wikipedia.org/wiki/Wii_U_GamePad">Nintendo Wii U</a>
and <a href="https://en.wikipedia.org/wiki/Xbox_360_controller">Xbox 360</a>
controllers and smashes them into one polished experience.</p>
<p>The Steam Deck has some extra mappable buttons on the back. They sound great in
theory, but I rarely use them. When I do, I find that the L4 and R4 buttons
are more easily reachable compared to L5 and R5 (the lower ones).</p>
<p>When I <em>do</em> use those extra buttons, they are invaluable.
In <a href="https://store.steampowered.com/app/1262600/Need_for_Speed_Rivals/">Need for Speed Rivals (2013)</a>,
I mapped L4 and R4 to the two power-up slots, which left my thumbs free to focus
on driving and looking around.</p>
<p>Using those extra buttons does require some readjustment. It was difficult to
reprogram my muscle memory and remember that I have those extra buttons there.</p>
<p>Steam also provides lots of controller templates, both Valve-approved and community ones.
If the game you want to play doesn&rsquo;t have official controller support, then it&rsquo;s
highly likely that someone else has created a controller configuration that
emulates keypresses and allows you to play your favourite game on the Steam Deck.</p>
<p>Sometimes that doesn&rsquo;t quite work, in which case you can create your own layout, or
improve an existing one.</p>
<p>There&rsquo;s also the gyro functionality, but I&rsquo;ve only used it
in <a href="https://store.steampowered.com/app/1902490/Aperture_Desk_Job/">Aperture Desk Job</a>,
which itself is like a fancy demo of the controller capabilities of the Steam
Deck. Never quite found a suitable use case for this input method in other
games.</p>
<h2 id="the-fun-factor">
  <a class="heading-anchor" href="#the-fun-factor">The fun factor<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Based on what you read, you might think that I got the Steam Deck for the tinkering aspect. While that&rsquo;s certainly
part of the rationale behind getting one, it wasn&rsquo;t the main one.</p>
<p>I got one as an excuse to finally spend more time resting. I have had a bad habit of trying to be productive at all
times, which can lead to exhaustion and eventually burning out.</p>
<p>With the Steam Deck I&rsquo;ve been able to actually spend some time playing games and turning my brain off.</p>
<p>I love it.</p>
<p>And it gives my cats a great opportunity to snuggle up while I do some illegal street racing. Win-win.</p>
<p>There&rsquo;s something different about playing games on the Steam Deck. Perhaps it&rsquo;s related to the memories I had as a
teenager playing on my PlayStation Portable a lot, or knowing that I can replay all my favourite console games
without having to set up the physical consoles themselves.</p>
<h2 id="the-sad-reality-of-adulthood">
  <a class="heading-anchor" href="#the-sad-reality-of-adulthood">The sad reality of adulthood<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I love using the Steam Deck. However, I still can&rsquo;t seem to make much time for it when life gets busy.</p>
<p>That&rsquo;s my only big gripe with it.</p>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you&rsquo;ve been on the edge about getting a Steam Deck, then I hope that this post has helped you make a decision.
It has some rough edges, but when it works, it feels magical.</p>
<p>If you already have a gaming PC with a modern AMD GPU in it, then consider trying out
projects like <a href="https://bazzite.gg/">Bazzite</a>, <a href="https://github.com/HoloISO/releases">HoloISO</a> or <a href="https://chimeraos.org/">ChimeraOS</a> to get a taste of the Steam Deck experience.</p>
<p>Even if I can&rsquo;t put in as many hours as I&rsquo;d like to, I still love my Steam Deck
and don&rsquo;t regret getting it at all.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>this makes Valve&rsquo;s silence on releasing SteamOS 3 to a wider
audience puzzling. Do they not want to sell more Steam Decks?&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>assuming that it&rsquo;s a Steam Deck Verified title.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>it&rsquo;s really addicting, be careful.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Control - how to make a game enjoyable for casual audiences</title><link>https://ounapuu.ee/posts/2023/12/01/control/</link><pubDate>Fri, 01 Dec 2023 10:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2023/12/01/control/</guid><description>How one toggle in the game settings allowed me to enjoy a notoriously difficult game.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2023/12/01/control/media/cover_hu_41d463d98ad86107.jpg" width="1200" height="630" alt="Control - how to make a game enjoyable for casual audiences" /><p>I&rsquo;ve decided to intentionally take more time to play video games this year,
since it&rsquo;s a relatively healthy way to escape from the real world once in a while.
A friend recommended one game in particular: <a href="https://store.steampowered.com/app/870780/Control_Ultimate_Edition/">Control: Ultimate Edition</a>.
During the Steam summer sale of 2023, I went ahead and bought it.</p>
<p>I have liked it more than I expected to.</p>









<figure class="center">
  <a href="/posts/2023/12/01/control/media/image-1.png">
    <img src="/posts/2023/12/01/control/media/image-1_hu_d724be4b207d0278.webp"
     width="408"
     height="84"
     loading="lazy"
     decoding="async"
     alt="And I&#39;m not even done with the game!">

  </a>
  <figcaption class="center">And I&#39;m not even done with the game!</figcaption>
</figure>

<p>What prompted me to cover this game wasn&rsquo;t the captivating story, the sheer amount
of content available in the Ultimate Edition of the game, or the wild action
that you can find yourself in, it&rsquo;s much more simple than that.</p>
<p>In short, Control provides you with &ldquo;Assist mode&rdquo;, a set of options that allow
you to adjust the high difficulty of the game. This includes settings that help lock on to enemies,
which is great for players using controllers. There are also sliders to adjust
the recovery rate of various resources and even a one-hit kill mode.</p>
<p>My favourite of all of these is the immortality toggle.</p>









<figure class="center">
  <a href="/posts/2023/12/01/control/media/image-2.jpg">
    <img src="/posts/2023/12/01/control/media/image-2_hu_d67d5bdbcf86f8dc.webp"
     width="1280"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Assist mode options in Control.">

  </a>
  <figcaption class="center">Assist mode options in Control.</figcaption>
</figure>

<p>I don&rsquo;t take time to play video games to add more stress to my life. I work with
legacy software that falls over in novel ways almost weekly at this point, there&rsquo;s
too much stress in my life already. I like a
good challenge once in a while, but in most cases I play games to have fun. I&rsquo;m
also a fan of great stories, and many great stories are told via the medium of
video games. I&rsquo;d hate to miss out on those experiences due to the game being
too difficult or making me feel frustrated.</p>
<p>In the case of Control, the immortality toggle was what allowed me to relax,
follow the story with great interest, and feel like a <em><strong>god</strong></em> that kept
<em>yeeting</em> exploding forklifts at various enemies with explosive gun shots
sprinkled inbetween. There were still some challenging parts in the game even
with immortality in place, but they did not cause me to feel stressed out or
get frustrated with the game.</p>
<p>This one simple toggle is probably the sole reason why this game has become one
of my all-time favourites.</p>
<p>I&rsquo;m sure that there are people out there who disagree with the view that games
should always be easy or enjoyable. I don&rsquo;t care. I play games for myself, not
to be validated by some bozo on the internet.</p>
<p>While writing this post, I looked around the internet to see what others think
of Control and its difficulty, and what caught my eye were numerous results
discussing the difficulty of the game. I was also happy to see that <a href="https://www.wired.com/story/casual-gamer-control-easy-mode-wait/">there are
others out there who agree with me</a>
(or more precisely I agree with them). I found it surprising that the &ldquo;Assist mode&rdquo;
was added to the game a year after its release. Guess it pays off to be a patient
gamer.</p>
<p>Perhaps all of this explains why I had such a blast playing GTA San Andreas as
a teenager. Cheats like <code>HESOYAM</code> and <code>AEZAKMI</code> are still hardwired in my brain
since I used them a lot, and they allowed me to wreak havoc in-game and not have
to worry about getting stuck at an annoyingly difficult mission.</p>
<p>Hats off to Remedy Entertainment for adding the assist mode, I really appreciate it.</p>
<p>Oh, and the game works well on the Steam Deck. Great job!</p>
]]></content:encoded></item><item><title>Steam local network game transfers are a game-changer</title><link>https://ounapuu.ee/posts/2023/09/11/steam-cache/</link><pubDate>Mon, 11 Sep 2023 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2023/09/11/steam-cache/</guid><description>Setting up a Steam LAN cache has never been this easy, so I went ahead and did some testing with different configurations.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2023/09/11/steam-cache/media/cover_hu_8677bb4c48010087.jpg" width="1200" height="630" alt="Steam local network game transfers are a game-changer" /><p>Steam recently launched a new feature: <a href="https://help.steampowered.com/en/faqs/view/46BD-6BA8-B012-CE43">local network game transfers.</a></p>
<p>The idea is simple: if you have a game downloaded on another PC and you&rsquo;re both on the same local network, then Steam can download game data
from that PC, avoiding the need to download the game over public internet. Using this method you can reduce your internet
usage and enjoy faster download times.</p>
<p>I think this feature is absolutely brilliant. There are many homes out there, even in developed countries, where the
internet connection sucks. The speed might be capped at something very slow, such as 10 Mbit/s down, or you might
have a bandwidth cap in place. Perhaps you have multiple gaming PC-s and you want to avoid downloading 100+ gigabytes
worth of files over the internet to avoid hitting your bandwidth cap. In those situations being able to download your games to a PC that has a bunch of storage in it
makes a lot of sense.</p>
<p>This isn&rsquo;t the only way to achieve the same goal as <a href="https://lancache.net/">projects like LanCache exist.</a> However, with
Steam the setup is so simple that anyone who knows how to install Steam could achieve a similar result. The only caveat is that
you&rsquo;re limited to games installed through Steam, LanCache supports many other services.</p>
<p>Here are some ideas on how you can set up your own Steam cache.</p>
<h2 id="using-an-old-laptop">
  <a class="heading-anchor" href="#using-an-old-laptop">Using an old laptop<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you have an older laptop around and it has a gigabit Ethernet connection, then that can be a good candidate for
setting up a Steam cache.</p>
<p>The hardware I picked for this test is a ThinkPad T430. It has a 4 core CPU in it, 16 GB of RAM and plenty of ways
to attach storage to it. With storage I tried two approaches: using an older 1TB 2.5&quot; SATA HDD, and using
two Samsung 870 EVO 1TB SATA SSD-s in RAID0.</p>









<figure class="center">
  <a href="/posts/2023/09/11/steam-cache/media/image0.jpg">
    <img src="/posts/2023/09/11/steam-cache/media/image0_hu_ceb50a4db84a6f9c.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="It&#39;s a Steam cache. See, it says so right on the lid!">

  </a>
  <figcaption class="center">It&#39;s a Steam cache. See, it says so right on the lid!</figcaption>
</figure>

<p>The hard drive based solution isn&rsquo;t something I recommend, unless you plan on running two or more in a RAID-like setup.
The Steam cache use case seems to have hit the limits of the hard drive and that limited the transfer speeds
significantly.</p>
<p>The SSD-based setup was great! You might want to run something other than a RAID0 setup if you want to avoid a drive
failure taking your whole Steam library with you, I ran with this setup mainly to see where the limits are. The Steam
library is also something you can easily redownload, should things go really wrong.</p>
<p>One benefit of setting up an older laptop as a Steam cache is that you can take it with you to a place that has great
internet connectivity, download your games there and bring it back home with you. That&rsquo;s exactly what I did when
performing testing, I went to my local hackerspace, started the downloads, and came back half a day later to find
that over a terabyte worth of games had been downloaded. Doing the same on a slower home network would have taken days.
I guess the idea of <a href="https://en.wikipedia.org/wiki/IP_over_Avian_Carriers">IP over avian carriers</a>,
<a href="https://www.jeffgeerling.com/blog/2023/pigeon-still-faster-internet">or over humans</a>,
isn&rsquo;t dead yet.</p>
<p>When downloading the games, I noticed that Steam was hitting the CPU hard. Even on a decent 4-core Intel i7-3820QM the
CPU was often running at 100%. This meant that download speeds were usually around 500-700 Mbit/s, which is still good,
but nowhere near saturating the gigabit link that the laptop had.</p>









<figure class="center">
  <a href="/posts/2023/09/11/steam-cache/media/image1.jpg">
    <img src="/posts/2023/09/11/steam-cache/media/image1_hu_67e371a1c61477b.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The CPU is really struggling here.">

  </a>
  <figcaption class="center">The CPU is really struggling here.</figcaption>
</figure>

<p>Now that I had all the games downloaded, it was time to test the performance. The maximum transfer speeds were around
400-500 Mbit/s over my local network. I used my Steam Deck over an USB-C dock to start the downloads and picked the
internal NVMe SSD as the download target to avoid any storage speed bottlenecks. I would have liked to see speeds
close to 1 Gbit/s, but these speeds are still a massive improvement if your network speeds are something like
50 Mbit/s down, that&rsquo;s a 10x improvement!</p>









<figure class="center">
  <a href="/posts/2023/09/11/steam-cache/media/image2.jpg">
    <img src="/posts/2023/09/11/steam-cache/media/image2_hu_a89d48392fef01f8.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Typical transfer speeds observed with this setup.">

  </a>
  <figcaption class="center">Typical transfer speeds observed with this setup.</figcaption>
</figure>

<p>If you&rsquo;re worried about the fact that <a href="https://learn.microsoft.com/en-us/lifecycle/products/windows-10-home-and-pro">Windows 10 is going to lose support in October 2025</a>
and your Steam cache PC is not supported by Windows 11, then don&rsquo;t worry, you can do the same thing over Linux.</p>
<h2 id="using-a-virtual-machine">
  <a class="heading-anchor" href="#using-a-virtual-machine">Using a virtual machine<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you already have a NAS or a home server running, then you can create a new VM, add a bunch of storage to it,
setup the OS and Steam and you&rsquo;re good to go!</p>
<p>I did most of the testing on a Windows 10 VM and a 1TB HDD attached over USB 3.0. I setup the VM using a bog-standard
QEMU/KVM setup and set everything up through <code>virt-manager</code> in Linux. The only noteworthy part is that I set up the
network interface as a <code>macvtap</code> device, resulting in the VM showing up on my local home network as if it was a separate
PC. That step was taken to avoid any issues with the Steam instances on different PC-s not being able to transfer data
directly between each other.</p>
<p>My server runs on the <a href="/posts/2022/01/17/asrock-x300-future-of-desktops/">ASRock Deskmini X300</a>. It has plenty of CPU
performance, but during testing I ran into performance issues with the hard drive again. When I added SSD-based storage
to the VM, I found that the performance was great and quite similar to what I saw on the laptop.</p>
<p>The downside with the Windows 10 VM setup was the CPU usage. While the VM was idling, my server saw a noticeable
increase in idle CPU usage, utilizing about 10-20% of my CPU at all times. During transfers the VM was using most of
my CPU cores.</p>
<p>I did testing on a Linux VM to see if those are more efficient compared to a Windows 10 VM. The answer is obviously
&ldquo;yes&rdquo;, but there is one issue: I could not get Steam to work. At the time of testing, Steam had recently released a
bigger visual overhaul and I suspect that it might have something to do with those issues. The VM has no GPU
acceleration and opening Steam would result in &ldquo;Loading user data&rdquo; popup showing up, but nothing else happening.
I tried Ubuntu Desktop 22.04, Fedora Linux 38, and even Flatpak installations of Steam. All of them ran into the same
exact issue. There are probably ways to set Steam to not require GPU acceleration without opening its settings view
graphically, but I did not bother with that.</p>
<p>If you like to think in virtual machines, then this is a good option. However, it&rsquo;s not something I stuck with due to
the inefficient resource usage that a Windows 10 VM exhibited.</p>
<h2 id="using-containers">
  <a class="heading-anchor" href="#using-containers">Using containers<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This is the solution that I am currently running.</p>
<p>I recently found the <a href="https://docs.linuxserver.io/images/docker-webtop">LinuxServer.io webtop Docker images.</a> These
containers allow you to run various Linux desktop environments and distros on the same machine. You can connect to them
using the integrated KasmVNC solution over a browser. You can even use your GPU on the container host machine to improve
the video rendering performance in the container!</p>









<figure class="center">
  <a href="/posts/2023/09/11/steam-cache/media/image3.png">
    <img src="/posts/2023/09/11/steam-cache/media/image3_hu_5e25b945f3eec876.webp"
     width="1280"
     height="697"
     loading="lazy"
     decoding="async"
     alt="Fedora XFCE desktop running in a container.">

  </a>
  <figcaption class="center">Fedora XFCE desktop running in a container.</figcaption>
</figure>

<p>I picked the <code>fedora-xfce</code> option because Fedora is great, and the XFCE desktop environment is not that resource
intensive. I also utilized <a href="https://github.com/linuxserver/docker-mods/tree/universal-package-install">the linuxserver.io package install mod</a>
to install Steam on container startup. For networking, I created a separate Docker network using the <code>macvlan</code> driver to
achieve something similar to the VM setup, resulting in the container showing up as a separate machine on the local
network. Inside the container I set up Steam to start on startup using standard GUI tools that XFCE provides for this
purpose.</p>
<p>I really like this setup. I can easily point the Steam downloads to a larger storage pool and make use of all the CPU
power that Steam needs to perform the transfers.</p>
<p>During testing the limitation seems to have been my Steam Deck. I could still not saturate the 1 Gbit/s link.</p>
<p>The KasmVNC solution is quite nice and performant. The fact that I could use it in the browser makes it very convenient
to use as well.</p>
<p>The CPU usage during idle is very small, except for when you accidentally leave the Steam window open with animated
content being displayed. During file transfers the CPU gets a beating, but it&rsquo;s nothing the AMD Ryzen 7 5700G can&rsquo;t handle.</p>
<p>For storage I eventually ended up using a 1TB Lexar NVMe SSD. That&rsquo;s not enough to download all the games I have in my
Steam library, but at least I can download those games that take 20+GB of space and not have to worry about downloading
those over a slower internet connection.</p>
<p>I have not ended up using this setup too much yet, but I imagine that with games growing in size this is going to become
much more relevant for my Steam Deck. And if I were to move to the countryside where the only internet connection
available is a mobile 4G connection capped at 10 Mbit/s down, then this setup would be fantastic to have.</p>
<h2 id="tech-tips">
  <a class="heading-anchor" href="#tech-tips">Tech tips<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you intend to run a similar setup, I recommend enabling &ldquo;Scheduled updates&rdquo; to run during the night. I set mine up
to auto-update games between 00:00 and 06:00, which is where I&rsquo;m likely going to sleep and not notice that game downloads
are taking place. Steam is notorious for hogging all of the bandwidth on the network and this nifty feature helps
avoid disturbing other users on the network.</p>
<p>If you&rsquo;re performing the initial mass download of your games but would like for it to take place during scheduled times, start downloading
all of the games and then restart your machine. When Steam starts up again, you&rsquo;ll notice that all your games are
queued up nicely to download during your scheduled updates time slot.</p>
<h2 id="caveats">
  <a class="heading-anchor" href="#caveats">Caveats<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This setup is not ideal and <a href="https://help.steampowered.com/en/faqs/view/46BD-6BA8-B012-CE43">the Steam support page highlights it well.</a>
For example, this setup does not work in fully offline situations as internet connectivity is required for the initial
setup of the local network game transfer. I recommend giving that page a read to understand the requirements and technical specifics of this setup.</p>
]]></content:encoded></item><item><title>HoloISO: the unofficial Steam Deck experience on your PC</title><link>https://ounapuu.ee/posts/2022/12/01/holoiso-steam-deck-experience/</link><pubDate>Thu, 01 Dec 2022 07:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2022/12/01/holoiso-steam-deck-experience/</guid><description>I tried out HoloISO, the project that brings the Steam Deck experience to PC-s, on my ASRock DeskMini X300. Perhaps gaming on Linux isn't dead after all?</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2022/12/01/holoiso-steam-deck-experience/media/cover_hu_450361990dee578b.jpg" width="1200" height="630" alt="HoloISO: the unofficial Steam Deck experience on your PC" /><p>If you have spent any time in gaming hardware circles, then you&rsquo;ve probably
heard about the <a href="https://store.steampowered.com/steamdeck">Steam Deck</a>, the
Linux-based handheld gaming PC built by Valve. Yes, you heard that right: not
Windows, but Linux.</p>
<p>I&rsquo;ve had my fair share of attempts at gaming on Linux. When it works, it&rsquo;s
amazing. When it doesn&rsquo;t, it&rsquo;s incredibly frustrating. The last thing I want
to do when playing a game is to become a developer and start troubleshooting
issues with all the layers between the hardware and the game.</p>
<p>What makes the Steam Deck different is that the compatibility layer (Proton) and
all the bits and pieces associated with it are integrated in a way that <em>should</em>
make it unnoticeable to the user. Just start up your Steam Deck, pick your game,
play, and you&rsquo;re good to go.</p>
<p>Although I&rsquo;ve thought about buying a Steam Deck myself for tinkering and testing
purposes, I could not justify that purchase. But thanks to <a href="https://www.youtube.com/watch?v=x4gZO7TZT9g">videos from
the ETAPRIME YouTube channel</a> I
learned about the existence of <a href="https://github.com/theVakhovskeIsTaken/holoiso">HoloISO</a>,
an unofficial SteamOS 3 installer.</p>
<h2 id="holoiso">
  <a class="heading-anchor" href="#holoiso">HoloISO<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>HoloISO aims to be as close to the native SteamOS 3 experience as possible.
The only reason it exists right now is because Valve does not yet officially
support SteamOS 3 as a distro that you can go and install. That might change
in the future, but for those that are impatient like myself, HoloISO is a nice
option.</p>
<p>To test out HoloISO and give it a good chance at succeeding, I chose my <a href="/posts/2022/01/17/asrock-x300-future-of-desktops/">ASRock
DeskMini X300</a>.
It sports an <a href="https://www.amd.com/en/products/apu/amd-ryzen-7-5700g">AMD Ryzen 7 5700G</a>,
which is a high-end APU and
should result in performance that&rsquo;s roughly comparable to the Steam Deck in most
scenarios. The GPU cores are not on the newest GPU architecture released by AMD,
but the higher power budget should make up for any architectural deficiencies.</p>
<p>The installation of HoloISO is very easy, just download the installer and write
it to an USB stick. Once you&rsquo;re booted up, follow the installation instructions
and reboot. You should now be at the SteamOS 3 setup screen.</p>
<h2 id="first-impressions">
  <a class="heading-anchor" href="#first-impressions">First impressions<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I&rsquo;ll be the first one to admit that my Steam library is a bit out of date, which
is why my experience is limited to older titles. I can confirm that BeamNG drive
and Dirt Rally 2 work fantastically though.</p>
<p>The only way to play GTA V on Linux without issues used to involve <a href="https://youtu.be/16dbAUrtMX4">creating a
Windows VM and passing a GPU to it.</a> This is why
I was very impressed to see that installing and starting up GTA V worked out
of the box. I could even go to GTA Online and play around without being kicked
out or banned!</p>
<p>To make choosing and playing games a better experience for casual gamers, Steam
has also come up with the <a href="https://www.steamdeck.com/en/verified">Deck verified</a>
program. You shouldn&rsquo;t be discouraged if your favourite game is shown as
unsupported or not tested, though. Try to start it up and see if it works.
Burnout Paradise and Absolute Drift were not officially supported, but worked like a charm.</p>
<p>The unfortunate reality of SteamOS is that not every game will work out of the
box. Some older games, such as GTA III and GTA Vice City, would not work at all.
You might be able to check out places like <a href="https://www.protondb.com/">ProtonDB</a>
and see if a game has a tweak that you can apply. Tweaks can involve passing
additional launch options to a game or using another version of the compatibility
layer (Proton).</p>
<p>What turned me off of this platform was Forza Horizon 4. On this setup, it did
not launch properly, the sound was there but the screen was black. Based on
results in YouTube, it seems like Forza Horizon 4 and Forza Horizon 5 do work
on Steam Deck, so this issue might be down to a compatibility issue on
my hardware or HoloISO distribution of SteamOS 3. I wanted to play that game
though, so I had to eventually end the experiment and install Windows 10 again.</p>
<p>As someone who wants to get a good overview of resources usage during gameplay
to detect and resolve any performance issues, I tend to use tools like <a href="https://www.msi.com/Landing/afterburner/graphics-cards">MSI Afterburner</a>.
With SteamOS 3, you can easily achieve similar results by enabling the
performance overlay. I was very happy to see that addition because that means
installing and configuring one less tool on my gaming box.</p>
<h2 id="quality-of-life-issues">
  <a class="heading-anchor" href="#quality-of-life-issues">Quality of life issues<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Even when things generally work, I did notice some annoyances when playing games.
Sometimes I ran into issues with controls. Steam allows you to pick gamepad
templates and layouts, which can involve community-provided setups. Sometimes
it would default to a layout that simply did not work. Turning off Steam input
altogether would sometimes improve the situation. If that did not work, then
picking an alternative template would do the trick most of the time.</p>
<p>One major issue that I ran into was related to my XBOX controllers. Because
the XBOX wireless adapter does not work out of the box on Linux, I connected
them via Bluetooth. However, the latency was horrible and borderline unplayable.
There do exist drivers that you can install, mainly <a href="https://github.com/medusalix/xone">xone</a>
and <a href="https://github.com/atar-axis/xpadneo">xpadneo</a>, and those do improve the
situation.</p>
<h2 id="desktop-mode">
  <a class="heading-anchor" href="#desktop-mode">Desktop mode<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>One aspect of SteamOS 3 that made me actually consider buying a Steam Deck is
the desktop mode. Not only can you play games, but you can also boot into a
normal KDE desktop environment. Install a web browser, emulators,
tweak the system or do actual productive work on it, it just works!</p>
<p>Hell, you can even install an SSH server and manage your gaming box with Ansible!</p>
<p>Whenever I&rsquo;ve had a gaming PC, I&rsquo;ve usually hooked it up to a big screen,
installed Windows and Steam on it, and called it a day. If you want to watch
some media, open up the browser and you&rsquo;re good to go. I&rsquo;m happy to report that
something similar can be achieved on SteamOS as well.</p>
<p>At the time of testing, there were some issues that I didn&rsquo;t expect to have with
desktop mode. Firefox is included as a Flatpak and it did not support any form
of hardware acceleration for video playback, which made it a no-go for a home
theater setup.</p>
<p>After browsing <a href="https://www.reddit.com/r/steamdeck/">/r/SteamDeck</a> for a while,
you&rsquo;ll notice that a lot of people are into modifying their consoles, and all
of that is possible because Valve did not lock anything down. Pop the hood and
work with the Linux internals as much as you want to! With other gaming consoles
you&rsquo;re going to have to wait until someone discovers an exploit that allows you
to have proper control over hardware that you physically own.</p>
<h2 id="gaming-outside-of-steam">
  <a class="heading-anchor" href="#gaming-outside-of-steam">Gaming outside of Steam<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>With the presence of desktop mode, you&rsquo;re not only limited to games purchased
from Steam.</p>
<p>To see how well I could emulate games that I have purchased on older consoles,
such as PS1, PS2 and PSP, I tried setting up some emulators. I&rsquo;m happy to say
that setting them up is just as fiddly as it is on Windows, but they do seem
to work quite well, at least for these consoles.</p>
<p>I gave Minecraft a go as well by installing it as a Flatpak from KDE Discovery
software manager, but for some reason it didn&rsquo;t run and crashed on startup.
I didn&rsquo;t look into it further, but it seemed like something that an update can
fix.</p>
<p><a href="https://www.gog.com/">GOG</a> is a platform similar to Steam, with one notable
exception: their games are DRM-free. I don&rsquo;t use that often, but with a game
like <a href="https://artofrally.com/">art of rally</a> I had to get it from there just
for that reason alone (and the developers publishing native Linux ports).
Although there isn&rsquo;t an official client for GOG on Linux, there do exist open
source implementations. I gave <a href="https://github.com/Heroic-Games-Launcher/HeroicGamesLauncher">HeroicGamesLauncher</a>
a go and although it is a bit rough around the edges, it got the job done and
I could play <em>art of rally</em> just fine.</p>
<h2 id="caveats">
  <a class="heading-anchor" href="#caveats">Caveats<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The HoloISO experience tries to be as close to the one provided by SteamOS 3,
but it is not 100% there yet. It seems that there are differences present
under the hood, such as Steam Deck shipping with the root filesystem being
read-only by default. I might not be aware of other differences between the
HoloISO and official Steam Deck installation, so keep this in mind when making
any decisions based on info from this post.</p>
<p>The choice of hardware will also affect your experience. The requirements
regarding GPU-s is relatively strict and you&rsquo;ll likely have the best experience
with a modern AMD GPU since that&rsquo;s what SteamOS 3 is built around. Intel
and NVIDIA GPU-s <em>may</em> work, but are not guaranteed to.</p>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>SteamOS 3, even in its HoloISO implementation, is very impressive. So impressive,
in fact, that I almost bought a Steam Deck. The uncertainty about support for my
favourite games and less than ideal performance on the big screen were what
held me back. For now.</p>
<p>In its current form, SteamOS 3 (and by extension the Steam Deck itself) are a
tinkerers&rsquo; dream. There are some rough corners and caveats that you should be
aware of as well. Not everyone is into tinkering and experimentation, and that&rsquo;s
OK.</p>
<p>I sincerely hope that Valve can use the momentum that Steam Deck has achieved
to push gaming on Linux even further. After having to reinstall Windows more than
I&rsquo;d like to admit, having my gaming PC run plain Linux and be fully manageable
with Ansible just feels so <em>right</em>.</p>
]]></content:encoded></item><item><title>Trying out VR on an AMD Ryzen 4000 series APU</title><link>https://ounapuu.ee/posts/2022/05/04/vr-on-integrated-graphics/</link><pubDate>Wed, 04 May 2022 08:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2022/05/04/vr-on-integrated-graphics/</guid><description>A quick and dirty experiment: can the integrated graphics on an AMD Ryzen 4000 series APU run Beat Saber?</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Trying out VR on an AMD Ryzen 4000 series APU" /><p>You may know that I really like <a href="/posts/2022/01/17/asrock-x300-future-of-desktops/">small, efficient APU-based builds</a>.
At this point in time, they&rsquo;re so close to being a viable mainstream option for
gaming, especially the Ryzen 6000-series mobile APU-s. <a href="https://youtu.be/2_Ik1vgIBN4?t=247">Forza Horizon 5, at
1080p high settings? Yes, they&rsquo;re that good.</a></p>
<p>I don&rsquo;t have the new Ryzen 6000 series APU-s to play around with, but
what I do have is an <a href="https://www.amd.com/en/products/apu/amd-ryzen-5-pro-4650g">AMD Ryzen 5 PRO 4650G</a>
and a <a href="https://www.vive.com/us/product/vive-cosmos/features/">HTC Vive Cosmos VR headset</a>.
I&rsquo;ve noticed that my NVIDIA GTX 1060 manages to hit frametimes of 2-3ms in
Beat Saber while the limit is at 11.1ms (90 Hz), which means that Beat Saber is
probably quite easy to run. But can it run on integrated graphics and still be
playable?</p>
<p>There&rsquo;s been some work done in this area before as well:</p>
<ul>
<li>
<p><a href="https://youtu.be/hDkiLWtnpok">LowSpecGamer tried out Half Life Alyx on a Ryzen 3 3200G</a></p>
</li>
<li>
<p><a href="https://youtu.be/KChRyQniUew">The Mysticle testing Beat Saber on integrated Intel graphics</a></p>
</li>
</ul>
<h2 id="test-setup">
  <a class="heading-anchor" href="#test-setup">Test setup<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Here&rsquo;s a quick rundown of the specs of the test PC:</p>
<ul>
<li>CPU: AMD Ryzen 5 PRO 4650G</li>
<li>GPU: Radeon Vega 7 integrated graphics</li>
<li>RAM: 16GB DDR4-3200 kit</li>
<li>Motherboard: ASRock X570M Pro4</li>
<li>Cooling: adequate</li>
<li>Storage: plenty</li>
</ul>
<p>To get the authentic, out of the box experience, I did not overclock any
component, unless you count using the XMP profile on my memory sticks to run them
at 3200 MT/s as overclocking.</p>
<p>The test PC usually has an NVIDIA GTX 1060 6G inside it, because it&rsquo;s a gaming
PC, after all. In my first test attempt I kept the NVIDIA GPU inside the PC since
I was lazy. I connected my TV to the HDMI port located on the motherboard, and
connected the VR headset to the DisplayPort present on the motherboard. What I
found out was that by default games would still utilize the NVIDIA GPU, passing
the final image to the integrated Vega 7 graphics, which then shows it on the big
screen. This type of setup is commonly found on laptops that have a discrete GPU
in addition to the integrated GPU, I just didn&rsquo;t expect this to work out of the
box on a desktop setup.</p>
<p>To do proper testing, I removed the dedicated GPU, updated the AMD GPU drivers
to the latest available version at the time of writing, and got down to testing.</p>
<h2 id="first-attempt-with-beat-saber">
  <a class="heading-anchor" href="#first-attempt-with-beat-saber">First attempt with Beat Saber<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p><a href="https://beatsaber.com/">Beat Saber</a> is a very popular VR game, and for good
reason. It&rsquo;s the perfect candidate for testing low-end VR gaming as it&rsquo;s not that
complex graphically and even runs on standalone headsets, such as <a href="https://www.oculus.com/quest-2/">the Quest 2</a>.</p>
<p>I set everything up, started the game, and was surprised that it even loaded!
The success stopped there, as I quickly noticed that the resolution used for the
headset was automatically set to the lowest available resolution, resulting in
text that was absolutely unreadable.</p>
<p>Unreadable text didn&rsquo;t stop me, so I navigated to the song list and picked
something familiar. The result? It works, barely.</p>









<figure class="center">
  <a href="/posts/2022/05/04/vr-on-integrated-graphics/media/test-1.jpg">
    <img src="/posts/2022/05/04/vr-on-integrated-graphics/media/test-1_hu_8b0725d86ae3755b.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="First test with Beat Saber on integrated AMD Vega 7 graphics.">

  </a>
  <figcaption class="center">First test with Beat Saber on integrated AMD Vega 7 graphics.</figcaption>
</figure>

<p>The game ran at a very low resolution, and even then the best it could do was
between 45-80 frames per second. As you can see from the screenshot, the
experience was not a fluid one. I could still hit the boxes, but it just didn&rsquo;t
feel good. At least it&rsquo;s somewhat playable, and the headset still rendered my
head movements in 90 Hz, reducing the risk of motion sickness.</p>
<p>Judging by the SteamVR performance statistics, I noticed that it was perfectly
happy with running the game at half the framerate (45 Hz), and unhappy about
inconsistent frametimes.</p>









<figure class="center">
  <a href="/posts/2022/05/04/vr-on-integrated-graphics/media/test-2.jpg">
    <img src="/posts/2022/05/04/vr-on-integrated-graphics/media/test-2_hu_16984ca3597c8074.webp"
     width="1087"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Closer look at the frametimes graph provided by SteamVR.">

  </a>
  <figcaption class="center">Closer look at the frametimes graph provided by SteamVR.</figcaption>
</figure>

<h2 id="test-attempt-2">
  <a class="heading-anchor" href="#test-attempt-2">Test attempt #2<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>To understand the performance fluctuations better, I started up MSI Afterburner
and enabled the on-screen display.</p>
<p>With the second attempt, I also made one important change to the configuration.
I set the TV connected to the machine from 4K resolution down to 720p to avoid
taxing the APU with any extra load.</p>
<p>I launched Beat Saber and while the resolution was still garbage, there was a
notable improvement in the performance.</p>









<figure class="center">
  <a href="/posts/2022/05/04/vr-on-integrated-graphics/media/test-3.jpg">
    <img src="/posts/2022/05/04/vr-on-integrated-graphics/media/test-3_hu_cb1aa1a9787fe068.webp"
     width="1002"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Still not quite ideal, but much more consistent than before.">

  </a>
  <figcaption class="center">Still not quite ideal, but much more consistent than before.</figcaption>
</figure>

<p>The frametimes were much more consistent now and very close to the 90 Hz mark.
It does still stutter, as you can see from the SteamVR performance statistics,
but at least now it&rsquo;s a much more playable experience.</p>









<figure class="center">
  <a href="/posts/2022/05/04/vr-on-integrated-graphics/media/test-4.jpg">
    <img src="/posts/2022/05/04/vr-on-integrated-graphics/media/test-4_hu_c82ed8ff510a57f2.webp"
     width="1280"
     height="611"
     loading="lazy"
     decoding="async"
     alt="Framerate and frametime graphs, courtesy of MSI Afterburner.">

  </a>
  <figcaption class="center">Framerate and frametime graphs, courtesy of MSI Afterburner.</figcaption>
</figure>

<p>From the statistics provided by MSI Afterburner, you can clearly see that the
performance is so close to being playable, with the integrated GPU maxing out
at a somewhat stable 85 FPS, but then dropping down to a more stable 45 FPS
and staying there for a while. The game fluctuates between those two levels of
performance.</p>
<p>You can still call the game somewhat playable, though. It&rsquo;s not the best
experience and you&rsquo;re not going to set any world records while running at half
the refresh rate, but it&rsquo;s <em>something</em>.</p>
<h2 id="apu-s-vr-and-the-future">
  <a class="heading-anchor" href="#apu-s-vr-and-the-future">APU-s, VR and the future<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The performance increases in APU-s aren&rsquo;t fast enough to catch up with discrete
GPU-s just yet. Relying on system memory that&rsquo;s optimized for latency rather
than memory bandwidth and then sharing that same memory with the CPU is also a
compromise that you cannot work around that easily.</p>
<p>This test shows what the integrated Vega graphics are capable of. With the
release of the Ryzen 6000 series mobile APU-s, the performance of the integrated
graphics has been increased yet again, with the GPU architecture now based on
RDNA 2.</p>
<p>Based on the results of my testing and seeing how the new APU-s perform in games,
I&rsquo;m betting that the new APU-s should be able to run some VR titles at a more
stable 90 Hz on a similar screen resolution.</p>
<p>Is this enough to consider them as a viable option for VR gaming in general?
Probably not. Games like Half Life Alyx can bring the NVIDIA GeForce GTX 1060
to its knees, and that&rsquo;s at the lowest graphics preset! But if you&rsquo;re like me
who spends 90% of their time in VR playing a graphically simple game like
Beat Saber, then it might be an option worth considering, especially in a market
where discrete GPU-s cost an arm and a leg. The great GPU shortage of 2021-2022
is showing signs of easing, but we&rsquo;re not quite there yet.</p>
<h2 id="future-steps">
  <a class="heading-anchor" href="#future-steps">Future steps<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>It&rsquo;s probably possible to improve the APU VR gaming experience by applying some
tweaks and fixes, such as <a href="https://github.com/fholger/vrperfkit">the VR performance toolkit</a>.
However, that won&rsquo;t reflect the out of the box experience that you&rsquo;d get. Casual
VR players are unlikely to go and seek such tweaks out.</p>
<p>Trying to lock the refresh rate to something like 45/60/75 Hz may also improve
the stability of the experience.</p>
<p>For the time being, I will just continue playing VR with a dedicated GPU, but I
am cautiously optimistic about the future of VR on APU-s.</p>
]]></content:encoded></item><item><title>VR, VFIO and how latency ruined everything</title><link>https://ounapuu.ee/posts/2021/12/29/vr-vfio-latency/</link><pubDate>Wed, 29 Dec 2021 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2021/12/29/vr-vfio-latency/</guid><description>Alternative title: "Honey, I completely changed my server setup again!"</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="VR, VFIO and how latency ruined everything" /><p>I&rsquo;ve been running my <a href="/posts/2021/08/29/testing-gpu-passthrough-on-amd-ryzen-5700g/"><em>all-in-one</em></a>
PC for a while now. It was my desktop, my NAS and my gaming PC.
However, during the next couple of months I kept hitting small bumps along the
road. Most of these were quite straightforward to fix, but there is one that
finally convinced me to go back to a simpler setup.</p>
<h2 id="iscsi">
  <a class="heading-anchor" href="#iscsi">iSCSI<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>As mentioned in <a href="/posts/2021/10/13/diy-cloud-gaming-nvidia-moonlight/">one of my previous posts</a>,
I had set up the storage on my gaming VM over iSCSI. If you don&rsquo;t know what
iSCSI is: think of it like a hard drive that you can hook up to your machine
over the network. This setup had a couple of benefits: the amount allocated to
the VM was flexible and I would always have a snapshot of my game data in case
the Windows VM decided to nuke itself.</p>
<p>What I didn&rsquo;t take into account was the configuration. <code>tgt</code> allows you to
define the IP address of the client machine, which can be seen as an additional
layer of security. My gaming VM has two virtual NIC-s, one pointing to the
actual physical network, and another one to a virtual one. This resulted in the
iSCSI connection being flaky on startup: the disk was not present in the VM on
first boot, but was there after a reboot.</p>
<p>This issue was gone once I removed this restriction from the iSCSI target
configuration on the Linux VM. My best guess is that the iSCSI stack in Windows
might have tried to initiate a connection over the wrong NIC, depending on
whichever one was brought up first.</p>
<p>After &ldquo;solving&rdquo; this issue, it had been smooth sailing.</p>
<h2 id="gpu-audio-issues">
  <a class="heading-anchor" href="#gpu-audio-issues">GPU audio issues<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>When the Windows VM had been on for a while, the HDMI audio output would start
to glitch out after a while, with the audio sounding slow, robotic and garbled.
After doing some research, I found some resources that mentioned enabling MSI
interrupts in Windows. The guide for this can be found over at
<a href="https://forums.guru3d.com/threads/windows-line-based-vs-message-signaled-based-interrupts-msi-tool.378044/">Guru3D forums</a>.</p>
<p>After tweaking the Windows registry settings and reminding myself that I do have
snapshots to fall back to in case I mess up, I got the issue fixed.</p>
<h2 id="gpu-driver-issues">
  <a class="heading-anchor" href="#gpu-driver-issues">GPU driver issues<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Whenever there&rsquo;s a new big and popular game released, NVIDIA usually releases
an updated version of their GPU drivers. I try to keep my software up to date,
so I usually install these updates when they come out. Just one problem: when I
upgrade the GPU drivers in the VM, the screen will stay black. After some time
passes, I have to force a reboot using <code>virt-manager</code>.</p>
<p>I have not looked into this issue yet as it only happens during driver updates,
but it&rsquo;s definitely an annoying thing to have.</p>
<h2 id="uefi-and-csm">
  <a class="heading-anchor" href="#uefi-and-csm">UEFI and CSM<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>UEFI updates have a bad habit of resetting all the custom settings that you
have made, and at least with the motherboards I have used, the settings cannot
be restored if the backed up settings are from an older UEFI version. This
means that I have to navigate the UEFI quite often to configure all the
settings that I need to have in place for VFIO to work.</p>
<p>There is one setting that I didn&rsquo;t expect to cause that much trouble though:
CSM support. CSM (compatibity support module) is generally enabled by default
and allows you to boot off of legacy operating systems if needed. I don&rsquo;t have
that requirement, so I went ahead and set my boot options to boot in UEFI mode
only.</p>
<p>Reboot, start up Fedora, and boom, anything VFIO related is spewing errors like
crazy.</p>
<p>Turns out that enabling UEFI only mode in UEFI settings somehow grabs the GPU
and causes problems when you try to then pass the GPU to a VM. While in this
mode, I noticed that the GPU was also shown in a separate menu in UEFI settings.
Enabling CSM support fixed this issue for me.</p>
<h2 id="vr-and-usb-issues">
  <a class="heading-anchor" href="#vr-and-usb-issues">VR and USB issues<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>With the situation in the world being less than optimal, I decided to spice up
my gaming setup with the addition of a <a href="https://www.vive.com/us/product/vive-cosmos/features/">HTC Vive Cosmos</a>
in case in-door activities become much more popular suddenly.</p>
<p>First issue: I can&rsquo;t get the damn thing working. My gaming VM setup has the
<a href="https://www.inateck.com/products/inateck-kt4006-dual-port-usb-3-0-pci-express-card-20-pin-connector-no-power-connection">inateck KT4006</a>
passed through so that I can plug peripherals to the PC and make them available
to the gaming VM with ease. After plugging everything in according to
instructions and turning the link box on, I&rsquo;m met with a barrage of USB
connected-disconnected sound effects. 6 or 7 cycles later the sound stops, and
with that do the rest of my USB devices.</p>
<p>I took the USB 3.0 card and tried it in an older machine that doesn&rsquo;t have a
fancy VFIO setup on it. Same issue. However, when connected to an USB 2.0 port,
the setup shows a warning in VIVE Console, but at least it works! Since my PC
literally has no USB 2.0 ports, I had to get a bit creative and plug an USB 2.0
extension cable between the PC and the USB 3.0 cable coming from the link box.</p>
<p>With the help of my friend I got confirmation that the issue is indeed with my
USB ports. I also ordered a different USB PCIe card from inateck, this time the
<a href="https://www.inateck.com/products/pci-e-to-usb-3-0-4-ports-pci-express-card-and-15-pin-power-connector-red-kt4001">inateck KTU3FR-4P</a>.
I made the assumption that since <a href="https://www.vive.com/eu/support/vive/category_howto/headset-not-detected-due-to-usb-issue.html">the VIVE support page also recommends an inateck card</a>,
then they must be fit for purpose.</p>
<p>Nope. The second card apparently has the same chipset and the same issue.</p>
<p>What did end up working was a random VIA USB 3.0 PCIe card, which shows up as
<code>VIA Technologies, Inc. VL805/806 xHCI USB 3.0 Controller</code> on my machine. Just
one issue: it has PCIe device reset issues. If I shut down the Windows VM and
start it up again, I would sometimes get a bunch of <code>IO_PAGE_FAULT</code> errors in
my kernel logs. No worries, guess I&rsquo;ll just avoid rebooting a notoriously
reboot-happy OS.</p>
<h2 id="latency-the-straw-that-broke-the-camels-back">
  <a class="heading-anchor" href="#latency-the-straw-that-broke-the-camels-back">Latency: the straw that broke the camel&rsquo;s back<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If there&rsquo;s one thing you don&rsquo;t want to see in a VR gaming setup, it&rsquo;s latency.</p>
<p>I&rsquo;ve covered <a href="/posts/2021/09/07/diy-cloud-gaming-vfio-parsec-amd/">the tweaks I&rsquo;ve made to my setup in a previous post</a>.
Turns out that those might not be enough. The <a href="https://wiki.archlinux.org/title/PCI_passthrough_via_OVMF#Example_with_systemd">CPU isolation using systemd</a>
works well in general, but not with kernel threads.</p>
<p>Whenever I did something IO heavy on an NVMe-based btrfs file system, it would
introduce stutter to the gaming VM. Running a scrub operation on the filesystem
was enough to put a huge load on the CPU, likely due to the raw speed that the
NVMe SSD-s can provide. This results in the gaming VM experiencing stutter
that ruins the whole experience.</p>
<p>Here&rsquo;s an illustration.</p>









<figure class="center">
  <a href="/posts/2021/12/29/vr-vfio-latency/media/normalusage.jpg">
    <img src="/posts/2021/12/29/vr-vfio-latency/media/normalusage_hu_bddd6f0b9c862f0f.webp"
     width="956"
     height="800"
     loading="lazy"
     decoding="async"
     alt="SteamVR performance statistics with a light load on the host system.">

  </a>
  <figcaption class="center">SteamVR performance statistics with a light load on the host system.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2021/12/29/vr-vfio-latency/media/latencyhell.jpg">
    <img src="/posts/2021/12/29/vr-vfio-latency/media/latencyhell_hu_6ffdf367424bccee.webp"
     width="927"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The purple spikes mean that you are having a real bad time right now.">

  </a>
  <figcaption class="center">The purple spikes mean that you are having a real bad time right now.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2021/12/29/vr-vfio-latency/media/latencynative.jpg">
    <img src="/posts/2021/12/29/vr-vfio-latency/media/latencynative_hu_d9c371c91ecc08fe.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="For comparison: VR performance running natively on Windows 10.">

  </a>
  <figcaption class="center">For comparison: VR performance running natively on Windows 10.</figcaption>
</figure>

<p>Similar issues could be observed whenever I tried to run another VM that
shares the same cores.</p>
<p>I looked into alternative solutions as well, and it does seem to be possible
to also isolate those CPU cores from the kernel. They will probably work to
some extent, but implementing them feels a bit hacky at the moment. I&rsquo;m hoping
that in the future these kinds of tweaks will be exposed as a simple checkbox
in <code>virt-manager</code> itself.</p>
<p>At that point I had enough. If I&rsquo;m not going to be able to use the machine for
other purposes at the same time without experiencing all these issues and
having to work around them, then I&rsquo;ll just go back to a simpler setup. I&rsquo;ll lose
some of the benefits, but at least I don&rsquo;t have to spend time debugging all
these issues.</p>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>VFIO and virtualization are still interesting topics to learn about and try
out, but for my use case they are just too limiting. I&rsquo;d imagine that an use
case that didn&rsquo;t have such strict latency requirements would still be able to
run just fine, unfortunately gaming just isn&rsquo;t one of them.</p>
<p>This experience has been quite fun in general, but I&rsquo;m calling quits, at least
for now. The one machine that does it all turned out to be a jack of all
trades, master of none.</p>
]]></content:encoded></item><item><title>DIY cloud gaming: NVIDIA and Moonlight</title><link>https://ounapuu.ee/posts/2021/10/13/diy-cloud-gaming-nvidia-moonlight/</link><pubDate>Wed, 13 Oct 2021 05:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2021/10/13/diy-cloud-gaming-nvidia-moonlight/</guid><description>Comparing the experience that AMD and NVIDIA can provide in a DIY cloud gaming setup.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="DIY cloud gaming: NVIDIA and Moonlight" /><p>As you might have read from <a href="/posts/2021/09/07/diy-cloud-gaming-vfio-parsec-amd/">my previous post on this topic</a>, I
have a pretty neat &ldquo;cloud&rdquo; gaming setup running. I have one powerful desktop PC, one virtual machine with a GPU attached
to it, and client machines that can be used to stream games from. To keep things simple (and because my current ISP is
unbelievably bad), I have so far used streaming only over my local network.</p>
<p>However, there were some pretty annoying issues with this setup:</p>
<ul>
<li>The AMD GPU encoder is bad. 720p streaming was the best I could do if I wanted reasonable performance.</li>
<li>The Windows 10 VM would sometimes not be able to start the host encoder, and the GPU drivers reported issues. This was
fixed with a couple of reboots to the VM and I suspect that this may be related to the notorious GPU reset issues that
AMD cards are infamous for in the VFIO world, but I wasn&rsquo;t interested in digging that deep into that topic.</li>
<li>The stream would sometimes randomly crash or lag. This might have been down to the AMD GPU
or <a href="https://parsec.app/">Parsec</a> itself.</li>
</ul>
<p>I read about this topic for a while and found that the overwhelming number of threads related to this topic recommend an
NVIDIA GPU and Moonlight for the best streaming experience. And so I went out to get one.</p>
<h2 id="the-gpu">
  <a class="heading-anchor" href="#the-gpu">The GPU<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>It&rsquo;s 2021. The world is on fire and GPU prices are insane. With that in mind, I tempered my expectations and went for
something simple: a NVIDIA GTX 1060 6G by MSI. Simple, relatively modern for my games and the price was around the
retail price 5 years ago (260 EUR), which is the best you can do in these lousy times.</p>
<p>But hey, it works! From the testing I
did <a href="/posts/2021/08/29/testing-gpu-passthrough-on-amd-ryzen-5700g/">in a previous post</a>, I knew that NVIDIA had finally
stopped intentionally throwing <code>error code 43</code> in their drivers, which made this option viable. Replacing the GPU was
simple, I just had to change the PCI device ID-s according to the VFIO setup guide and changed the devices attached to
the Windows 10 VM using <code>virt-manager</code>, and that was it!</p>
<h2 id="parsec-amd-vs-nvidia">
  <a class="heading-anchor" href="#parsec-amd-vs-nvidia">Parsec: AMD vs NVIDIA<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Since I was already using Parsec for my streaming purposes, I decided to do a quick test to see what the difference is
between the two cards.</p>
<p>The previous GPU was an AMD Radeon RX 570 4GB by Sapphire. These two GPU-s are in the same performance class, which
makes for a good comparison.</p>
<p>Here are some results taken in two quick testing sessions in Dirt Rally. Take these results with a spoonful of salt as
these have not been conducted with any kind of standards. I just picked the same graphics preset, resolution and let it
run with Parsec statistics view open.</p>
<h3 id="h264">
  <a class="heading-anchor" href="#h264">H.264<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>AMD RX 570: 10ms</p>
<p>NVIDIA GTX 1060: 3ms</p>
<h3 id="h265">
  <a class="heading-anchor" href="#h265">H.265<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>AMD RX 570: 8ms</p>
<p>NVIDIA GTX 1060: 3ms</p>
<p>The difference in the encode performance is huge, especially if you consider that the time between two frames is 16.6ms
for a 60 FPS stream. Some of that budget is also taken up by network and decode latency in the client, so the shorter
the encode time is, the better.</p>
<p>Parsec is fine, but I have had some trouble getting GPU-accelerated decode working on my Linux clients, and it also
lacks an iOS client. While the latter isn&rsquo;t a deal-breaker, the first one definitely is.</p>
<h2 id="moonlight-an-open-source-gem">
  <a class="heading-anchor" href="#moonlight-an-open-source-gem">Moonlight: an open-source gem<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p><a href="https://moonlight-stream.org/">Moonlight</a> is an alternative to Parsec. It implements the NVIDIA GameStream protocol and
has clients for most common platforms. My testing has been performed on Linux clients running Fedora 34, a Windows 10
laptop (ThinkPad X230), iPhone SE 2020 and an old Google Nexus 5. I also made an attempt to run the Moonlight client on
a Raspberry Pi 1 B+, but it seems that it is simply too old for the Moonlight client, resulting in an error on startup.</p>









<figure class="center">
  <a href="/posts/2021/10/13/diy-cloud-gaming-nvidia-moonlight/media/image.jpg">
    <img src="/posts/2021/10/13/diy-cloud-gaming-nvidia-moonlight/media/image_hu_10280f4a7e25eb3d.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="GTA V on a Google Nexus 5? More likely than you think.">

  </a>
  <figcaption class="center">GTA V on a Google Nexus 5? More likely than you think.</figcaption>
</figure>

<p>To set up Moonlight, I opened up the client and tried the automatic detection over the network. Unfortunately that did
not yield any results, so I input the IP address of the Windows VM manually. That worked well. This initiated a pairing
process that I had to continue using Parsec, because you need to input a code on the host machine. After that, I had to
quit Parsec and start streaming using Moonlight.</p>
<p>OK, not quite yet. Moonlight is able to detect the games installed on your system, but for a remote desktop experience,
you
<a href="https://github.com/moonlight-stream/moonlight-docs/wiki/Setup-Guide#using-moonlight-to-stream-your-entire-desktop">have to do a small tweak</a>
for it to be equivalent to the experience you get from Parsec.</p>
<p>One thing that I noticed at the start was that the image quality on the desktop isn&rsquo;t as good as on Parsec. However, it
more than makes up for it in-game. Moonlight just works. There are plenty of knobs you can turn as well, including
configuring the image quality by setting the resolution, framerate and network limits.</p>
<p>What makes Moonlight more suitable for me is that
the <a href="https://flathub.org/apps/details/com.moonlight_stream.Moonlight">Linux client packaged as a Flatpak</a>
is able to use the GPU for hardware-accelerated decode. The experience is great on a Linux machine and it just works,
which is not something you can always expect to happen. Even an older XBOX ONE controller connected over Bluetooth works
just fine over Moonlight!</p>
<p>The only issues that I had with Moonlight were later determined to be caused by networking issues. This shows up well on
the integrated statistics that Moonlight provides using the <code>Ctrl + Alt + Shift + S</code> key combination under
the <code>Network jitter</code> field. After stopping some services on my network, the issues went away.</p>
<h2 id="the-setup-one-month-later">
  <a class="heading-anchor" href="#the-setup-one-month-later">The setup: one month later<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>After a month of use, I have made some adjustments to the setup. I used to keep the VM running so that I could just jump
in and start playing whenever I liked it, but due to a tweak I made in the name of improving gaming performance, half
the CPU cores on my system were not available for other purposes, such as suffering through IntelliJ indexing the
project again. I decided to only power on the VM if I actually was about to take the time to play it. I haven&rsquo;t yet
figured out the best way to make this more convenient, though. I did make the &ldquo;Calculator&rdquo; key on my keyboard start/stop
the VM on demand, but then GNOME started ignoring the shortcut I had setup and opened the calculator anyway, so that was
a short-lived tweak.</p>
<p>A bigger change that I made to the setup was to store all my games on my ZFS pool that lives in another VM. For that,
I <a href="https://forum.level1techs.com/t/run-your-steam-library-from-a-nas-break-a-leg-challenge-update/107912">setup an iSCSI target using this guide as a starting point</a>
. I used the <a href="https://packages.debian.org/bullseye/tgt">tgt</a> package instead. That has worked out surprisingly well, but
the iSCSI target does not want to properly connect in the Windows VM on the first boot, which is mildly annoying. I soon
discovered that spinning rust just does not cut it and got more SSD-based storage, otherwise other processes on the NAS
could wreak havoc on the gaming experience in games like GTA V. Those issues were manifesting as long loading times and
objects popping in too late, resulting in half the roads and building being missing while driving around the map. The
iSCSI target solution also comes with the added bonus of having a proper backup of all my games. If Windows decides to
blow itself up again and I don&rsquo;t have a backup of the VM ready, then I could just reinstall it and not worry about
downloading and installing all the games again.</p>
<h2 id="verdict">
  <a class="heading-anchor" href="#verdict">Verdict<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Overall, I&rsquo;m very happy about the setup. I don&rsquo;t use it all too often, but occasionally launching <em>art of rally</em> or
<em>BeamNG.drive</em> on any random device I own is great. I do have some concerns about the future of this setup, especially
with Windows 11 having more strict system requirements and newer games demanding more performance. For the time being,
this works and I intend to keep it that way.</p>
<p><em>The one box that does it all</em>: so far so good!</p>
]]></content:encoded></item><item><title>DIY cloud gaming setup with VFIO, Parsec and AMD</title><link>https://ounapuu.ee/posts/2021/09/07/diy-cloud-gaming-vfio-parsec-amd/</link><pubDate>Tue, 07 Sep 2021 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2021/09/07/diy-cloud-gaming-vfio-parsec-amd/</guid><description>A build log of how I set up my own 'cloud gaming' setup, including all the issues I faced and attempts to fix those.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="DIY cloud gaming setup with VFIO, Parsec and AMD" /><p>This is a follow-up to <a href="/posts/2021/08/29/testing-gpu-passthrough-on-amd-ryzen-5700g/">my previous post</a> where I covered
the VFIO setup in general. For many people that would have been good enough, but my goal with this setup was to have a
powerful gaming setup that I could access from my living room PC with 20 meters of Ethernet cables between the two.</p>
<h2 id="cloud-gaming">
  <a class="heading-anchor" href="#cloud-gaming">Cloud gaming?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The concept of <a href="https://en.wikipedia.org/wiki/Cloud_gaming">cloud gaming</a> has become more popular lately,
with <a href="https://www.xbox.com/en-US/xbox-game-pass/cloud-gaming">Microsoft</a>,
<a href="https://stadia.google.com/">Google</a>, <a href="https://www.NVIDIA.com/en-eu/geforce-now/">NVIDIA</a> and others offering services
that allow you to stream games to your device. These setups usually include a powerful server in a datacenter rendering
the game and sending the compressed video stream to your device. This works surprisingly well, but due to high cost,
poor internet connectivity in many places in the world
and <a href="https://www.NVIDIA.com/en-us/geforce/forums/gfn-announcements/22/346564/2k-games-on-geforce-now/">licensing issues</a>
, this setup might not work well for everyone.</p>
<p>However, if you already own a moderately powerful gaming PC and would like to use it to play games you already own over
the network, then there are plenty of solutions that can get you there.</p>
<p>Here are some options:</p>
<ul>
<li><a href="https://store.steampowered.com/remoteplay">Steam remote play</a>: works for games launched via Steam.</li>
<li><a href="https://parsec.app/">Parsec</a>: able to stream the whole desktop, including games.</li>
<li><a href="https://moonlight-stream.org/">Moonlight</a>: same, but only usable on hosts with NVIDIA GPU-s due to the implementation
relying on NVIDIA&rsquo;s GameStream protocol.</li>
</ul>
<p>In the past, I&rsquo;ve had OK results with Steam remote play, but the limiting factor has been the reliance on Steam. I have
bought a couple of games from <a href="https://www.gog.com/">GOG</a> as well, which I could probably also play remotely by
launching them via Steam, I just don&rsquo;t want to go through the hassle.</p>
<p>For this setup I&rsquo;ve opted to go with Parsec. It&rsquo;s not perfect, but it&rsquo;s still good enough for our purposes. The GPU
we&rsquo;re using (AMD Radeon RX 570) also limits our options because it won&rsquo;t work with Moonlight.</p>
<p>The installation of Parsec is pretty straightforward: just install it on your host and client machines. In my case the
client machine is
a <a href="/posts/2021/06/28/breaking-and-fixing-thinkpad-x230/">Lenovo ThinkPad X230 that was brought back from the dead</a>
. It&rsquo;s not powerful, but at least it can do H.264 hardware decoding and it uses only 12W of power when idle, making it a
perfect candidate for testing this out. It&rsquo;s also worth mentioning that both machines are connected on the local network
using an Ethernet connection to avoid Wi-Fi becoming a bottleneck.</p>
<h2 id="vfio-gaming-and-you">
  <a class="heading-anchor" href="#vfio-gaming-and-you">VFIO, gaming and you<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>What turned out to be a bigger hurdle was the performance of games inside the VM. After getting everything running with
the VFIO setup, I didn&rsquo;t really spend any time trying to optimize the setup for the smoothest experience. When trying to
actually run this setup, I ran into quite a few problems with performance which mainly manifested as stutters and
unusually low framerates. Turns out that gaming has stricter latency requirements than other server workloads.</p>
<p>Thanks to the <a href="https://wiki.archlinux.org/title/PCI_passthrough_via_OVMF#Performance_tuning">great guide in Arch Wiki</a>,
I could get a lot of ideas on what to try out to improve the performance of this gaming virtual machine.</p>
<p>Before doing anything, I ran some benchmarks to get a sense of what performance levels I&rsquo;m dealing with. To test out
each individual change, I used GTA V as the gaming benchmark since it was pretty good at pointing out any performance
issues.</p>
<p>Here&rsquo;s a list of things that I ended up doing:</p>
<ul>
<li>setting the CPU model to <code>host-passthrough</code> in <code>virt-manager</code></li>
<li><a href="https://wiki.archlinux.org/title/PCI_passthrough_via_OVMF#Dynamically_isolating_CPUs">isolating CPU-s dynamically</a>
whenever the VM starts
and <a href="https://wiki.archlinux.org/title/PCI_passthrough_via_OVMF#CPU_pinning">pinning those CPU-s</a> to the VM to avoid
the host OS and other VM-s from using those cores</li>
<li>setting the CPU governor to performance on isolated cores to rule out issues with the CPU not clocking high enough and
switching between idle/load power
modes: <code>echo performance &gt; /sys/devices/system/cpu/cpu[4-7]/cpufreq/scaling_governor</code></li>
<li><a href="https://wiki.archlinux.org/title/PCI_passthrough_via_OVMF#Static_huge_pages">enabling static hugepages</a> to rule out
issues stemming from poor memory access speeds</li>
<li>disabling SMT in UEFI settings to get rid of one additional variable</li>
<li>getting a 64 GB DDR4-3600 memory kit to allocate more RAM to the VM (16 GB) and leave enough for the host machine and
other services</li>
</ul>
<p>The golden rule of troubleshooting is to change one variable at a time and comparing results. Not every change that I
made ended up being a positive one. For example, when configuring the VM to use 4 cores and 8 threads instead of plain 4
cores, I saw the framerates in GTA V drop 50%. I assume that the VM treated the &ldquo;SMT cores&rdquo; as real ones, causing the
Windows scheduler to make incorrect decisions.</p>
<p>After playing around with this setup and accumulating these tweaks, I managed to get rid of most of the issues that
bothered me during gaming, resulting in a much smoother experience. It finally felt like the gaming VM behaved like a
machine with a 4 core CPU, 16 GB of RAM and an AMD RX 570 inside it.</p>









<figure class="center">
  <a href="/posts/2021/09/07/diy-cloud-gaming-vfio-parsec-amd/media/cpu-before.png">
    <img src="/posts/2021/09/07/diy-cloud-gaming-vfio-parsec-amd/media/cpu-before_hu_f313c6dcbae3d716.webp"
     width="649"
     height="145"
     loading="lazy"
     decoding="async"
     alt="Passmark PerformanceTest CPU results before any tweaks.">

  </a>
  <figcaption class="center">Passmark PerformanceTest CPU results before any tweaks.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2021/09/07/diy-cloud-gaming-vfio-parsec-amd/media/cpu-after.png">
    <img src="/posts/2021/09/07/diy-cloud-gaming-vfio-parsec-amd/media/cpu-after_hu_442aa75b18b01707.webp"
     width="961"
     height="209"
     loading="lazy"
     decoding="async"
     alt="Passmark PerformanceTest CPU results after tweaks.">

  </a>
  <figcaption class="center">Passmark PerformanceTest CPU results after tweaks.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2021/09/07/diy-cloud-gaming-vfio-parsec-amd/media/memory-before.png">
    <img src="/posts/2021/09/07/diy-cloud-gaming-vfio-parsec-amd/media/memory-before_hu_d05a9f2cbaae0f6a.webp"
     width="539"
     height="142"
     loading="lazy"
     decoding="async"
     alt="Passmark PerformanceTest memory results before any tweaks.">

  </a>
  <figcaption class="center">Passmark PerformanceTest memory results before any tweaks.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2021/09/07/diy-cloud-gaming-vfio-parsec-amd/media/memory-after.png">
    <img src="/posts/2021/09/07/diy-cloud-gaming-vfio-parsec-amd/media/memory-after_hu_e2a84ae685917fe.webp"
     width="810"
     height="206"
     loading="lazy"
     decoding="async"
     alt="Passmark PerformanceTest memory results after tweaks.">

  </a>
  <figcaption class="center">Passmark PerformanceTest memory results after tweaks.</figcaption>
</figure>

<p>At this point I&rsquo;d consider the setup to be fantastic for someone who wants to play games with a VFIO setup. Since I was
using this setup over the network with Parsec, I soon ran into more issues, but this time with the GPU.</p>
<h2 id="gpu-issues">
  <a class="heading-anchor" href="#gpu-issues">GPU issues<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Parsec and other similar solutions rely on the host GPU to encode the image into a video stream using the encoder
present on the GPU die itself. You might see this being referred to as <em>hardware encoding</em> in settings. What I didn&rsquo;t
know before trying this setup is that AMD GPU encoders have a reputation
for <a href="https://support.parsec.app/hc/en-us/articles/115002683371-Troubleshooting-Lag-Latency-and-Quality-Issues">just being plain bad</a>:</p>
<blockquote>
<p>If the host has an AMD card, AMD is usually known for having worse encode than NVIDIA and even Intel.
You should be fine at low resolutions. If all guests support H.265 and have it turned on,
you may see better performance than with it off</p>
</blockquote>
<p>And this shows. When trying to stream at 1080p, the result was a stuttery and inconsistent mess. Imagine trying to play
at around 30fps with the frame timings graph resembling a heart rate monitor, that&rsquo;s what it felt like. At 720p, the
experience was so much smoother. Yes, the image quality suffers because of that, but at least it was mostly playable.</p>
<p>I decided to also try out if changing the codec from H.264 to H.265 has a significant impact. I did a quick test in Dirt
Rally due to it having a benchmark loop mode and checked the statistics that Parsec shows. With H.264, I saw encode
latency of about 10ms. With H.265, this latency was now at 8ms. Still not great, but it is technically a ~20%
improvement. The downside of this for my setup is that the client laptop simply does not support hardware accelerated
H.265 decode, which is something that Intel integrated graphics received support for in 7th gen CPU-s.</p>
<p>The GPU seems to also cause some trouble for Parsec, as it would fail to connect occasionally and reports a host encoder
issue. This is usually overcome by rebooting the VM, which can get quite annoying after a couple of times. At other
times, Parsec sometimes just froze during gameplay and caused the client to freeze at 100% CPU usage. Not what I&rsquo;d call
smooth sailing.</p>
<p>Another issue that I noticed by using <a href="https://www.msi.com/Landing/afterburner/graphics-cards">MSI Afterburner</a> is that
the framerate was still not that stable in some games, such as GTA V. After all the fixes and tweaks, there were still
small stutters, even with vsync enabled. I decided to look over AMD Radeon settings to see if a driver feature had an
unintended side effect. I had picked the <em>Gaming</em>
preset because that was what I was using this GPU for, but decided to switch to the <em>Standard</em> mode instead. And just
like that, the stutters were gone! I suspect that the <em>Radeon Anti-Lag</em> feature might have been the cause to this, as
that was one of the main settings that was disabled after switching to the <em>Standard</em> settings preset.</p>
<h2 id="is-it-worth-it">
  <a class="heading-anchor" href="#is-it-worth-it">Is it worth it?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I like a technical challenge and going through all the attempts to get more and more performance out of this setup was
interesting for me. However, it might not be the same way for everyone else. If you still feel like you want to go
through this and learn something along the way, then feel free to use this as a guide on what you can try. Make sure to
also read up on experiences that others have had with these tweaks and always measure your results to see if they had
the intended effect.</p>
<p>For those who just want to play games and not worry too much about getting the expected performance out of your machine,
I&rsquo;d still recommend going with building a separate gaming PC.</p>
<p>If I had to build a machine specifically for this type of workload, then I&rsquo;d make these changes:</p>
<ul>
<li>Replace the CPU with a non-APU model, such as the Ryzen 9 5950X. Due to
the <a href="https://images.anandtech.com/doci/16214/Ryzen9_3800X_Hand_575px_678x452.jpg">physical core layout</a> you could
assign one CPU core complex to the gaming VM and leave everything else to the host. These CPU-s also have a lot of L3
cache, which should help in workloads that require low latency, such as games.</li>
<li>If you&rsquo;re going for a streaming setup, then I&rsquo;d try it first with an NVIDIA GPU. The error code 43 issues are gone
now, making it a viable option with solutions like Moonlight.</li>
<li>More SATA or M.2 slots on the system. This makes passing through storage devices so much easier.</li>
</ul>
<h2 id="future-plans">
  <a class="heading-anchor" href="#future-plans">Future plans<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I&rsquo;m not planning on stopping this adventure just yet. I&rsquo;ve recently looked around for an NVIDIA GPU to do a comparison
against the AMD RX 570 and picked out an NVIDIA GTX 1060, which is from the same era and performance bracket. Should
make for an interesting comparison in both <em>Parsec vs Parsec</em> and <em>Parsec vs Moonlight</em> scenarios.</p>
<p>I&rsquo;m also hoping to eventually move to a more modern client PC that can support H.265 decoding and output at higher
resolutions. Yes, 4K at 60Hz is demanding for a laptop from 2012. Given that the laptop is an older ThinkPad, I expect
that to happen after 2025.</p>
<p>Regarding the storage setup, I&rsquo;ve got input from a friend saying that I might want to try setting up a Samba share on
my &ldquo;NAS&rdquo; VM and host my Steam library and other game files on that. After all, the virtual LAN has managed hit 2-3
Gbit/s in my testing and with L2ARC being persistent in ZFS 2.0, I might be able to take advantage of that as well (
assuming that I even need L2ARC, ARC efficiency is pretty good!). Currently I just have a Syncthing sync set up between
the &ldquo;NAS&rdquo; VM and the gaming VM so that there exists at least a basic backup of all my games.</p>
]]></content:encoded></item><item><title>Testing GPU passthrough on AMD Ryzen 7 5700G APU</title><link>https://ounapuu.ee/posts/2021/08/29/testing-gpu-passthrough-on-amd-ryzen-5700g/</link><pubDate>Sat, 28 Aug 2021 10:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2021/08/29/testing-gpu-passthrough-on-amd-ryzen-5700g/</guid><description>A quick overview of my experience with setting it up on a small PC box and things to consider when attempting this yourself.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Testing GPU passthrough on AMD Ryzen 7 5700G APU" /><h2 id="introduction">
  <a class="heading-anchor" href="#introduction">Introduction<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Before we jump into all the nitty-gritty details, I&rsquo;d like to go over what we are dealing with here since these topics
may be unfamiliar to you. VFIO is quite a niche topic and not everyone knows about it.</p>
<p><a href="https://wiki.archlinux.org/title/PCI_passthrough_via_OVMF">GPU passthrough</a>: the process of allowing a VM (virtual
machine) to use a dedicated GPU. This allows you to run GPU-heavy workloads inside the VM, such as gaming or anything
that benefits from GPU compute power.</p>
<p><a href="https://www.kernel.org/doc/Documentation/vfio.txt">VFIO</a>: the framework that allows us to perform this operation.</p>
<p><a href="https://en.wikipedia.org/wiki/Input%E2%80%93output_memory_management_unit">IOMMU</a>: hardware feature that supports all
of this.</p>
<p><a href="https://virt-manager.org/">virt-manager</a>: GUI application that I use to manage VM-s.</p>
<p>Reasons why you may want to go through all the hassle and use this approach:</p>
<ul>
<li>you&rsquo;re on Linux but want to play games occasionally without rebooting into Windows</li>
<li>you want to do all your work, gaming and server workloads on one machine</li>
<li>you simply don&rsquo;t want to build a dedicated PC for playing games and would like to utilize the existing resources on
your main machine</li>
<li>you want more control over the Windows installation because you simply don&rsquo;t trust Microsoft</li>
<li>you want to have more control over the Windows installation and the ability to revert the installation to an earlier
point in time using a filesystem that supports snapshots (BTRFS, ZFS)</li>
<li>you have multiple separate VM-s for different purposes, but you would like to use one single GPU for all of them</li>
</ul>
<p>One thing to keep in mind is that the hardware you use matters a lot here as that provides the foundation for getting
this solution working. Here are some of the requirements you should know about:</p>
<ul>
<li>The GPU you want to pass through has to support UEFI. GPU-s from the past 5 years should be good on that, but if you
have a really old GPU that you want to use for testing, then that might not work out that well.</li>
<li>You need to have a good-enough CPU and plenty of RAM. After all, you&rsquo;re essentially running a full PC within another
PC.</li>
<li>Your motherboard has to support IOMMU and have IOMMU groups that allow you to isolate the GPU and only pass the GPU to
the VM. <a href="https://www.youtube.com/user/teksyndicate">Level1Techs</a> does quite a few motherboard reviews and Wendell goes
over the IOMMU groups and suitability for VFIO in them. It also helps if you look around the internet for enthusiasts
that have already bought the same motherboard, they may have posted information about the groups. Here&rsquo;s
a <a href="https://wiki.archlinux.org/title/PCI_passthrough_via_OVMF#Ensuring_that_the_groups_are_valid">handy script that allows you to check your IOMMU groups.</a></li>
<li>Some games may ban you if they detect that you are running the game inside a VM. It&rsquo;s great that they&rsquo;re trying to do
something against cheaters, but unfortunately VFIO users get unfairly treated here. Please do some research beforehand
if you play competitive multiplayer games a lot!</li>
</ul>
<p>I hope that this introduction helped you understand the basics. Now, let&rsquo;s just jump right into it.</p>
<h2 id="setup">
  <a class="heading-anchor" href="#setup">Setup<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>We&rsquo;re going to test this setup
on <a href="/posts/2021/08/07/amd-ryzen-7-5700-first-impressions/">hardware that I have covered previously</a>. What makes this
setup a bit special is that we&rsquo;re using an AMD Ryzen 7 5700G APU on an mITX motherboard and a single dedicated GPU,
allowing us to do big things in a small package. Yes, there are setups where you can do VFIO with a single GPU and pass
it between the host OS and the VM, but that setup might be a bit tricky to use.</p>
<p>The OS is Fedora 34. To get this working, I&rsquo;ve used various resources:</p>
<ul>
<li><a href="https://forum.level1techs.com/t/the-vfio-and-gpu-passthrough-beginners-resource/129897">beginners guide on Level1Techs forums</a></li>
<li><a href="https://forum.level1techs.com/t/fedora-33-ultimiate-vfio-guide-for-2020-2021-wip/163814">Fedora-specific guide by Wendell from Level1Techs</a></li>
<li><a href="https://wiki.archlinux.org/title/PCI_passthrough_via_OVMF#Ensuring_that_the_groups_are_valid">this brilliant Arch Wiki guide that covers most of what you need to know about setting this up.</a>
It&rsquo;s not only useful for Arch, a lot of what is written here applies for any distro.</li>
</ul>
<h2 id="testing">
  <a class="heading-anchor" href="#testing">Testing<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I decided to do the initial testing with the Nvidia GT 710. It&rsquo;s slow, buggy on Linux on Nouveau open source drivers,
and I had it available. I also recently heard that Nvidia stopped being hostile towards their customers in one aspect
by <a href="https://www.nvidia.com/en-us/geforce/news/outriders-game-ready-driver/">allowing GeForce GPU-s to be used in a Windows 10 VM without having to resort to workarounds.</a></p>
<p>The testing itself was relatively straightforward. The only issues I had
were <a href="https://en.wiktionary.org/wiki/PEBCAK">PEBCAK</a> issues, possibly related to me performing this testing after work.
The main issues I ran were either small typos in dracut configuration or the wrong device ID-s being added to kernel
boot parameters. Once I discovered and fixed those, it was all smooth sailing.</p>
<p>I&rsquo;m not going to rewrite a full guide here, please refer to the previously linked resources if you need more details
than that. Those resources are also much more likely to receive updates about new finds and features.</p>
<p>The steps I took were roughly these:</p>
<ul>
<li>Make sure that IOMMU was enabled in UEFI settings. It&rsquo;s probably set to <code>auto</code> by default, make sure to set it
to <code>enabled</code>.</li>
<li>Install the GPU that I want to pass through and connect it to a monitor.</li>
<li>Install virtualization packages on Fedora: <code>sudo dnf install @virtualization</code></li>
<li>Enable IOMMU and preload the VFIO kernel module by adding <code>amd_iommu=on rd.driver.pre=vfio-pci</code> to Linux kernel
parameters.
<ul>
<li>I use GRUB2, these parameters live in <code>/etc/sysconfig/grub</code>.</li>
<li>To apply these changes, you have to regenerate the GRUB configuration. Under Fedora, this is done
using <code>grub2-mkconfig -o /etc/grub2-efi.cfg</code></li>
</ul>
</li>
<li>Get the device ID-s for the GPU and the related audio device that you&rsquo;re planning on passing through
<ul>
<li>To see the devices and ID-s, run <code>lspci -nnk</code>. The ID-s look something like <code>1002:aaf0</code>.</li>
</ul>
</li>
<li>Bind the GPU to <code>vfio-pci</code> to avoid the GPU driver from taking control of the GPU, otherwise you cannot pass it to the
VM.
<ul>
<li>I opted to go for the simple approach and added the device ID-s to kernel
parameters: <code>vfio-pci.ids=1002:67df,1002:aaf0</code></li>
<li>Since I went with this approach, then I have to regenerate GRUB configuration again.</li>
</ul>
</li>
<li>Make sure that the initramfs loads the necessary vfio drivers early in the boot.
<ul>
<li>With Fedora 34, this means creating a file <code>/etc/dracut.conf.d/10-vfio.conf</code> with
contents <code>add_drivers+=&quot; vfio_pci vfio vfio_iommu_type1 vfio_virqfd &quot;</code>.</li>
<li>Make sure that you don&rsquo;t have any typos in that.</li>
<li>Regenerate the initramfs: <code>dracut -f</code></li>
</ul>
</li>
<li>Reboot!</li>
<li>Using <code>virt-manager</code>, select the VM you want to pass the GPU through and add two PCIe devices: the GPU and its
associated audio device.
<ul>
<li>If you don&rsquo;t have the VM set up yet, then proceed with the normal installation without the GPU passed through yet.
Make sure to create an UEFI VM, otherwise you might run into issues. This can be configured in <code>virt-manager</code> _
Overview_ section by selecting the Q35 chipset and setting the firmware to <code>OVMF_CODE.df</code>.</li>
<li>If you have passed through the GPU, then make sure to remove the <code>Display Spice</code> device from the VM.</li>
<li>If you want to also control the VM, you need to also pass through your USB devices, such as a Logitech wireless
receiver.</li>
</ul>
</li>
<li>Start the VM and cheer once you notice TianoCore appearing on the monitor that&rsquo;s connected to the passed through GPU!</li>
</ul>









<figure class="center">
  <a href="/posts/2021/08/29/testing-gpu-passthrough-on-amd-ryzen-5700g/media/vfio-success.jpg">
    <img src="/posts/2021/08/29/testing-gpu-passthrough-on-amd-ryzen-5700g/media/vfio-success_hu_199212126e9325b5.webp"
     width="1107"
     height="800"
     loading="lazy"
     decoding="async"
     alt="If you see this, then you&#39;ve just successfully passed the GPU to the VM. Congratulations!">

  </a>
  <figcaption class="center">If you see this, then you&#39;ve just successfully passed the GPU to the VM. Congratulations!</figcaption>
</figure>

<h2 id="results-nvidia-gt-710">
  <a class="heading-anchor" href="#results-nvidia-gt-710">Results: Nvidia GT 710<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Initial testing with Nvidia GT 710 was successful. By successful, I mean that the GPU displayed an image and did not
install GPU drivers automatically.</p>









<figure class="center">
  <a href="/posts/2021/08/29/testing-gpu-passthrough-on-amd-ryzen-5700g/media/nvidia-error-43.jpg">
    <img src="/posts/2021/08/29/testing-gpu-passthrough-on-amd-ryzen-5700g/media/nvidia-error-43_hu_326f276537db01bf.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The infamous Nvidia error code 43.">

  </a>
  <figcaption class="center">The infamous Nvidia error code 43.</figcaption>
</figure>

<p>To overcome that last issue, I downloaded the latest official Nvidia GPU drivers and was good to go. The news were true,
error code 43 was no longer an issue!</p>









<figure class="center">
  <a href="/posts/2021/08/29/testing-gpu-passthrough-on-amd-ryzen-5700g/media/nvidia-postinstall.jpg">
    <img src="/posts/2021/08/29/testing-gpu-passthrough-on-amd-ryzen-5700g/media/nvidia-postinstall_hu_42e3d99bf6c38aba.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="If your GPU shows up like this in Device Manager, then it should work properly.">

  </a>
  <figcaption class="center">If your GPU shows up like this in Device Manager, then it should work properly.</figcaption>
</figure>

<p>Things got a bit less exciting when I got reminded that this GPU is weak. Very weak. Regardless, I decided to
demonstrate its computing prowess by downloading the <a href="https://funselektor.itch.io/art-of-rally">art of rally demo</a>. Side
note: it&rsquo;s a great game, go try it out!</p>
<p>The demo ran! Not well, but it still ran!</p>









<figure class="center">
  <a href="/posts/2021/08/29/testing-gpu-passthrough-on-amd-ryzen-5700g/media/nvidia-artofrally.jpg">
    <img src="/posts/2021/08/29/testing-gpu-passthrough-on-amd-ryzen-5700g/media/nvidia-artofrally_hu_b26dfefd5196674e.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Not pictured: the horrible framerate.">

  </a>
  <figcaption class="center">Not pictured: the horrible framerate.</figcaption>
</figure>

<p>Satisfied with the results, I decided to go for gold and replace this GPU with the AMD RX 570 that I &ldquo;borrowed&rdquo;
from <a href="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/">this PC I built recently</a>.</p>
<h2 id="results-amd-rx-570">
  <a class="heading-anchor" href="#results-amd-rx-570">Results: AMD RX 570<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>After switching the GPU, I replaced the device ID-s with the new values and continued with the VFIO adventure. This
time, the GPU drivers were automatically installed by Windows and everything just worked. That&rsquo;s not supposed to happen,
at least in my experience <em>something</em> always goes wrong. Always.</p>
<p>I installed the latest drivers from AMD-s website and continued with testing.</p>
<p>Furmark? Runs as expected.</p>









<figure class="center">
  <a href="/posts/2021/08/29/testing-gpu-passthrough-on-amd-ryzen-5700g/media/amd-furmark.jpg">
    <img src="/posts/2021/08/29/testing-gpu-passthrough-on-amd-ryzen-5700g/media/amd-furmark_hu_27a05e2f78a7e673.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="VM on the left, VM performance stats on the right, mess of cables everywhere.">

  </a>
  <figcaption class="center">VM on the left, VM performance stats on the right, mess of cables everywhere.</figcaption>
</figure>

<p>GTA IV? A stuttery mess, so yeah, runs as expected.</p>









<figure class="center">
  <a href="/posts/2021/08/29/testing-gpu-passthrough-on-amd-ryzen-5700g/media/amd-gta-iv.jpg">
    <img src="/posts/2021/08/29/testing-gpu-passthrough-on-amd-ryzen-5700g/media/amd-gta-iv_hu_64a674dc7b9cffa9.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="On the left: GTA IV, straight from the GPU. On the right: GTA IV, streamed via Parsec.">

  </a>
  <figcaption class="center">On the left: GTA IV, straight from the GPU. On the right: GTA IV, streamed via Parsec.</figcaption>
</figure>

<p>At this point the VM was assigned 4 CPU cores and I had performed no CPU pinning or optimizations of any kind, so the
results were pretty good.</p>
<h2 id="storage">
  <a class="heading-anchor" href="#storage">Storage<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Because I built this setup on my current workstation/server machine, the storage situation is a bit tricky. The other VM
that runs all the services has full access to the two 12TB hard drives and I wasn&rsquo;t interested in setting up a networked
storage setup. The only free spots I had were as follows:</p>
<ul>
<li>120GB partition from the NVMe SSD. Good enough for storing the Windows 10 system files.</li>
<li>2x 250GB partitions on the Samsung SATA 1TB SSD-s. Just enough to hold my recently played games, but not much more.
Running in striped configuration under Windows.</li>
</ul>
<p>I later opted to expand the game storage partitions to 375GB, which meant that I had to get rid of the extra
overprovisioning space that I had left aside. This setup is fine, but I&rsquo;m losing out on some of the benefits that come
with a virtualized Windows setup.</p>
<p>With regards to passing this storage to the VM, I had two options:</p>
<ul>
<li>keep using the SATA virtual disk: works out of the box, but might not perform as well.</li>
<li>use <code>virtio</code>: you need to manually load and install the drivers for Windows to recognize these disks, but allegedly
this has better performance than the SATA implementation.</li>
</ul>
<p>I started off with SATA and did a comparison against <code>virtio</code> using CrystalDiskMark.</p>









<figure class="center">
  <a href="/posts/2021/08/29/testing-gpu-passthrough-on-amd-ryzen-5700g/media/crystaldiskmark.png">
    <img src="/posts/2021/08/29/testing-gpu-passthrough-on-amd-ryzen-5700g/media/crystaldiskmark_hu_71252985bd8c9ed3.webp"
     width="1280"
     height="467"
     loading="lazy"
     decoding="async"
     alt="Left: SATA. Right: virtio.">

  </a>
  <figcaption class="center">Left: SATA. Right: virtio.</figcaption>
</figure>

<p><code>virtio</code> did come ahead in these comparisons, but I would probably have been fine with the SATA performance as well.</p>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>One of the main reasons I do these kinds of setups is the technical challenge. It sounds weird, but sometimes I am
happier after having completed something technical and novel compared to actually using the setup.</p>
<p>Previously I&rsquo;ve had mixed results with GPU passthrough,
with <a href="https://www.reddit.com/r/linuxmasterrace/comments/7ry4jr/gta_v_on_arch_linux_how_i_managed_to_get_gpu/">ThinkPad T430 and eGPU somehow managing to run GTA V in a VM</a>
, while in another testing session I ran into issues which turned out to be related to the CPU being faulty (lots of
PCIe errors).</p>
<p>I do have more practical future plans with this. The plan is to use this VM as a gaming VM that I can stream games from
using <a href="https://parsec.app/">Parsec</a>
to any device that I wish. One idea is to use the <a href="https://www.nvidia.com/en-us/shield/shield-tv/">Nvidia Shield TV</a> as
a low-power box that is capable of performing streaming. Alternatively, I could also get a super tiny form factor
Dell/Lenovo/HP PC that has plenty of power to drive a 4K display and uses a reasonable amount of power. More on that in
a future post.</p>
<p>Regarding storage I foresee an upgrade coming soon, either to the drives themselves or the whole setup since ATX
motherboards support more SATA ports and expansion cards. If you also pair that up with a case
like <a href="https://www.coolermaster.com/catalog/cases/mid-tower/masterbox-q500l/">Masterbox Q500L</a> with a good power supply
placement, then you&rsquo;d still have a relatively small setup.</p>
]]></content:encoded></item><item><title>Turning leftover PC parts into a decent gaming PC</title><link>https://ounapuu.ee/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/</link><pubDate>Sat, 21 Aug 2021 18:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/</guid><description>Putting the 'reuse' in 'Reduce, reuse, recycle'.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Turning leftover PC parts into a decent gaming PC" /><h2 id="introduction">
  <a class="heading-anchor" href="#introduction">Introduction<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>About a year ago, I bought an used PC based off of
a <a href="https://www.lenovo.com/us/en/desktops/erazer/x-series/x510/">Lenovo Erazer X510</a>. It had a dual-core Intel Pentium
G3220 CPU, 4GB of DDR3 RAM, a crappy Codegen 400W power supply and a 60GB SSD. I added an Nvidia GTX 1050 and just like
that, a budget gaming PC was born. My brother ended up using it, and it was good for games that didn&rsquo;t require a
powerful CPU.</p>









<figure class="center">
  <a href="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/lenovoprebuilt.jpg">
    <img src="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/lenovoprebuilt_hu_87bda0fd87b440f5.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="This is the box that started it all.">

  </a>
  <figcaption class="center">This is the box that started it all.</figcaption>
</figure>

<p>A year later, the dual core CPU was really showing its age. It could not even run GTA V, and the 4GB of RAM did not help
the situation either. After checking the used PC parts market, I had essentially two choices:</p>
<ul>
<li>get a quad core CPU (Haswell Intel i5) and upgrade the memory to 8GB</li>
<li>get a cheap PC and move over some parts, such as the GPU, SSD etc.</li>
</ul>
<h2 id="performing-the-upgrade">
  <a class="heading-anchor" href="#performing-the-upgrade">Performing the upgrade<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I happened to find a PC that cost less than the CPU + RAM upgrade would have cost for the original setup. However, that
PC was a complete horror show, and I only discovered that once I brought it home. Here&rsquo;s a short list of things wrong
with the PC:</p>
<ul>
<li>The Nvidia GT 210 that was inside it was missing the L-bracket, and the heatsink had been cut, and another smaller
heatsink was brutally screwed on top of the existing one. That&rsquo;s definitely how cooling works, right?</li>
<li>The Windows 10 installation that it came with was probably a pirated Russian version of it. I couldn&rsquo;t confirm it
because the installation bluescreened on the first boot and everything was in Russian.</li>
<li>It had some random stickers on it, which was fine, but it took some force and alcohol to get it off properly.</li>
<li>One of the memory sticks inside it threw a lot of errors in memtest. Might explain that BSOD I got.</li>
<li>The HDD was barely held in place with a wood screw. Yes, a wood screw.</li>
<li>One of the PC fans was not connected. The end of the connector was just cut off and the exposed cables were wrapped
over another power cable. I don&rsquo;t know how that could have ever worked.</li>
</ul>









<figure class="center">
  <a href="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/wtf-1.jpg">
    <img src="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/wtf-1_hu_f2ee96fc8c24c140.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="This GPU was held in place with a piece of wire.">

  </a>
  <figcaption class="center">This GPU was held in place with a piece of wire.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/wtf-2.jpg">
    <img src="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/wtf-2_hu_a78fb667ab77287c.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Oh, it gets worse.">

  </a>
  <figcaption class="center">Oh, it gets worse.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/wtf-3.jpg">
    <img src="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/wtf-3_hu_7e05ca487f5c2c70.webp"
     width="1024"
     height="768"
     loading="lazy"
     decoding="async"
     alt="I don&#39;t know if I should be mad as this is clearly a fantastic demonstration of the creativity that some people have.">

  </a>
  <figcaption class="center">I don&#39;t know if I should be mad as this is clearly a fantastic demonstration of the creativity that some people have.</figcaption>
</figure>

<p>It goes to show that you really need to do your homework when buying a suspiciously cheap PC. In my case it was fine as
I was going to replace a lot of the parts anyway and it ended up being a good gaming PC, capable of running GTA V and
streaming CSGO on Twitch. A less experienced buyer would have been absolutely screwed though.</p>
<p>After moving the good parts over, I was left with a weak but functional PC. I didn&rsquo;t really have a good use for it so I
considered selling it. But then I thought about it and decided to try to build a good gaming PC out of it, since I
didn&rsquo;t have a competent machine at the time and I needed something to drive a big TV.</p>
<h2 id="the-plan">
  <a class="heading-anchor" href="#the-plan">The plan<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The case and the PSU this setup came with were not that great. I&rsquo;d hate it if I built a good PC and the shoddy PSU fried
it.</p>
<p>After some careful consideration, I decided to get the following:</p>
<ul>
<li>Case: Fractal Design Meshify Mini C with dark tempered glass. I would have preferred a plain version of this case, but
the tempered glass doesn&rsquo;t look half bad either, just can&rsquo;t drop that panel. Oh, and it looks good as well.</li>
<li>PSU: Seasonic Core 500W 80+ Gold. They make good stuff.</li>
<li>Storage: 2x 1TB Crucial BX500 SSD. Have to keep the games somewhere and an SSD-based RAID0 setup made the most sense
to me.</li>
</ul>
<p>The core of the system would be the motherboard, CPU and 8GB of RAM that I pieced together from leftover sticks. All I
needed to do now was to simply upgrade the CPU and get myself a GPU, right?</p>
<h2 id="cpu-upgrade">
  <a class="heading-anchor" href="#cpu-upgrade">CPU upgrade<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The Lenovo Sharkbay platform supports Haswell CPU-s, which includes Intel Core 4000 series CPU-s. I checked used CPU
listings and opted for an Intel i5 4460. 4 cores, 4 threads at a reasonable clock speed, that should play all the games
I have with reasonable performance.</p>
<p>The CPU arrived, and with it came trouble. Because I started following the hardware world in more detail in 2016, I was
not aware of one crucial detail: <em>Haswell</em> vs <em>Haswell Refresh</em>. Turns out that the CPU I bought was part of the Haswell
Refresh series, meaning that you either needed a motherboard that supported this CPU, or a motherboard that offered a
BIOS update which adds support for the upgraded CPU-s. This motherboard from the Lenovo prebuilt PC turned out to be
neither of them. The fans spun up and kept spinning at max speed, but the PC did not POST.</p>
<p>Frustrated and disappointed, I decided to double down. I got myself another used CPU and was luckily able to sell the
existing CPU for the same price I got it for. This time, the CPU was the Intel i5 4440, same specs, but a year older and
a small drop in clock speeds. Plug it in, and it works like a charm.</p>
<h2 id="proprietary-connections">
  <a class="heading-anchor" href="#proprietary-connections">Proprietary connections<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Once the new parts arrived, I started building. I knew that the Lenovo machine had some non-standard front panel
connectors that would not work well with more standard cases. I got myself a PCIe USB 3.0 internal header adaptor to
enable the front USB ports and left the audio ports disconnected since I had no need for them.</p>









<figure class="center">
  <a href="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/the-build-internals-3.jpg">
    <img src="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/the-build-internals-3_hu_e32c50ca07f93b92.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="PCIe to USB 3.0 internal header adapter, and dust.">

  </a>
  <figcaption class="center">PCIe to USB 3.0 internal header adapter, and dust.</figcaption>
</figure>

<p>Finding out which pins are for the power button was also a relatively simple process. I grabbed my flathead screwdriver
and tried shorting pairs of pins in the front panel connector area. Once I found the one that turned the machine on, I
connected the PC power button connector there. I didn&rsquo;t care for the other connectors, so I left those disconnected as
well.</p>









<figure class="center">
  <a href="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/the-build-internals-5.jpg">
    <img src="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/the-build-internals-5_hu_d8e2695341095e77.webp"
     width="823"
     height="800"
     loading="lazy"
     decoding="async"
     alt="These are the two pins that you need to short to turn this machine on.">

  </a>
  <figcaption class="center">These are the two pins that you need to short to turn this machine on.</figcaption>
</figure>

<h2 id="adding-the-gpu">
  <a class="heading-anchor" href="#adding-the-gpu">Adding the GPU<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>To make this machine into a proper gaming PC, I needed a GPU. At first, I used an AMD RX 560 that I had, but since I
borrowed it from my main PC and the Nvidia GT 710 was a horrible GPU for even the most basic tasks, I had to put that
one back into the workstation.</p>
<p>The GPU market of mid-2021 is not that great. Any decent GPU from the last 5 years is completely overpriced, and even
cards like AMD RX 480 - a 5 year old card at this point - sell for the original price from 2016. Somehow I managed to
stumble upon an AMD RX 570 4GB model with a somewhat acceptable price, so I pulled the trigger on that one. That card is
powerful enough to keep me busy until the prices for newer GPU-s become reasonable on the used market.</p>
<p>I plug the GPU in, and the TV displays nothing but a black screen. Tried the Nvidia GT 710 and the integrated graphics,
all good. Tried the RX 570 as a secondary GPU, and the PC gets past the POST screen. Odd.</p>
<p>After some searching and digging, I saw some forum posts detailing how the CSM (compatibility support module) setting on
the motherboard could fix the issue. I went into the BIOS while running off of integrated graphics, enabled CSM, plugged
the RX 570 in, booted, and it actually worked now!</p>
<p>What I discovered after using the GPU for a while was that it got quite loud under load, even though the GPU itself
wasn&rsquo;t that dusty. While cleaning it, I noticed that the thermal paste seems to have never been changed, and it showed:
the thermal paste was rock solid. I had to take a plastic prying tool to get rid of the thermal paste without breaking
the GPU. A repaste and a reassembly later, the GPU was whisper-quiet even under a full FurMark test.</p>
<h2 id="cooling">
  <a class="heading-anchor" href="#cooling">Cooling<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The Lenovo prebuilt game with a surprisingly adequate CPU cooler. However, the fan was not having a good time and made
more noise than I&rsquo;d like. I decided to splurge a bit and got for a beQuiet Pure Rock Slim 2 as I had a good experience
running that cooler on a PC I built years earlier.</p>
<p>When installing it, I noticed one critical flaw: the CPU cooler mounting holes were non-standard. They were simply too
big. If I had the patience, I could have probably added some washers or other available solutions to fix it. Anyway, I
ended up just replacing the fan on the original cooler with the one from the beQuiet cooler. I could probably use the
CPU cooler in another project, so no big loss there.</p>
<p>I also noticed that the stock fan curve (or lack of it) means that the case fans run pretty loud by default. To fix
this, I used Noctua low noise adapters that I happened to have from previous projects. It did fix the issue, but I still
wish that I had more granular control over the fan speeds.</p>
<h2 id="how-well-does-it-work">
  <a class="heading-anchor" href="#how-well-does-it-work">How well does it work?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This PC has mainly two uses: watching media and playing games. To keep it short: yes, it works well for these use cases.
I value smooth performance more than a crystal clear image, which results in me running all of my games under 1080p and
medium-high settings.</p>
<p>I don&rsquo;t consider this particular setup to be in any way practical. The cost of all the parts is actually quite big once
you add it all up. The setup does do everything that I need it for and that&rsquo;s what makes it worth it for me. As an
additional bonus, I also get the satisfaction of prolonging the life of the used parts (CPU, RAM, motherboard).</p>
<p>I&rsquo;ll try to see how long I can keep using this setup. In case the CPU and/or RAM become the limiting factors, I&rsquo;ll just
replace that part of the system with something reasonable and carry the rest of the system over.</p>
<h2 id="gallery">
  <a class="heading-anchor" href="#gallery">Gallery<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Here&rsquo;s what the setup looks like.</p>









<figure class="center">
  <a href="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/the-build.jpg">
    <img src="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/the-build_hu_fd98b89aea13118.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The tinted glass does a great job at hiding the green PCB.">

  </a>
  <figcaption class="center">The tinted glass does a great job at hiding the green PCB.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/the-build-internals.jpg">
    <img src="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/the-build-internals_hu_b5ad1d960fff972d.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Here&#39;s what it looks like on the inside.">

  </a>
  <figcaption class="center">Here&#39;s what it looks like on the inside.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/the-build-internals-2.jpg">
    <img src="/posts/2021/08/21/turning-leftover-parts-into-a-decent-gaming-pc/media/the-build-internals-2_hu_c9d9e9f519f8b4cf.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The same, but now at a pretty angle!">

  </a>
  <figcaption class="center">The same, but now at a pretty angle!</figcaption>
</figure>

]]></content:encoded></item></channel></rss>