Skip to content

Releases: elliotttate/OpenXR-Layer-OBSMirror

OpenXR OBS Mirror v0.3.0-beta.14

Choose a tag to compare

@elliotttate elliotttate released this 10 Aug 20:13
92b4abc

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

Choose a tag to compare

@elliotttate elliotttate released this 10 Aug 19:55
f66da9d

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_capture ID, 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

Choose a tag to compare

@elliotttate elliotttate released this 10 Aug 16:58
18ad600

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 matching openvr_api.dll beside
    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

Choose a tag to compare

@elliotttate elliotttate released this 05 Aug 03:02

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:

  1. Close OBS Studio and any running OpenXR application.
  2. 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

Choose a tag to compare

@elliotttate elliotttate released this 05 Aug 00:18

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:

  1. Close OBS Studio and any running OpenXR application.
  2. 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

v0.3.0-beta.11 Pre-release
Pre-release

Choose a tag to compare

@elliotttate elliotttate released this 05 Aug 23:17

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 our xrGetInstanceProcAddr. The OpenXR loader only hands a layer its
    downstream dispatch once its own xrCreateApiLayerInstance has 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:

  1. Close OBS Studio and any running OpenXR application.
  2. 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

v0.3.0-beta.10 Pre-release
Pre-release

Choose a tag to compare

@elliotttate elliotttate released this 05 Aug 18:12

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:

  1. Close OBS Studio and any running OpenXR application.
  2. 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

Choose a tag to compare

@elliotttate elliotttate released this 04 Aug 21:00

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.dll is also present in the OBS installation's own
    obs-plugins\64bit folder, 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:

  1. Close OBS Studio and any running OpenXR application.
  2. 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

Choose a tag to compare

@elliotttate elliotttate released this 04 Aug 19:39

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
    running obs64 process, 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 for obs64.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:

  1. Close OBS Studio and any running OpenXR application.
  2. 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

Choose a tag to compare

@elliotttate elliotttate released this 04 Aug 19:12

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-user ObsExecutable value under
    HKEY_CURRENT_USER\Software\OpenXR-OBSMirror overrides 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.

  1. Close OBS Studio and any running OpenXR application.
  2. Download and run OpenXR-OBSMirror-0.3.0-beta.5-Setup.exe.
  3. 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.