Vr hellscape (#418)
* start VR post Signed-off-by: Xe <me@christine.website> * friendship ended, other NixOS steps Signed-off-by: Xe <me@christine.website> * controller model is backwards Signed-off-by: Xe <me@christine.website> * i word good Signed-off-by: Xe <me@christine.website>
This commit is contained in:
parent
3937405b85
commit
912fd7473d
|
@ -0,0 +1,580 @@
|
|||
---
|
||||
title: My VR Hell on NixOS
|
||||
date: 2021-12-02
|
||||
author: ectamorphic
|
||||
---
|
||||
|
||||
Recently I got a new VR setup that uses my tower directly instead of the [wifi
|
||||
streaming
|
||||
catastrophe](https://christine.website/blog/convoluted-vrchat-gchat-setup-2021-02-24).
|
||||
I have a [Valve Index](https://store.steampowered.com/valveindex) and an [AMD
|
||||
RX6700XT](https://www.amd.com/en/products/graphics/amd-radeon-rx-6700-xt) GPU.
|
||||
Some huge advantages of this setup include:
|
||||
|
||||
* Being able to use Linux instead of being railroaded into using Windows for my
|
||||
V-tubing streams. I would like to do some more v-tube style content (maybe
|
||||
including maybe some NixOS hacking streams in Lojban in the future), and
|
||||
honestly I feel that the look of me being a super Linux hacker person [visibly
|
||||
using Windows Terminal in streams](https://youtu.be/ntTibBgi_Fg) is very
|
||||
wrong. [Yes I know Windows 11 has Wayland support for running GUI programs that
|
||||
way, but I am not going to be an unpaid beta tester for a trillion dollar
|
||||
company that wanted to fire its QA team so that they could get more number on
|
||||
a spreadsheet even though they have so throughly saturated the market that
|
||||
it's nearly impossible to displace them, which makes future growth frankly
|
||||
ridiculous.](conversation://Cadey/angy)
|
||||
* Lower latency in my VR experiences. Fear is the mind killer, and latency is
|
||||
the immersion killer. With this new setup things feel _instant_, especially
|
||||
with the 144hz of the Valve Index (my Quest 2 only got up to 120hz at most,
|
||||
but over wifi the only stable frame rate I could get was 72hz due to VR and
|
||||
the video encoding fighting for GPU time).
|
||||
* Full-body tracking support with the Index lighthouses. This will mostly be for
|
||||
me in VRChat and maybe when [working out in Beat Saber
|
||||
streams](https://youtu.be/AvPjHweTFxc).
|
||||
* Not having Facebook in the loop. [We will not be respecting Facebook's name
|
||||
change until they file the appropriate court order and get their identity
|
||||
documents updated everywhere, if only as revenge for their transphobic
|
||||
"real name" policies.](conversation://Cadey/enby)
|
||||
* The headset has a pair of headphones built in so I don't have to move my
|
||||
headphones between devices constantly.
|
||||
[I'd argue they're very directionalized speakers.](conversation://Mara/hacker)
|
||||
|
||||
As expected, it works great on Windows. As the title infers, it does NOT work
|
||||
well for me on NixOS.
|
||||
|
||||
[This is not a blogpost, it's a cry for help.](conversation://Numa/delet)
|
||||
|
||||
Here is the saga of things I have tried.
|
||||
|
||||
## Limbo
|
||||
|
||||
First I tried the naïve route. I just plugged everything in and decided to see
|
||||
what happens with SteamVR. I installed SteamVR through NixOS natively
|
||||
(specifically choosing the "pretend to be Ubuntu" route in order to minimize
|
||||
downsides due to ABI demons), and the headset showed right up.
|
||||
|
||||
I opened SteamVR and I got a prompt asking me to make some changes with root. I
|
||||
was expecting this, doing stuff with raw hardware like you need to with VR does
|
||||
require some root privileges, and this was likely for blessing the SteamVR
|
||||
programs to not require running as root all the time. I hit `yes`, typed in my
|
||||
password and SteamVR stopped showing as "Launching" on the Steam UI.
|
||||
|
||||
I killed Steam completely and then relaunched it from a terminal so I could see
|
||||
the logs to standard out.
|
||||
|
||||
[Pro tip, apparently GNOME runs every application in its own systemd slice
|
||||
(which really does explain why GNOME has a hard requirement for systemd as well
|
||||
as why the "Force Quit" button actually seems to work reliably and clean up all
|
||||
the associated clutter in one fell swoop), so you can fetch this stuff from your
|
||||
user journal with `systemctl --user status` to find the slices (type `/steam`
|
||||
and hit the enter key to search for it) and `journalctl --user -u $name.slice`
|
||||
to look through their output that way.](conversation://Mara/hacker)
|
||||
|
||||
Turns out that the blessing was to give the SteamVR compositor permissions to
|
||||
run as a real-time process. This makes sense. VR is something where minor delays
|
||||
can be the difference between being totally fine and puking your guts out due to
|
||||
motion sickness. Running the VR compositor as a realtime process is completely
|
||||
understandable because it reduces the chance of any possible delay in the
|
||||
scheduler.
|
||||
|
||||
However, on NixOS this just makes the SteamVR compositor crash for some reason.
|
||||
Never really got a good answer as to why, just that you should never let it set
|
||||
those permissions for any reason.
|
||||
|
||||
So to get it even to a point where things would work, I told Steam to completely
|
||||
delete SteamVR and then reinstalled it from scratch. I hoped that my config
|
||||
would get nuked and I could start over. My config got nuked and I got everything
|
||||
set up again, making sure to choose "No" on the "SteamVR needs root access for
|
||||
additional setup" prompt.
|
||||
|
||||
[As an aside, it seems that most of the people that do VR on NixOS that I know
|
||||
use Nvidia cards. Nvidia drivers on NixOS seem to be significantly less cursed
|
||||
when compared to other distros, however when I built this tower I was building
|
||||
it assuming that I would primarily run NixOS on it. This made me pick an AMD
|
||||
card even though they have slightly less waifus per second compared to their
|
||||
Nvidia counterparts. However the fact that `amdgpu` is in the damn kernel by
|
||||
default and the AMD team works _with_ mesa to make things work well was the
|
||||
selling point for me. Maybe I should try an Nvidia
|
||||
card?](conversation://Cadey/enby)
|
||||
|
||||
## Lust
|
||||
|
||||
After that, everything worked as I expected out of the box for playing VRChat,
|
||||
which was surprising. I had switched to Xorg from Wayland a while ago in
|
||||
preparation for this (for some reason VR on Wayland ranges from "lol" to "you're
|
||||
totally screwed"), and I was ready to get off to the races.
|
||||
|
||||
[That Wayland comment seems ominous...](conversation://Mara/hmm)
|
||||
|
||||
Then I tried to open the SteamVR overlay. Nothing happened. I looked at my
|
||||
controllers in VR and it seemed like the occlusion model was backwards:
|
||||
|
||||
<center>
|
||||
|
||||
![The insides of the controller rendering on the
|
||||
outside](/static/blog/vr-hellscape/backwards_controller.png)
|
||||
|
||||
</center>
|
||||
|
||||
I can deal with this, but it certainly _feels_ weird this way.
|
||||
|
||||
[This is when I knew I was in for a ride.](conversation://Cadey/facepalm)
|
||||
|
||||
The thing that surprised me the most was that the audio stack worked instantly
|
||||
the way I expected. All the audio moved over to the headset and the default
|
||||
microphone device was set to the headset and **EVERYTHING RESPECTED THAT WITH NO
|
||||
FURTHER CONFIGURATION**.
|
||||
|
||||
[This article is mostly about struggles with Linux, but the struggles with
|
||||
Windows are real too. For some reason on Windows the default speaker device will
|
||||
get moved over to the Index without issue, but the default **microphone** will
|
||||
not. I have not been able to find any way to fix this and it doesn't happen with
|
||||
my husband's Index so I assume this is just either me or Discord being utterly
|
||||
and irrevocably cursed beyond repair.](conversation://Cadey/facepalm)
|
||||
|
||||
Not having the SteamVR overlay is a nonstarter for me. I use the SteamVR overlay
|
||||
to move between games, tweak graphic settings on the fly and fiddle with the
|
||||
desktop should I need to.
|
||||
|
||||
## Gluttony
|
||||
|
||||
So I started tinkering with settings, kernel versions and more to try to get
|
||||
more things working. Keep in mind that at this point I had a mostly functional
|
||||
setup on NixOS. I could play games, but the ergonomics for moving between games
|
||||
ranged from "lol" to "walk over to the PC every time to open the game manually
|
||||
and wait for the shaders to compile".
|
||||
|
||||
I had heard that the flatpak version of Steam was less cursed by a friend of
|
||||
mine who seems utterly convinced that flatpak is the next coming of sliced
|
||||
bread. [Flatpak](https://flatpak.org/) seems like one of those things that you
|
||||
come up with when you want all the advantages of Nix but really really love
|
||||
YAML. Flatpak is a valid strategy for packaging complicated software like this
|
||||
because the sandboxing and discrete platform runtime strategy would make it _so
|
||||
much easier_ to handle the levels of cursed involved with getting otherwise ABI
|
||||
conflicting things to run consistently across distros.
|
||||
|
||||
So I tried Flatpak Steam. One annoying part about installing stuff in Flatpak is
|
||||
that Flatpak prefers to put things in `.desktop` files that are registered to
|
||||
your desktop environment's program launcher instead of putting a name in your
|
||||
`$PATH`. This also makes sense because they are obviously targeting GUI apps and
|
||||
doing it that way would likely make life a lot easier for GUI apps. Then keep in
|
||||
mind that I want logs to see what is going on so I can have _any hope_ of
|
||||
frantically googling things to understand how to fix this. Mind you this is
|
||||
before the trick involving systemd slices was revealed to me so I didn't have
|
||||
any other way to get output directly.
|
||||
|
||||
[Yes I know SteamVR on Linux has logfiles. I was in struggle mode and just
|
||||
wanted to be able to scroll up and see what went wrong.](conversation://Cadey/coffee)
|
||||
|
||||
I wrote this script to launch Flatpak Steam called `steam2`:
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
export SDL_VIDEODRIVER=x11
|
||||
exec flatpak run com.valvesoftware.Steam
|
||||
```
|
||||
|
||||
I then ran it, logged in, enabled global Steam Play, restarted Steam, installed
|
||||
SteamVR and VRChat and then set up my playspace again. I put on the headset and
|
||||
things didn't totally work. The overlay was still broken. At this point I was
|
||||
starting to have thoughts like:
|
||||
|
||||
[Okay, is NixOS broken, is Steam broken, is SteamVR broken, or am I
|
||||
broken?](conversation://Mara/hmm)
|
||||
|
||||
At least I was able to log into VRChat and go to a public world. I went to [The
|
||||
Black Cat](https://vrchat-legends.fandom.com/wiki/The_Black_Cat) and asked
|
||||
someone there if they could hear me. They could and wondered what was going on.
|
||||
I told them I was from the future and to not worry and then closed VRChat after
|
||||
saying "oh no, the connection is fading, make sure you remember the secret of
|
||||
life, the universe, and everything is-". I had gotten things somewhat working
|
||||
and I was fairly exhausted at this point, so I decided to call it a day and
|
||||
headed to bed.
|
||||
|
||||
## Greed
|
||||
|
||||
At the advice of a trusted friend, I tried running everything in Wayland.
|
||||
Wayland works at a much lower level with the GPU, so it should probably have a
|
||||
bit of an easier time. I unmasked wayland sessions and sway from my NixOS config
|
||||
and then rebooted and logged into sway.
|
||||
|
||||
Out of the corner of my eye I saw the VR headset light up like it had video
|
||||
rendering to it. This struck me as odd, because there's a special xrandr
|
||||
property to tell display servers "hey you dingus, this isn't a monitor: don't
|
||||
treat it as one":
|
||||
|
||||
```
|
||||
DisplayPort-1 disconnected (normal left inverted right x axis y axis)
|
||||
<...>
|
||||
non-desktop: 1
|
||||
range: (0, 1)
|
||||
2880x1600 144.00
|
||||
```
|
||||
|
||||
The resolution and refresh rate match [the specs for the
|
||||
Index](https://en.wikipedia.org/wiki/Valve_Index) if you put both 1440x1600
|
||||
panels next to eachother as one big screen (most of the time they do this at the
|
||||
manufacturing/software stage so that game engines can render one weirdly skewed
|
||||
image to the "screen" and not have to manage two separate framebuffers that
|
||||
could get out of sync, turning weaker people into vomit cannons). If you haven't
|
||||
ever tried to look at Discord badly rendered to a VR headset before, you aren't
|
||||
missing out on much. I then made a change to my sway config to tell sway to
|
||||
disable the Valve Index output:
|
||||
|
||||
```nix
|
||||
cadey.sway.output."DP-2".disable = "";
|
||||
```
|
||||
|
||||
[This is also ominous...](conversation://Mara/hmm)
|
||||
|
||||
Then I rebuilt my config, sway picked up on it and then turned off the headset
|
||||
view. I launched SteamVR and then it started rendering to the desktop. If you've
|
||||
never seen what it looks like when a VR headset starts rendering to the desktop
|
||||
instead of to the headset directly, it looks something like this:
|
||||
|
||||
![The SteamVR home, but the raw image that the headset sees. You do not want to
|
||||
see this on your
|
||||
desktop.](https://cdn.christine.website/file/christine-static/blog/Screenshot+from+2021-12-02+07-31-01.png)
|
||||
|
||||
I told SteamVR to restart in "direct display" mode, but it was failing because
|
||||
SteamVR couldn't restart due to a missing dynamic library problem:
|
||||
|
||||
```
|
||||
/home/cadey/.local/share/Steam/steamapps/common/SteamVR/bin/linux64/restarthelper: error while loading shared libraries: libQt5Core.so.5: cannot open shared object file: No such file or directory
|
||||
```
|
||||
|
||||
This is not good. I don't have a working setup in Wayland. Sway is fairly low
|
||||
level and boring as far as Wayland compositors go, so an incompatibility here
|
||||
has to point to something much more low level right? Turns out that Wayland
|
||||
(more specifically XWayland) doesn't support the rigging needed in order to have
|
||||
the SteamVR compositor yank a display for itself (specifically via the Vulkan
|
||||
extension `VK_EXT_direct_mode_display`), so it will probably never work until
|
||||
that is supported.
|
||||
|
||||
This is annoying, but understandable to a point. Wayland is still fairly new and
|
||||
has to compete with an ungodly number of hacks that have been put into Xorg over
|
||||
the years for weird cases like this.
|
||||
|
||||
## Anger
|
||||
|
||||
So I disabled Wayland/sway in my NixOS config, rebooted (just to be sure, you
|
||||
can never totally be sure with display managers) and then tried SteamVR via
|
||||
native Steam again. Surely it had to work, right?
|
||||
|
||||
Nope. It rendered to the desktop again. Hitting restart got that same "cannot
|
||||
open shared object file" error. Restarting it manually got a different error
|
||||
though:
|
||||
|
||||
![Error starting SteamVR: SteamVR failed to initialized for unknown reasons.
|
||||
(Error: Shared IPC Compositor Invalid Connect Response
|
||||
(307))](https://cdn.christine.website/file/christine-static/blog/Screenshot+from+2021-11-30+22-36-04.png)
|
||||
|
||||
This seems to be a sort of "catchall" error in SteamVR for when something really
|
||||
wrong happens at lower parts of the stack. Googling for this mostly got people
|
||||
running into this with Nvidia cards, and nearly always the fix for them was
|
||||
"reinstall your GPU driver". That both doesn't make sense for me and is kind of
|
||||
impossible because my AMD card uses `amdgpu`, which is a part of the Linux
|
||||
kernel and can't really be "reinstalled" arbitrarily on NixOS.
|
||||
|
||||
[NixOS is effectively a "build everything from source" distribution with a
|
||||
binary cache that is used to cheat your way out of not having to build things
|
||||
from source. So when you "install" a package you are really downloading it from
|
||||
the NixOS cache server (or building it if it doesn't exist there) and then
|
||||
telling Nix to symlink it to the right place. In this model, it doesn't really
|
||||
make sense to be able to "reinstall" packages.](conversation://Mara/hacker)
|
||||
|
||||
I went through a lot of settings, messed with X and more but got nowhere. I was
|
||||
running strace on the SteamVR compositor at one point but still had no real
|
||||
clear path forward.
|
||||
|
||||
The same trusted friend that told me to try Wayland was flabbergasted at this
|
||||
point. This kind of error makes _absolutely no sense_ yet here we are, living
|
||||
it!
|
||||
|
||||
## Heresy
|
||||
|
||||
I was asked to try a "normal" distribution out. Seeing as that Valve has been
|
||||
like:
|
||||
|
||||
<center>
|
||||
|
||||
![The steam logo saying "friendship ended with Debian, now Arch is my best
|
||||
friend" while shaking hands with the Arch linux
|
||||
logo.](/static/blog/vr-hellscape/steam_debian_arch_friendship.jpg)
|
||||
|
||||
</center>
|
||||
|
||||
I thought that I should choose [Arch Linux](https://archlinux.org/) to verify
|
||||
this against. Arch is the basis for the new version of SteamOS, so surely this
|
||||
should work better, right?
|
||||
|
||||
[What is it with you and being so ominous?](conversation://Mara/hmm)
|
||||
|
||||
So I downloaded the Arch iso, wrote it to a flashdrive and then booted my tower
|
||||
off of it. My disk layout looks a bit like this:
|
||||
|
||||
<center>
|
||||
|
||||
![Disk layout diagram](/static/blog/vr-hellscape/before.svg)
|
||||
|
||||
</center>
|
||||
|
||||
[At some point I am intending to reinstall NixOS on my tower with a ZFS root,
|
||||
but today is not that day.](conversation://Cadey/coffee)
|
||||
|
||||
However the Archive partition is almost completely unused after I moved
|
||||
everything over to [the NAS](/blog/my-homelab-nas-2021-11-29), save a few Steam
|
||||
games that I could just redownload anyways. My Data drive is used mostly for
|
||||
Beat Saber custom songs, Unity project backups and other things I would really
|
||||
rather not wipe out, so I decided to use the Archive drive as my sacrificial
|
||||
lamb for Arch.
|
||||
|
||||
[You mentioned that you put Steam games on the Data drive, given that it's btrfs
|
||||
and this whole article is about things not working on NixOS, how did you even
|
||||
use it?](conversation://Mara/hmm)
|
||||
|
||||
[I use <a href="https://github.com/maharmstone/btrfs">winbtrfs</a> to mount
|
||||
btrfs volumes on windows. I'm using btrfs here because at the time I did the
|
||||
partitioning of my drives btrfs was the most Linux and Windows-compatible
|
||||
filesystem that I could use to just store data on both Windows and Linux and
|
||||
have each side access it from the other. I also needed btrfs so that I could put
|
||||
Steam games on it and have Windows and Linux both be able to use them. There's a
|
||||
lot of subtle bugs involved in using NTFS-3g on NixOS with Steam games in
|
||||
particular, so using a native kernel supported filesystem was vital. Otherwise I
|
||||
would have used something better like ZFS.](conversation://Cadey/enby)
|
||||
|
||||
One of the more painful parts about Arch Linux is that there's no installer. You
|
||||
have to do things by hand. This gives you a lot of power (you can easily do
|
||||
really cursed configs like it was nothing, such as [installing Arch on
|
||||
NTFS](https://github.com/nikp123/ntfs-rootfs)), but at the same time it means
|
||||
that there is a lot more time investment required to just get the computer
|
||||
working. Recently they added
|
||||
[archinstall](https://wiki.archlinux.org/title/Archinstall) as an easy way to
|
||||
just install Arch with a known set of defaults. This made it way less painful
|
||||
for me to install Arch to the Archive drive.
|
||||
|
||||
I booted into Arch, followed the instructions to run `archinstall`, went through
|
||||
the prompts, set up a root password, then finally selected the KDE profile.
|
||||
|
||||
[Get it? KDE? Cadey-e?](conversation://Cadey/enby)
|
||||
|
||||
[Hey Siri, how do you delete someone else's post?](conversation://Numa/delet)
|
||||
|
||||
After `archinstall` claimed victory, I rebooted into Arch and was greeted with a
|
||||
login screen that told me to pick a user and type in a password, but there were
|
||||
no options to pick from. This meant I needed to hack into the system to get to
|
||||
the point where I could login to the desktop.
|
||||
|
||||
[I was prepared for a fight, but this felt like the installer bit
|
||||
me. I am not sure if this was the result of me using the installer wrong or the
|
||||
installer not caching this case and making me make a user account so that I
|
||||
could log in. I'm not sure if I should file a bug about this or
|
||||
not.](conversation://Cadey/coffee)
|
||||
|
||||
Control-Alt-F1 didn't work. This made me think there was some shenanigans going
|
||||
on with the Xorg config such as disabling the CHVT bindings. So I rebooted into
|
||||
the boot menu and pressed `e` to edit the boot string. I appended `init=/bin/sh`
|
||||
to the argument string to force Arch to drop me into a root shell. It proceeded
|
||||
to drop me into a root shell and then dutifully ignored all of my attempts at
|
||||
keyboard input. It behaved like the USB module wasn't loaded, which is weird to
|
||||
me as I usually expect the USB module to be part of the kernel proper. I
|
||||
rebooted back into Arch's login screen to try and rethink my strategies.
|
||||
|
||||
After debating getting the PS/2 crash cart keyboard out, my husband tried
|
||||
pressing various Control-Alt-F${N} keys and eventually got one that gave us a
|
||||
login prompt. I felt like a dunce.
|
||||
|
||||
<center>
|
||||
|
||||
![](https://cdn.christine.website/file/christine-static/stickers/cadey/percussive-maintenance.png)
|
||||
|
||||
</center>
|
||||
|
||||
I managed to log in and create a user account, then set a password and used that
|
||||
account to hack into the matrix. Once I installed Steam (after enabling
|
||||
`multilib` and 12 parallel download threads), I launched it to see that it did
|
||||
not detect the VR headset. I suspect that there was probably some group or
|
||||
combination of groups that I missed and I really wanted to have a more curated
|
||||
experience. Steam not detecting the Index really killed Arch for this testing
|
||||
phase and left me frustrated.
|
||||
|
||||
## Violence
|
||||
|
||||
Suddenly a glint of philosophical brilliance struck me and I remembered this
|
||||
wisdom:
|
||||
|
||||
<center>
|
||||
|
||||
![If it sucks... hit da bricks!](/static/blog/vr-hellscape/hit_da_bricks.jpg)
|
||||
|
||||
</center>
|
||||
|
||||
I had a Manjaro USB laying around from when I was trying to sucker my husband
|
||||
into trying to use it, so I threw that into my tower and then replaced Arch with
|
||||
Manjaro. Manjaro is great. You just install it and it works. That's everything I
|
||||
wanted out of this. I wanted to just install the thing and then the computer
|
||||
does the computerbox stuff. It was really cool that Steam came preinstalled!
|
||||
|
||||
The default Manjaro experience is _really nice_. I really like how integrated
|
||||
and snappy the system _feels_. It's really just Arch with training wheels, but
|
||||
they ship a handbook that is really nice as a reference manual. I should really
|
||||
have started with Manjaro for this part of the process instead of using Arch,
|
||||
but I blame that on [the twitter
|
||||
poll](https://twitter.com/theprincessxena/status/1466162147734573070?s=20). If
|
||||
you want a decent first experience with desktop Linux, try Manjaro out. It's
|
||||
really a lot better than you think it is. Things have gotten so much better than
|
||||
they were in the Vista era when I started using Linux on the desktop.
|
||||
|
||||
[Let's be honest, most of your work is done in browsers or electron apps
|
||||
anyways. You'll be fine!](conversation://Mara/happy)
|
||||
|
||||
Steam was preinstalled, but sometimes it complained about needing some system
|
||||
libraries to function. This felt weird to me, because Valve started shipping the
|
||||
Steam Linux Runtime which essentially includes all of those libraries, but it
|
||||
turns out that was actually really a problem. I didn't try too hard to solve it
|
||||
though because it was working enough to install and run SteamVR.
|
||||
|
||||
I set up SteamVR and it rendered stuff to the headset. This was promising! The
|
||||
SteamVR overlay still didn't work though, but at this point I was almost
|
||||
expecting it. The weird part though was the fact that the SteamVR configuration
|
||||
tool was missing almost all of its UI elements. That pointed me at a few ideas
|
||||
and I ran SteamVR in another terminal window again with no conclusive results.
|
||||
|
||||
I did a round of microphone testing, and it looks like the audio from the
|
||||
microphone wasn't being picked up. This was odd, it worked fine in NixOS.
|
||||
|
||||
At least I didn't need to be afraid of the `setcap` hack that SteamVR tries to
|
||||
apply on start. That seems to work reliably without causing issues.
|
||||
|
||||
## Fraud
|
||||
|
||||
I'm not sure how I came across [this Reddit post on
|
||||
`/r/ValveIndex`](https://www.reddit.com/r/ValveIndex/comments/lmo1ku/a_comprehensive_guide_to_getting_your_valve_index/),
|
||||
and I am so glad I did. Most of the problems with Steam itself were due to
|
||||
needing to run this command:
|
||||
|
||||
```
|
||||
sudo pacman -Sy steam-native linux-steam-integration
|
||||
```
|
||||
|
||||
This will install all of the aforementioned native libraries that Steam was
|
||||
complaining about. Also make sure you are using Xorg for this. At the time of
|
||||
writing this post, Manjaro KDE defaults to using Xorg. In the future you may
|
||||
need to set the default to Xorg. However in the future Valve is probably going
|
||||
to fix the SteamVR on Linux jank (especially if the rumors about project Deckard
|
||||
are true), so it may work fine with Wayland then.
|
||||
|
||||
[Manjaro should really make those packages part of the default install set, if
|
||||
only to make it more seamless.](conversation://Mara/hacker)
|
||||
|
||||
To fix the microphone (and some minor audio issues with the speakers), you need
|
||||
to change the default audio sample rate of PulseAudio. PulseAudio defaults to a
|
||||
44,100hz for speakers and microphones. This is normally fine. Most audio is
|
||||
usually at or below there, but the Valve Index expects 48,000hz. The way you get
|
||||
that fixed is to customize the PulseAudio config files for the system and for
|
||||
your user account like so:
|
||||
|
||||
1. Open `/etc/pulse/daemon.conf` as root using your favorite text editor
|
||||
2. Go to the end of the file
|
||||
[Press `G` in vim to jump all the way to the end of the current buffer.
|
||||
Conversely `gg` will take you back to the top.](conversation://Mara/hacker)
|
||||
3. Add the line `default-sample-rate = 48000`
|
||||
4. Open `~/.config/pulse/daemon.conf` as your unprivileged user account
|
||||
5. Go to the end of the file
|
||||
6. Add the same line
|
||||
7. Either reboot your PC or run `pulseaudio -k` to restart the sound server and
|
||||
pick up those changes
|
||||
8. Open the volume control and shout towards your headset, you should see the
|
||||
audio meter moving
|
||||
|
||||
The SteamVR overlay not working is actually because of a missing library in the
|
||||
SteamVR library bundle. It is a really dumb one too. The library `fontconfig` is
|
||||
missing from the installset. They might have assumed that it would be part of
|
||||
the system or something, but its absence makes `vrwebhelper` crash on launch.
|
||||
Apparently the SteamVR overlay is done by `vrwebhelper`, so it crashing is
|
||||
doubleplus ungood.
|
||||
|
||||
[These instructions are cribbed from <a href="https://www.gamingonlinux.com/2021/11/steamvr-overlay-not-working-on-arch-or-manjaro-linux-heres-a-fix/">this article</a>.](conversation://Mara/hacker)
|
||||
|
||||
You can fix it by first identifying where `vrwebhelper` is installed. At the time of
|
||||
writing, Steam defaults to putting it in this folder:
|
||||
|
||||
```
|
||||
~/.local/share/Steam/steamapps/common/SteamVR/bin/vrwebhelper/linux64/
|
||||
```
|
||||
|
||||
Open `vrwebhelper.sh` and find the line that looks like this:
|
||||
|
||||
```shell
|
||||
export LD_LIBRARY_PATH="${STEAM_RUNTIME_HEAVY}${LD_LIBRARY_PATH+:$LD_LIBRARY_PATH}"
|
||||
```
|
||||
|
||||
and replace it with this:
|
||||
|
||||
```shell
|
||||
export LD_LIBRARY_PATH="${DIR}:${STEAM_RUNTIME_HEAVY}${LD_LIBRARY_PATH+:$LD_LIBRARY_PATH}"
|
||||
```
|
||||
|
||||
Then download Steam's vendored version of
|
||||
[freetype2](https://github.com/ValveSoftware/SteamVR-for-Linux/files/7425064/freetype2-2.10.4-libs.tar.gz)
|
||||
(I made a copy
|
||||
[here](https://xena.greedo.xeserv.us/pkg/freetype2-2.10.4-libs.tar.gz) in case
|
||||
the bitrot fairy strikes again) and put all the files in that archive into your
|
||||
`vrwebhelper` folder. Restart Steam (and SteamVR) just to be sure, then your VR
|
||||
overlay should work.
|
||||
|
||||
[Hopefully these hacks should not be needed in the
|
||||
future.](conversation://Cadey/coffee)
|
||||
|
||||
At this point, everything worked. I could play games like nothing was out of
|
||||
place, and the only difference I felt was that it was slightly more bouncy on
|
||||
Manjaro than it was on Windows. I don't totally know how to quantify this
|
||||
feeling or get a good recording of it, but it _felt_ different enough that I
|
||||
feel I need to mention it.
|
||||
|
||||
You can still see through your controllers, which I assume is a SteamVR on Linux
|
||||
problem at this point. It's the most bizarre thing, it's like the rendering
|
||||
priority for the controller models is backwards.
|
||||
|
||||
I was able to play a few rounds of Beat Saber for testing, and the only downside
|
||||
I noticed was that sometimes a few frames had a shower of green blotches. There
|
||||
was no pattern.
|
||||
|
||||
## Treachery
|
||||
|
||||
[There were a couple things earlier in this post that were kinda sus. For one
|
||||
you disabled the Index output in sway with that config change and then it
|
||||
stopped working in Xorg. Was the first line about the headset in `xrandr --prop`
|
||||
normal? Do you see it in Manjaro?](conversation://Mara/hmm)
|
||||
|
||||
```nix
|
||||
cadey.sway.output."DP-2".disable = "";
|
||||
```
|
||||
|
||||
```
|
||||
DisplayPort-1 disconnected
|
||||
```
|
||||
|
||||
[Why are things 0-based in Xorg but 1-based in Wayland?](conversation://Cadey/wat)
|
||||
|
||||
So I made [this
|
||||
commit](https://github.com/Xe/nixos-configs/commit/4683dc68173eb79348de150713f3a1b1910d9d4d)
|
||||
to my NixOS configs, rebuilt my config to re-enable Wayland, booted back into
|
||||
sway and then found that it was still broken.
|
||||
|
||||
What am I doing wrong here? I'm willing to try any ideas you all have. This is a
|
||||
cry for help. I literally have no idea what I am doing wrong and this is
|
||||
_really_ starting to bother me. Did I taint a state file used by display
|
||||
handling? I thought this stuff was mostly if not entirely stateless to avoid
|
||||
these kinds of problems. Do I need to reinstall NixOS from scratch? Should today
|
||||
be the day that I set up ZFS on my tower? Is this just some kind of weird cruft
|
||||
that has accumulated over a few years even though that should be _categorically
|
||||
impossible_? Is the flatpak broken with SteamVR? Is the NixOS Steam package
|
||||
broken? What is even going on?
|
||||
|
||||
Hopefully I can follow this up with a part 2 containing the really really dumb
|
||||
solution. I've tried everything I can think of and have managed to really
|
||||
confuse a GPU driver developer friend of mine in the process. I just want this
|
||||
to work. I can get my VR fix on Windows in the meantime, but I would really love
|
||||
to be able to do all this from my NixOS install.
|
||||
|
||||
Please [contact me](/contact) if you have any ideas.
|
10
config.dhall
10
config.dhall
|
@ -21,7 +21,7 @@ let Author =
|
|||
, link = None Text
|
||||
, twitter = None Text
|
||||
, default = False
|
||||
, inSystem = True
|
||||
, inSystem = False
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -62,7 +62,13 @@ let Config =
|
|||
, twitter = Some "BeJustFine"
|
||||
, inSystem = True
|
||||
}
|
||||
, Author::{ name = "Ashe", handle = "ectamorphic", inSystem = True }
|
||||
, Author::{
|
||||
, name = "Ashe"
|
||||
, handle = "ectamorphic"
|
||||
, picUrl = Some
|
||||
"https://cdn.christine.website/file/christine-static/img/FFVV1InX0AkDX3f_cropped_smol.jpg"
|
||||
, inSystem = True
|
||||
}
|
||||
, Author::{ name = "Nicole", handle = "Twi", inSystem = True }
|
||||
, Author::{ name = "Mai", handle = "Mai", inSystem = True }
|
||||
]
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 84 KiB |
|
@ -0,0 +1,71 @@
|
|||
<svg width="232pt" height="298pt"
|
||||
viewBox="0.00 0.00 232.24 297.83" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 293.8313)">
|
||||
<title>G</title>
|
||||
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-293.8313 228.2424,-293.8313 228.2424,4 -4,4"/>
|
||||
<!-- nvme0 -->
|
||||
<g id="node1" class="node">
|
||||
<title>nvme0</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="162.6135" cy="-106.4156" rx="38.622" ry="29.3315"/>
|
||||
<text text-anchor="middle" x="162.6135" y="-110.6156" font-family="Times,serif" font-size="14.00" fill="#000000">NixOS</text>
|
||||
<text text-anchor="middle" x="162.6135" y="-93.8156" font-family="Times,serif" font-size="14.00" fill="#000000">(ext4)</text>
|
||||
</g>
|
||||
<!-- nvme1 -->
|
||||
<g id="node2" class="node">
|
||||
<title>nvme1</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="162.6135" cy="-29.4156" rx="61.758" ry="29.3315"/>
|
||||
<text text-anchor="middle" x="162.6135" y="-33.6156" font-family="Times,serif" font-size="14.00" fill="#000000">Windows 10</text>
|
||||
<text text-anchor="middle" x="162.6135" y="-16.8156" font-family="Times,serif" font-size="14.00" fill="#000000">(ntfs)</text>
|
||||
</g>
|
||||
<!-- sda -->
|
||||
<g id="node3" class="node">
|
||||
<title>sda</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="162.6135" cy="-260.4156" rx="43.3909" ry="29.3315"/>
|
||||
<text text-anchor="middle" x="162.6135" y="-264.6156" font-family="Times,serif" font-size="14.00" fill="#000000">Archive</text>
|
||||
<text text-anchor="middle" x="162.6135" y="-247.8156" font-family="Times,serif" font-size="14.00" fill="#000000">(btrfs)</text>
|
||||
</g>
|
||||
<!-- sdb -->
|
||||
<g id="node4" class="node">
|
||||
<title>sdb</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="162.6135" cy="-183.4156" rx="36.0933" ry="29.3315"/>
|
||||
<text text-anchor="middle" x="162.6135" y="-187.6156" font-family="Times,serif" font-size="14.00" fill="#000000">Data</text>
|
||||
<text text-anchor="middle" x="162.6135" y="-170.8156" font-family="Times,serif" font-size="14.00" fill="#000000">(btrfs)</text>
|
||||
</g>
|
||||
<!-- nvme -->
|
||||
<g id="node5" class="node">
|
||||
<title>nvme</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="32.4923" cy="-68.4156" rx="32.4846" ry="18"/>
|
||||
<text text-anchor="middle" x="32.4923" y="-64.2156" font-family="Times,serif" font-size="14.00" fill="#000000">nvme</text>
|
||||
</g>
|
||||
<!-- nvme->nvme0 -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>nvme->nvme0</title>
|
||||
<path fill="none" stroke="#000000" d="M61.3704,-76.8491C77.6178,-81.5939 98.2793,-87.6278 116.6947,-93.0057"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="115.7873,-96.3869 126.3675,-95.8305 117.7496,-89.6675 115.7873,-96.3869"/>
|
||||
</g>
|
||||
<!-- nvme->nvme1 -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>nvme->nvme1</title>
|
||||
<path fill="none" stroke="#000000" d="M61.3704,-59.7603C72.9382,-56.2932 86.7437,-52.1554 100.3829,-48.0674"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="101.6766,-51.3336 110.2507,-45.1099 99.6668,-44.6283 101.6766,-51.3336"/>
|
||||
</g>
|
||||
<!-- sata -->
|
||||
<g id="node6" class="node">
|
||||
<title>sata</title>
|
||||
<ellipse fill="none" stroke="#000000" cx="32.4923" cy="-221.4156" rx="27" ry="18"/>
|
||||
<text text-anchor="middle" x="32.4923" y="-217.2156" font-family="Times,serif" font-size="14.00" fill="#000000">sata</text>
|
||||
</g>
|
||||
<!-- sata->sda -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>sata->sda</title>
|
||||
<path fill="none" stroke="#000000" d="M57.2734,-228.843C73.0341,-233.5669 93.9942,-239.849 113.0656,-245.5651"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="112.2452,-248.973 122.8291,-248.4914 114.255,-242.2677 112.2452,-248.973"/>
|
||||
</g>
|
||||
<!-- sata->sdb -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>sata->sdb</title>
|
||||
<path fill="none" stroke="#000000" d="M57.2734,-214.1787C74.6362,-209.1081 98.309,-202.1948 118.8154,-196.2062"/>
|
||||
<polygon fill="#000000" stroke="#000000" points="119.9685,-199.5158 128.5864,-193.3528 118.0061,-192.7964 119.9685,-199.5158"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.9 KiB |
Binary file not shown.
After Width: | Height: | Size: 39 KiB |
Binary file not shown.
After Width: | Height: | Size: 96 KiB |
Loading…
Reference in New Issue