Repository navigation
Releases: elliotttate/OpenXR-Layer-OBSMirror
Release list
OpenXR OBS Mirror v0.3.0-beta.14
OpenXR OBS Mirror v0.3.0-beta.14
Beta 14 brings the automatic OpenXR/OpenVR behavior into Control Center itself.
The Dashboard and large preview window can now display a running SteamVR mirror
directly instead of requiring OBS for that view.
Highlights
- Live OpenVR preview in Control Center. The Dashboard and resizable preview
window attach directly to SteamVR's compositor mirror when no OpenXR shared
surface is active. - Automatic API selection. OpenXR remains preferred whenever its layer is
publishing. Otherwise, an already-running SteamVR session is used without a
mode switch or manual source change. - Correct preview brightness. SteamVR's sRGB mirror is decoded for sampling
and encoded back to sRGB before its BGRA pixels are handed to WinUI, avoiding
the dark preview produced by a linear intermediate target. - Runtime-safe startup. Control Center checks for an existing SteamVR server
before loading OpenVR, so opening the app cannot launch SteamVR or replace the
selected OpenXR runtime. - Safer Direct3D lifetime management. Mirror views, textures, compositor
handles, devices, and adapter retries now have explicit ownership and cleanup.
Install
Close OBS Studio, run OpenXR-OBSMirror-0.3.0-beta.14-Setup.exe, and reopen
OBS. Existing automatic mirror sources continue to work; no scene change is
required.
OpenXR OBS Mirror v0.3.0 Beta 13
OpenXR OBS Mirror v0.3.0 Beta 13
Beta 13 makes the existing OBS capture source work automatically with both
OpenXR and OpenVR/SteamVR applications. Existing OBS scenes do not need to be
rebuilt.
Automatic runtime capture
- VR Mirror Capture (Auto: OpenXR / SteamVR) prefers the OpenXR API-layer
surface and transparently falls back to SteamVR's native compositor mirror. - The source keeps the original
openxrmirror_captureID, so scenes created
with OpenXR Mirror Capture upgrade in place and no longer remain blank
when an application uses OpenVR. - The explicit OpenVR / SteamVR Mirror Capture source remains available for
separate SteamVR-specific eye and crop settings. - The fallback only attaches when SteamVR is already running. It cannot launch
SteamVR, select a simulator, or change the active OpenXR runtime.
Clearer Control Center status
- A detected OpenVR application is now reported as capturable through the
automatic OBS source instead of incorrectly saying it is unsupported. - The OpenXR-only in-app preview clearly directs OpenVR capture to OBS rather
than waiting indefinitely for an OpenXR frame. - A simulator configured as the system OpenXR runtime is now shown as a warning
instead of the incorrect green Headset runtime selected state. - Use headset runtime no longer claims success when the system runtime itself
is a simulator; it explains that the headset or SteamVR software must first be
selected as the active OpenXR runtime.
Validation
The automatic source was exercised against a live OpenVR application through
the saved OpenXR-compatible source ID. The capture produced changing, non-black
frames while the application loaded openvr_api.dll and vrclient_x64.dll.
The explicit OpenVR source was rechecked independently, and both native and
Control Center release builds complete successfully.
Install or update
Close OBS Studio, run OpenXR-OBSMirror-0.3.0-beta.13-Setup.exe, and reopen
OBS. Keep the existing source in your scene; it will switch capture backends
automatically.
OpenXR OBS Mirror v0.3.0 Beta 12
OpenXR OBS Mirror v0.3.0 Beta 12
Beta 12 adds a native OpenVR/SteamVR capture backend to the existing OBS plugin.
The OpenXR source and all of its recording-only controls remain unchanged.
New: OpenVR / SteamVR Mirror Capture
- Add OpenVR / SteamVR Mirror Capture from OBS's Sources menu to capture
SteamVR's compositor mirror directly. - Select the left eye, right eye, or both eyes side by side.
- Crop any edge by percentage or automatically fill the OBS recording canvas.
- Reconnect to SteamVR from source properties without restarting OBS.
- Multiple source instances share one reference-counted OpenVR background
connection and release every mirror texture before shutting the runtime down.
The implementation uses Valve's official OpenVR 2.15.6 SDK and dynamically
loads the packaged openvr_api.dll only when an OpenVR source is active. A
missing OpenVR runtime file therefore cannot prevent OpenXR Mirror Capture
from loading.
Installation and diagnostics
- The installer, portable package, setup script, and Control Center plugin
updater now install and validate the matchingopenvr_api.dllbeside
win-openxr.dll. - OBS logs the OpenVR SDK and SteamVR runtime versions on connection, texture
dimensions and selected eye mode on source initialization, and actionable
initialization failures. - OpenXR overscan, camera smoothing, and quad-layer controls remain specific to
the OpenXR source because SteamVR's mirror is already composited.
Install or update
Close OBS Studio before updating so both plugin files can be replaced, then run
OpenXR-OBSMirror-0.3.0-beta.12-Setup.exe. Restart OBS and add the capture
source matching the application's runtime API.
OpenXR OBS Mirror v0.3.0 Beta 9
OpenXR OBS Mirror v0.3.0 Beta 9
Beta 9 fixes an installer bug that stopped the capture layer from loading at
all. Anyone whose capture source has never shown anything should install this
release.
Fixed
- The installed layer was ignored by Windows after a fresh install. The
installer wrote the layer manifest as UTF-8 with a byte order mark, and the
OpenXR loader rejects a manifest that begins with one. It then skips the layer
silently: no error, no log entry, and a VR application that runs perfectly
with nothing being captured. The manifest is now written as plain UTF-8.
Installations that had been repaired by Control Center's own install path were
unaffected, which is why the failure looked intermittent. - The mirror no longer shrinks the image inside an empty border. When an
application renders a narrower field of view than the runtime reported, the
mirror scaled the picture down and padded the rest of the frame. It now fills
the frame, and still crops to the headset view when an application renders
wider than the headset shows. - Alternate-eye mods no longer make the recording shudder. Mods that render
one eye per frame, such as Luke Ross's R.E.A.L. VR, submit a viewpoint that
swings between the eyes every frame. The layer now recognises that pattern and
publishes one eye consistently: half the update rate, a stable image. Nothing
changes for applications that render both eyes every frame.
Improved
- Control Center explains a VR application it cannot capture. A game driving
the headset through the Oculus or OpenVR path never loads an OpenXR API layer,
so the capture cannot attach to it. Instead of leaving "Waiting for an OpenXR
app" on screen, Control Center now names the application and the path it took,
and says to switch the mod or game to the OpenXR runtime. - The layer log reports the mirror scale whenever the mirrored field of view
differs from the one the application was given.
Install or update
Beta 5 and newer offer this update inside the app: open Control Center, choose
Yes, update, and it downloads, installs, and reopens itself.
To install by hand:
- Close OBS Studio and any running OpenXR application.
- Download and run
OpenXR-OBSMirror-0.3.0-beta.9-Setup.exe.
The portable ZIP contains the same self-contained app and payload. Extract the
complete archive before launching it.
OpenXR OBS Mirror v0.3.0 Beta 8
OpenXR OBS Mirror v0.3.0 Beta 8
Beta 8 fixes a capture that stays completely black for applications that use
mipped swapchains, which includes Luke Ross's R.E.A.L. VR mods.
Fixed
- Black capture with mipped swapchains. The mirror copied each swapchain
image with a call that does nothing unless the source and destination have
identical descriptions, including the number of mip levels. Applications that
request a mipped swapchain - the R.E.A.L. VR mod asks for four levels -
therefore published a texture that had never been written, so the capture was
pure black even though
the connection, frame counter and heartbeat all reported healthy. The mirror
now copies the base mip level explicitly, for both Direct3D 11 and 12. - Automatic component updates no longer go backwards. An older Control
Center treated any installed layer that differed from its own bundled copy as
out of date and reinstalled the older build over it, including over a newer
release. The installed component version is now recorded and only ever moved
forward.
Improved
- The layer log records the shape of the first frames. For the first frames
of a session the log now lists each submitted view: its swapchain, image
rectangle, render pose, and whether the submitted field of view matches the
one the application was given. This is what separates an alternate-eye
renderer from an application that ignores the located view.
Install or update
Beta 5 and newer offer this update inside the app: open Control Center, choose
Yes, update, and it downloads, installs, and reopens itself.
To install by hand:
- Close OBS Studio and any running OpenXR application.
- Download and run
OpenXR-OBSMirror-0.3.0-beta.8-Setup.exe.
The portable ZIP contains the same self-contained app and payload. Extract the
complete archive before launching it.
v0.3.0-beta.11
OpenXR OBS Mirror v0.3.0 Beta 11
Beta 11 fixes a crash on startup that could take the VR application down
before it ever reached the headset. Install this if a game crashes at launch
while the mirror layer is enabled.
Fixed
-
The layer could crash the VR application during startup. When another API
layer sits above this one in the chain, it may resolve OpenXR functions
through ourxrGetInstanceProcAddr. The OpenXR loader only hands a layer its
downstream dispatch once its ownxrCreateApiLayerInstancehas returned, so a
layer above that resolves functions before creating the instance below it
reaches us while we have nothing to forward to. We called through the empty
pointer, and the application died with an access violation at address zero —
no error, no log entry beyond the layer's own startup banner.Being asked before the chain exists is now answered honestly: the function is
reported as unsupported, and the layer log names it so the layer above can be
identified. Nothing changes for a correctly ordered chain. -
A failed function lookup no longer reads an unwritten pointer. When the
runtime reported a function as unavailable, the dispatcher still read the
output pointer the call had left untouched and wrapped whatever it found.
Failed lookups are now passed straight back.
Both fixes are in the dispatcher generator, so regenerating the dispatch table
keeps them.
If a game still crashes at launch
The crash above is triggered by a layer above this one calling out of order,
and this release stops us from crashing when that happens — but the layer above
still gets an answer it may not expect. Check the other OpenXR layers you have
enabled and make sure they are up to date. Layers register themselves under
HKEY_CURRENT_USER\Software\Khronos\OpenXR\1\ApiLayers\Implicit and
HKEY_LOCAL_MACHINE\...; a value of 0 means enabled.
Install or update
Beta 5 and newer offer this update inside the app: open Control Center, choose
Yes, update, and it downloads, installs, and reopens itself.
To install by hand:
- Close OBS Studio and any running OpenXR application.
- Download and run
OpenXR-OBSMirror-0.3.0-beta.11-Setup.exe.
The portable ZIP contains the same self-contained app and payload. Extract the
complete archive before launching it.
v0.3.0-beta.10
OpenXR OBS Mirror v0.3.0 Beta 10
Beta 10 is about the shape of the recording: why the capture arrives almost
square, why black bars appear beside it on a widescreen canvas, and what to do
about either.
Fixed
- The OBS source no longer changes resolution mid-session. A frame carrying
only quad layers sized the mirror from the runtime's recommended per-eye
resolution, but applications routinely render at their own scale instead. The
mirror was rebuilt at the wrong size on every such frame, and OBS dropped the
source and reattached at a different resolution each time — one log showed
four reconnects in twenty-five seconds. The mirror now keeps the size the
projection layer actually uses.
Added
- Fill the recording canvas, on the OBS source. Headsets render each eye at
close to a 1:1 aspect, so a mirror dropped onto a 16:9 canvas sits between
black bars. This crops the mirror to the canvas's shape, centred, so the
source fills the frame with no manual crop values, and it re-crops itself if
the canvas resolution changes. It is on by default, and it is a no-op for
a source that already matches the canvas — including one whose manual crop
sliders already produced that shape. Untick it to record the full per-eye
image with bars. - Recording shape buttons on Control Center's overscan page. Expansion
percentages scale an almost-square render, so the recording's shape follows
the ratio between them, not either one alone: 130% × 115% is still 1.13:1.
Headset native, 16:9 and Widest possible set both sliders from a target
shape, growing only the axis that needs it. - A recording frame readout that reports the pixel size and aspect the
current settings produce, from the per-eye size the layer learned during the
last VR session, instead of two abstract multipliers.
Improved
- Overscan and camera smoothing save as you change them. The Apply buttons
are gone; moving a slider or a toggle stores the value once the control comes
to rest. Overscan still needs a VR application restart to take effect, and
Control Center still says so. - The layer reports the runtime's recommended per-eye size and its aspect,
so a log makes clear whether a square recording came from the headset or from
a setting.
Choosing between the two ways to lose the bars
Filling the canvas is free and immediate, but reaching 16:9 from a square eye
costs roughly 22% off the top and the bottom. Setting the horizontal expansion
to 178% instead makes the mirror natively 16:9, so nothing is cropped and the
recording keeps the whole headset view — for 78% more rendered pixels and a VR
application restart. Above 178% horizontal the two stop competing: filling the
canvas has nothing left to trim from the headset view.
Vertical expansion cannot make a recording wider, so when the goal is a
widescreen frame it only spends GPU time on pixels the frame will not show.
Install or update
Beta 5 and newer offer this update inside the app: open Control Center, choose
Yes, update, and it downloads, installs, and reopens itself.
To install by hand:
- Close OBS Studio and any running OpenXR application.
- Download and run
OpenXR-OBSMirror-0.3.0-beta.10-Setup.exe.
The portable ZIP contains the same self-contained app and payload. Extract the
complete archive before launching it.
OpenXR OBS Mirror v0.3.0 Beta 7
OpenXR OBS Mirror v0.3.0 Beta 7
Beta 7 fixes two causes of a capture source that appears in OBS but shows
nothing.
Fixed
- An old copy of the source inside the OBS folder is now detected. When
win-openxr.dllis also present in the OBS installation's own
obs-plugins\64bitfolder, usually left behind by installing the plugin by
hand, OBS loads that copy first and every capture source runs the old build.
The source then stays blank even though Control Center reports the installed
plugin as current. The dashboard now reports this directly and can remove the
old copy. - Applications that submit a single view are now mirrored. Capture required
a projection layer containing two views, so VR mods that submit one view,
including alternate-eye renderers, produced no image at all. A single-view
layer is now mirrored as mono. The eye selection has no effect for those
applications, because only one view exists.
Improved
- The layer log names why a frame was not mirrored. The previous "no stereo
projection layer" message covered three different situations. The log now
distinguishes an application that submitted no composition layers, one that
submitted layers but no projection layer, and a projection layer with a
stated number of views.
Install or update
Beta 5 and newer offer this update inside the app: open Control Center, choose
Yes, update, and it downloads, installs, and reopens itself.
To install by hand:
- Close OBS Studio and any running OpenXR application.
- Download and run
OpenXR-OBSMirror-0.3.0-beta.7-Setup.exe.
The portable ZIP contains the same self-contained app and payload. Extract the
complete archive before launching it.
Still seeing a blank capture
Open Control Center first and check the dashboard for the old-copy warning
above. If there is no warning and the source is still blank, reproduce it, then
use Diagnostics > Upload & share logs and include the copied link. The layer
log now states which part of the pipeline stopped.
OpenXR OBS Mirror v0.3.0 Beta 6
OpenXR OBS Mirror v0.3.0 Beta 6
Beta 6 fixes finding OBS when it is installed somewhere unusual, and finishes
an OBS source update on its own once OBS closes.
Fixed
- OBS is found in far more places. Open OBS now locates OBS through a
runningobs64process, the OBS installation and uninstall registry entries,
the Windows App Paths entry, and the standard folder name on every fixed
drive. Custom install locations and drives other than C: now work. - A manual location can be chosen when detection fails. If OBS still cannot
be found, for example with a portable copy that registers nothing, Open
OBS now offers to browse forobs64.exe. The chosen location is saved and
used for every later launch. - A waiting OBS source update completes by itself. When an update had to
wait for OBS to close, the status stayed on Close OBS to update until
Refresh was pressed. Control Center now notices OBS closing and finishes
the update within a few seconds.
Install or update
Beta 5 and newer offer this update inside the app: open Control Center, choose
Yes, update, and it downloads, installs, and reopens itself.
To install by hand:
- Close OBS Studio and any running OpenXR application.
- Download and run
OpenXR-OBSMirror-0.3.0-beta.6-Setup.exe.
The portable ZIP contains the same self-contained app and payload. Extract the
complete archive before launching it.
Reporting a blank capture
If the OpenXR Mirror Capture source appears in OBS but stays blank, the
logs added in Beta 5 now identify the cause, including a GPU mismatch between
OBS and the VR application or an unsupported swapchain format. Reproduce the
blank source, then use Diagnostics > Upload & share logs and include the
copied link in the report.
OpenXR OBS Mirror v0.3.0 Beta 5
OpenXR OBS Mirror v0.3.0 Beta 5
Beta 5 adds automatic updating, so keeping the capture stack current no longer
requires visiting GitHub, and it widens the recording overscan range.
New
- Control Center updates itself. On launch it checks GitHub for a newer
release. If one exists, a dialog shows what changed; choosing Yes, update
downloads the installer, verifies it against the release checksum, installs it
silently, and reopens the app. Declining is remembered until the next launch. - The layer and OBS source install themselves. When Control Center finds a
newer build of the OpenXR layer or the OBS source than the one installed, it
installs it automatically instead of asking. The OBS source waits until OBS is
closed, because Windows will not let a running OBS release the plugin file. - Recording overscan now reaches 200%. Horizontal and vertical expansion can
be set anywhere from 100% to 200%. The layer still limits the request to what
the active OpenXR runtime allows for swapchain sizes, and the pixel cost shown
on the Overscan page rises steeply near the top of the range.
Improved
- The OpenXR layer log survives restarts. Sessions now append to the log and
it rotates at 5 MB instead of being erased every time any OpenXR application
starts, so the log covering a problem is still there when it is time to share
it. - Blank OBS captures explain themselves. Both the layer log and the OBS log
now record why a frame did or did not reach OBS: which swapchains are mirrored
and why the others are skipped, whether the mirror and OBS are on the same GPU,
whether the OBS source is connected, and whether the VR application is still
feeding frames. - A GPU mismatch is reported directly. When OBS renders on a different
adapter than the VR application, both logs now say so and name both adapters,
instead of leaving a silently blank source. - Diagnostics can be shared in one step. The Diagnostics page can upload the
layer log, the OBS log, and a system report, then copy a single link to the
clipboard. - The dashboard preview is smoother. The live mirror preview now runs at the
full preview rate rather than being limited by the Windows timer, and it
pauses while the window is minimized or another page is open.
Fixed
- HDR titles no longer fail silently. Applications rendering above 10 bits
per channel could not be mirrored, and nothing said so. The reason is now
logged. - OBS installed outside Program Files is found. Control Center locates OBS
through its installation registry entry, so Open OBS works with a custom
install directory. A per-userObsExecutablevalue under
HKEY_CURRENT_USER\Software\OpenXR-OBSMirroroverrides the lookup. - Repeated failures no longer flood the logs. Persistent conditions, such as
a GPU mismatch or a stalled shared texture, are now reported periodically with
a recovery message instead of on every frame.
Install or update
Existing Beta 5 or newer installations update themselves; nothing below is
needed for them.
- Close OBS Studio and any running OpenXR application.
- Download and run
OpenXR-OBSMirror-0.3.0-beta.5-Setup.exe. - Open Control Center to confirm the layer and OBS source report as current.
Because automatic updating ships in this release, Beta 4 and earlier do not
offer it; this update must be installed once by hand. Updates after this one are
offered inside the app.
The portable ZIP contains the same self-contained app and payload. Extract the
complete archive before launching it.