Skip to content

Releases: DisplayXR/displayxr-runtime

DisplayXR Runtime v1.10.2

04 Jun 05:51

Choose a tag to compare

Highlights

Extends the v1.10.1 in-process sRGB/gamma fix to the D3D11, D3D12, Vulkan, and Metal native compositors. In-process apps that use an sRGB swapchain no longer render ~2.2× too dark — the compositor now passes the app's display-referred bytes through to the display processor unchanged. D3D11/D3D12/Vulkan verified on-device via atlas capture; Metal builds on macOS CI (runtime check on a Mac pending).

Fixes

  • fix(compositors): sRGB passthrough for in-process D3D11/D3D12/VK/Metal swapchains (#408)

DisplayXR Runtime v1.10.1

04 Jun 03:07

Choose a tag to compare

Highlights

Fixes an sRGB/gamma bug where in-process OpenGL apps rendered ~2.2× too dark. The native GL compositor was applying a sample-time sRGB→linear decode with no matching re-encode before the display-processor handoff. It now skips that decode (GL_EXT_texture_sRGB_decode) so the app's swapchain bytes pass through unchanged — matching the desktop, IPC/service, and other OpenXR runtimes. Apps using an sRGB swapchain (GL_SRGB8_ALPHA8) are now correct whether they render linear with GL_FRAMEBUFFER_SRGB or write display-referred bytes directly.

Fixes

  • fix(compositor-gl): sRGB passthrough for in-process GL swapchains

Docs

  • docs(app-authoring): add app-rules guide + reconcile spec drift (#406)

Other

  • chore(versions): bump modelviewer_demo → v0.7.0, gauss_demo → v1.6.0

DisplayXR Runtime v1.10.0

04 Jun 01:39

Choose a tag to compare

Highlights

This release lands the new XR_EXT_atlas_capture extension: a runtime-owned, all-API atlas capture path (xrCaptureAtlasEXT) that works both in-process and over IPC, replacing per-app GPU readbacks. It also brings GL/VK capture-dimension parity, transparent present for the macOS vk_native compositor (#392), and registry-routed display-processor selection (#387, #69 Phase 3a).

Features

  • feat(oxr): add XR_EXT_atlas_capture / xrCaptureAtlasEXT (in-process) [#396 W6]
  • feat(capture): per-session xrCaptureAtlasEXT over IPC + capture numbering fix [#396 W6 2]
  • feat(compositor): route DP factory selection through the registry (#387, #69 Phase 3a)
  • feat(skills): add /sync-website editorial-sync skill (Phase 3) (#401)

Fixes

  • fix(compositor): window-scale GL/VK handle-app view dims for capture parity [#396 W6]
  • fix(test-apps): consistent cube lighting + mipmaps across GL/VK/D3D11/D3D12 [#396 W6]
  • fix(test-apps): mipmaps for the last two cube variants [#396 W6]
  • fix(vk_native/macos): transparent present — clear atlas + weave to alpha=0 (#392)
  • fix(vk): support >2 window-space layers (#389) + windowspace test apps
  • fix(installer/macos): register active_runtime in loader datadir too (#385)
  • fix(phase-3a): include <stddef.h> for NULL in the new headers

Docs

  • docs(macos): correct stale MoltenVK 'Vulkan compositor fails' claim
  • docs(skills): refresh /sync-website for the persona-led website IA (#402)
  • docs(dxr-release): add modelviewer to the component→config map
  • docs(roadmap): link unified atlas-capture proposal to epic #396 (W6)
  • docs(roadmap): correct Unity/Unreal migration in atlas-capture proposal
  • docs(roadmap): add unified atlas-capture API proposal
  • docs(roadmap): current multi-display state + sharpen 3a recommendation (#69)

CI / Build

  • ci(windows): assert per-display claim resolution in the headless gate (#387)
  • ci(versions): fan out org-changed dispatch to displayxr-website (#399)

Other

  • refactor(test-apps): macOS cube_handle capture → xrCaptureAtlasEXT + mip parity [#396 W6]
  • refactor(test-apps): migrate Windows cube_handle capture to xrCaptureAtlasEXT [#396 W6]
  • chore(versions): assorted demo/plugin/shell version bumps (modelviewer, gauss, leia_plugin, shell)

DisplayXR Runtime v1.9.1

01 Jun 09:32

Choose a tag to compare

Highlights

No transparent window flash during live resize of standalone Vulkan demos. The vk_native compositor now resizes its DirectComposition surface in place, so dragging the resize edge of a standalone VK app no longer briefly exposes a transparent (see-through) window while the swapchain is rebuilt. Resize-drag is now visually clean end to end.

Fixes

  • vk_native: in-place DComp resize — eliminates the transparent window during resize-drag (3c20d6f)

Docs

  • roadmap: SR-weaver three-tier vendor ask; corrected hosted / #111 notes (#69) (e8544d3)
  • roadmap: Phase 3 design decisions for multi-display (#69) (be57f2a)
  • app-classes: texture apps — 3D-zone sub-rect + 2D surround (d247a1b)
  • app-classes: clarify per-class window-handle ownership (384070d)

Other

  • chore(versions): bump gauss_demo → v1.4.4 (06596a8)
  • chore(versions): bump leia_plugin → v1.2.0 (6fa8861)

DisplayXR Runtime v1.9.0

01 Jun 05:05

Choose a tag to compare

Highlights

Per-display vendor DP routing groundwork (#69 / ADR-015): a new optional, append-only xrt_plugin_iface::probe_displays() turns the binary, system-level vendor probe() into per-monitor claims, and the runtime resolves each connected display to the winning display-processor (highest confidence; ties by ProbeOrder). Vendor-blind (ADR-019) and no ABI major bump (ADR-020). Also ships the new Control Panel + displayxr-cli query core, PreferredPlugin override, vendor-neutral EDID display enumeration, and session-free MCP diagnostics.

Features

  • probe_displays() per-display vendor DP claims + monitor→DP factory registry; displayxr-cli displays --claims (#69, ADR-015)
  • Vendor-neutral connected-display enumeration via EDID; displayxr-cli displays (#380)
  • displayxr-cli shared query core + info/selftest --json + dp subcommand; PreferredPlugin override honored before ProbeOrder (#378)
  • ImGui+SDL2 Control Panel GUI over displayxr-cli; eye-tracking-mode decode + per-monitor-v2 DPI manifest (#378)
  • Session-free MCP diagnostic tools over the CLI query core (#378)
  • Retire DisplayXRSwitcher; ship CLI + Control Panel (#378)

Docs

  • Sketch probe_displays() per-display vendor-claim iface (#69)
  • Autobump: warn against declaring a components.sh platform glob too early

CI / Build

  • Windows: enable the gui vcpkg feature so CI ships the Control Panel (#378)

DisplayXR Runtime v1.8.0

31 May 21:23

Choose a tag to compare

Highlights

This release completes the migration of all interactive and cursor policy out of the runtime and into the workspace controller. Issue #370 moves cursor-depth and hit-testing to the controller (spec_version 22): the runtime raycast and xrWorkspaceHitTestEXT are gone, the controller sends cursor position on FRAME_TICK, and depth is pushed back via xrSetWorkspaceCursorDepthEXT. Issue #376 retires the last residual runtime-side input policy — DELETE-to-close, the Ctrl+O launcher, and over-window cursor dimming all move to the controller, with spec_version 23 adding XrWorkspaceCursorDepthEXT.dimFactor. Rounding it out: the sim_display Windows resolution fix (#369), the CLI's pivot to a headless display-processor self-test, removal of Monado relic targets, and a documentation lean-up (multi-compositor relocation, ADR-014 refresh).

Features

  • feat(workspace): retire residual runtime-side input policy (#376) — DELETE-close, Ctrl+O launcher, over-window cursor dim moved to the controller; spec_version 23 adds XrWorkspaceCursorDepthEXT.dimFactor
  • feat(workspace): move cursor depth + hit-test to the controller (#370) — spec_version 22; runtime raycast + xrWorkspaceHitTestEXT removed, cursor pos via FRAME_TICK, depth via xrSetWorkspaceCursorDepthEXT
  • feat(cli): refocus displayxr-cli as a headless display-processor self-test + diagnostics tool (selftest / info)
  • feat(mcp): POSIX capability gate + wire macOS .pkg into setup-displayxr

Fixes

  • fix(sim_display): report native monitor resolution on Windows (#369)
  • fix(ipc): fill surplus xrLocateViews slots in the SR view-pose path (spinner fix)
  • chore(d3d11_service): label create-time dims as pre-DP placeholders

Docs

  • docs(workspace): reflect #376 input/cursor-policy migration + spec 23
  • docs: relocate spatial-os → architecture/multi-compositor; drop 3d-shell
  • docs: prune superseded shell roadmap snapshots + refresh ADR-014
  • docs(ADR-014): fix stale notification mechanism in Consequences
  • docs(claude.md): document displayxr-cli selftest/info + the CI headless self-test gate; versions.json auto-bump; dxr-release/installer-release skills
  • docs(full-stack-install): add 'Updating an existing dev box' + skills relink

CI / Build

  • build(install): strip bundled vulkan-1.dll from _package/bin (#376)
  • scripts: add standalone link-dxr-skills.bat for Windows
  • skills: home dxr-release + installer-release in runtime hub, symlink globally
  • release skill: add Phase 4 (verify auto-bump + installer mirror)

Other

  • chore(targets): drop Monado relic targets + monado-gui; de-Monado the CLI option
  • chore(versions): bump leia_plugin → v1.1.0

DisplayXR Runtime v1.7.0

30 May 07:07

Choose a tag to compare

Highlights

This release adds keyed multi-overlay support to XR_EXT_spatial_workspace (spec_version 20 → 21, #366). Workspace controllers can now address independent overlays by overlayId, so the taskbar, launcher, and toast surfaces composite simultaneously instead of contending for a single overlay slot. The change is fully backward compatible: overlayId 0 preserves the prior single-overlay behavior.

Features

  • workspace: keyed multi-overlay support via overlayIdXR_EXT_spatial_workspace spec_version 20 → 21 (#366)
  • versions: auto-bump versions.json on every component release
  • versions: unify schema + mirror to displayxr-installer

Fixes

  • versions: preserve column alignment across bot bumps

Docs

  • claude.md: point MCP pin reference at versions.json + CMakeLists, not a literal tag
  • claude.md: note that /release no longer commits a version bump to main

CI / Build

  • (none beyond the versions.json automation above)

Other

  • chore(versions): bump mcp_tools → v0.3.3

DisplayXR Runtime v1.6.1

29 May 20:03

Choose a tag to compare

Highlights

Fixes a service crash during rapid app launch/exit churn, and restores Ctrl keyboard shortcuts in workspace mode.

Fixes

  • #363 — Service teardown use-after-free fix: D3D11-service display-processor consumers (eye-position poll) are now guarded under render_mutex, serializing the poll with client teardown. Fixes a crash on rapid app launch/exit churn and last-client disconnect.
  • #344 — Slim the service orchestrator's low-level keyboard hook and uninstall it while the workspace controller is running, so Ctrl chords work in workspace mode.
  • #105 — Exclude vulkan-1.dll from _package staging (prevents the two-loader VK app crash).
  • Installer — Clear stale 32-bit Run entry to stop double service launch at logon.

Other

  • Surround-2DxrSetSharedTextureSurround2DEXT plumbing through state tracker + D3D11/D3D12 compositors (Phases B–E), spec v6/v7 with D3D12 fence path.
  • Workspace — Expose live viewer eye-midpoint in FRAME_TICK (spec_version 20).
  • Logging — Drop per-frame D3D11-service swapchain/eye/layer logs to debug level.
  • CI / docs — Derive CMakeLists VERSION from the latest vX.Y.Z tag on every Windows run; misc doc updates.

Full changelog: v1.6.0...v1.6.1

DisplayXR Runtime v1.6.0

28 May 03:12

Choose a tag to compare

Highlights

Coordinated plug-in ABI major v2 (ADR-020). Display-processor vtables (xrt_display_processor and the per-API _d3d11/_d3d12/_gl/_metal) now carry an 8-byte struct_size header, so new methods can be appended within a major without breaking older plug-ins. The loader rejects any plug-in built against a different ABI major instead of silently dispatching through a mismatched vtable — the structural fix for the standalone-VK weave regression that hit the field at the v1.4.1 → v1.5.2 boundary.

The service also hot-rescans the DisplayProcessors registry at per-client compositor create (#342). A vendor plug-in installed AFTER the service started is now picked up on the next app launch without a service restart.

⚠️ ABI-v1 plug-ins are rejected by v1.6.0. The currently-shipped leia v1.0.5 reports ABI v1 and will be skipped at load time with ABI major mismatch — plugin_api=1, runtime expects 2 … skipping (ADR-020 rule 3); the runtime falls back to sim_display SBS. The matching leia v1.0.6 is the next release in the displayxr-leia-plugin repo and restores the weave.

Features

  • feat(abi): plug-in ABI major v2 — struct_size on DP vtables + loader reject + #342 re-scan (ADR-020). 23 files / +719/-163. (#351, 4572fcf)
    • 8-byte struct_size + reserved_0 header at the top of every DP vtable; XRT_DP_BASE_OFF-anchored _Static_assert blocks pin every slot on both 64-bit and 32-bit/Android.
    • New XRT_DP_HAS_SLOT(xdp, field) macro bounds the field against the plug-in's reported struct_size; every optional inline wrapper gates on it in addition to the per-pointer NULL check.
    • XRT_PLUGIN_API_VERSION_CURRENT = 2; target_plugin_loader.c rejects a major mismatch in all three try_load_one variants (Windows registry, Android, POSIX/JSON).
    • All 5 sim_display factories set base.struct_size.
    • Folded #342: new target_plugin_refresh_active() (mutex-guarded, strictly-better-ProbeOrder filter, leaks old DLL) + new xrt_system_compositor_info::refresh_display_processors callback invoked at the top of multi_compositor_create (VK service) and system_create_native_compositor (D3D11 service).
    • #345 cleanup: comp_d3d11_window.cpp dev-manifest auto-resolution now gated on DISPLAYXR_DEV=1 (end-user installs no longer get a stale XR_RUNTIME_JSON forced onto child apps).
    • comp_vk_native_compositor.c: the dp_vtable_looks_sane degrade-log now names ABI mismatch as a likely cause.

CI / Build

  • guard(abi): compile-time tripwire on the plug-in DP-vtable ABI + ADR-020 (#348, 5691ecc). Preserved as the v1.5.x-line landing; v1.6.0 evolves the asserts to the struct_size-aware base-offset scheme.

Compatibility matrix

Plug-in Reports ABI v1.6.0 behavior
sim_display (in-tree, ships with the runtime) v2 ✅ Loaded, used as fallback
leia v1.0.5 (current release in displayxr-leia-plugin) v1 ❌ Rejected with "ABI major mismatch"
leia v1.0.6 (next release, will rebuild against these headers) v2 ✅ Loaded

Upgrade path

  1. Install DisplayXR Runtime v1.6.0 (this release).
  2. Until leia v1.0.6 ships, the Leia weave path will be unavailable — the runtime falls back to sim_display SBS. This is the intentional ADR-020 cliff that prevents silent vtable corruption.
  3. When leia v1.0.6 is published in displayxr-leia-plugin, install it. The matching bundle v0.6.0 will land in displayxr-installer soon after, pinning both pieces together.

Related ADR

Assets

  • DisplayXRSetup-1.6.0.1044.exe — Windows installer
  • DisplayXR-Installer-1.6.0.pkg — macOS installer
  • DisplayXR-TestApps-1.6.0.zip — test apps bundle (cube_handle_*, cube_hosted_*, cube_texture_* across D3D11/D3D12/GL/VK)

DisplayXR Runtime v1.5.2

27 May 05:01

Choose a tag to compare

Highlights

The VK native compositor now guards against a corrupt display-processor vtable — converts a crash (0xC0000005 at xrCreateSession, seen standalone with the Leia SR VK weaver) into a logged graceful degrade. Pairs with DisplayXR Leia SR plug-in v1.0.4.

Fixes

  • comp/vk: Guard against a corrupt display-processor vtable. An NVIDIA Vulkan-driver heap-reuse could corrupt the Leia VK display-processor vtable and crash standalone VK apps at xrCreateSession. The compositor now validates the vtable and degrades gracefully (logged) instead of dereferencing through garbage. (158dfb7)

Other changes since v1.5.1

  • Android bring-up groundwork: runtime APK skeleton, Khronos loader wiring, xrGetSystem/xrCreateSession build-up, swapchain + frame loop, triangle/cube renderer, OpenXR runtime broker ContentProvider, sibling .so preload for plug-in discovery, Android 12+ <queries>, and CI APK build with CNSDK leak guard (ADR-019).
  • Android docs: emulator pre-bring-up procedure, gap analysis, per-test logcat reference.

Assets

  • DisplayXRSetup-1.5.2.1030.exe — Windows runtime installer
  • DisplayXR-Installer-1.5.2.pkg — macOS runtime installer
  • DisplayXR-TestApps-1.5.2.zip — Windows test-apps bundle