Skip to content

DelusionalLogic/winevrlink

Repository files navigation

VRLink for Linux
================

An attempt to get the windows version of wireless steam vrlink to work on
linux.

So far this is a prototype and a horrible hackjob, utilizing multiple
unsupported and un-upstreamable patches in dxvk and wine. It's also
unoptimized, and weird. What it does have going for it is that it works. Using
this you can wirelessly open the SteamVR home from the official SteamVR app for
Oculus, at a glorious 2 frames per second.

As mentioned, this is a major hackjob, involving close to 100 hours of
reversing internal Steam components and quite a bit of guesswork. The
difficulty of running the thing will reflect that. If that catches your
interest though, it's all here.

Besides the hacks to existing libraries contained in `lib/`, this repository
contains 3 new components. `dllhost` holds a wrapper for Valve's driver_vrlink
designed to run inside wine where it connect to a unix domain socket. The other
half of that domain socket is `native/` which is an openvr driver that creates
the domain socket on startup and exchanges data with `dllhost` as a cross-wine
RPC. Finally, `amf/` holds a shim for AMD's AMF to emulate it by using the host
implementation and dxvk.

Getting steam to advertise support
----------------------------------

Steam is hardcoded to not advertise support for wireless vr on linux. Without
that support you cannot select the PC from the headset. The only way I've found
work around this is to set the memory directly, and even that involves some
work. You'll have to disassemble the current version of linux32/steamclient.so,
and look for the string `%s%cpublic%csteamvr_action_manifest.json`. Looking at
the references to that string should reveal 2 unique methods, we're interested
in the one that DOES NOT include the string `VRManager()` near the end. This
method, the one that doesn't reference `VRManager()`, initializes the structure
that contains the flag for wireless vr. There'll be a procedure taking a single
static integer argument on the stack (currently 0x180), this is a malloc. After
that there's the constructor for the class we care about. You'll want to place
a breakpoint directly after that call returns and poke a `1` into the final
dword of that object (currently $edi+0x178). Steam should now advertise support
for wireless vr.

The command for starting steam with a debugger attached is

    DEBUGGER="gdb" $HOME/.steam/steam/steam.sh

About

A wonderful hackjob to get vrlink working on linux

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published