xrizer is a reimplementation of OpenVR on top of OpenXR. This enables you to run OpenVR games through any OpenXR runtime without running SteamVR.
Note that xrizer is currently immature. Many things are likely broken, so please open bugs! For a more mature solution, check out OpenComposite, which some of the code in this repo is based on.
You tell me! The aim is for all standard (non overlay/utility/background) OpenVR apps to function as they would on SteamVR. Obviously this is not 100% the case, so open issues as you run into games that don't work properly and they will be addressed in time.
OpenComposite has several years of existence over xrizer, so rewriting it is no small task. However, OpenComposite also lacks sufficient testing infrastructure, making it easy to inadvertently introduce regressions, and the way it's architected makes it difficult to write simple tests. OpenComposite was also not originally designed to utilize OpenXR, and there's still some legacy stuff from that period remaining in the codebase, which can make it more convoluted to understand. Dealing with these issues for a while led me to conclude that it would be more productive to rewrite it.
I like Rust. I don't like CMake.
# dev build
cargo xbuild
# release build
cargo xbuild --release
In order to use xrizer, you must change where OpenVR games search for the runtime. There are two ways to accomplish this:
- Add the path to xrizer to
$XDG_CONFIG_HOME/openvr/openvrpaths.vrpath
. - Set the
VR_OVERRIDE
environment variable when launching a game:VR_OVERRIDE=/path/to/xrizer <command>
(steam launch options:VR_OVERRIDE=/path/to/xrizer %command%
)- Note that if you do this method, you must have an existing valid
openvrpaths.vrpath
file, though xrizer doesn't need to be in it.
- Note that if you do this method, you must have an existing valid
After building, the output directory can be used for either of these paths. If you built the dev build, this will be <path to xrizer repo>/target/debug
, and for the release build this is <path to xrizer repo>/target/release
.
This file is a JSON file read by OpenVR games to determine where the runtime is located. If you have SteamVR installed and have run it before, you can simply add the path to xrizer to the "runtime" section.
If you haven't, here is a sample file that can be placed in $XDG_CONFIG_HOME/openvr/openvrpaths.vrpath
:
{
"version": 1,
"runtime": [
"<path to xrizer>/target/debug"
]
}
When running games through the Steam Linux Runtime - which is all of them when using Proton 6 or newer - filesystem paths will not work the same way since it's a container. Some things to keep in mind are:
- Any path in your home directory will always be available
- Paths under
/usr
will be available at/run/host/usr
- Some paths will be completely unavailable.
You can make paths available within the container using the PRESSURE_VESSEL_FILESYSTEM_RW
env var. An example of what you might put in your game's steam launch option if you want to use xrizer with Monado installed systemwide is:
XR_RUNTIME_JSON=/run/host/usr/share/openxr/1/openxr_monado.json VR_OVERRIDE=<path to xrizer>/target/debug PRESSURE_VESSEL_FILESYSTEM_RW=$XDG_RUNTIME_DIR/monado_comp_ipc
For more info on the container, see Valve's docs on Pressure Vessel.
All contributions welcome.
- If you're opening a bug, please submit a log. The log is located at
$XDG_STATE_HOME/xrizer/xrizer.txt
, or$HOME/.local/state/xrizer/xrizer.txt
if$XDG_STATE_HOME
is not set. - If submitting pull requests, please consider writing a test if possible/helpful - OpenVR is a large API surface and games are fickle, so ensuring things are well tested prevents future unintentional breakage.
RUST_LOG - This is used for adjusting the logging of xrizer. See the env_logger documentation for understanding how this works. Here are some useful nonstandard logging targets:
openvr_calls
- logs the name of each OpenVR function as they are calledtracked_property
- logs the name and device index of each requested tracked device property.
XRIZER_CUSTOM_BINDINGS_DIR - This can be used to supply a directory that xrizer will search for controller bindings files. Note that the format of these bindings aren't actually documented anywhere, but it's easy enough to modify an existing file, and xrizer parses them so you can read the source too.
- OpenComposite - The original OpenVR/OpenXR implementation, much more mature than xrizer. Some of the code in this repo was rewritten based on OpenComposite.
- OpenVR
- Monado - An open source OpenXR runtime
- WiVRn - An OpenXR streaming runtime for standalone headsets, based on Monado.