Releases: DisplayXR/displayxr-runtime
DisplayXR Runtime v1.10.2
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
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
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
DisplayXR Runtime v1.9.1
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
DisplayXR Runtime v1.9.0
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-clishared query core +info/selftest --json+dpsubcommand;PreferredPluginoverride 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
guivcpkg feature so CI ships the Control Panel (#378)
DisplayXR Runtime v1.8.0
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 +
xrWorkspaceHitTestEXTremoved, cursor pos via FRAME_TICK, depth viaxrSetWorkspaceCursorDepthEXT - 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
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
overlayId—XR_EXT_spatial_workspacespec_version 20 → 21 (#366) - versions: auto-bump
versions.jsonon 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
/releaseno 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
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.dllfrom_packagestaging (prevents the two-loader VK app crash). - Installer — Clear stale 32-bit Run entry to stop double service launch at logon.
Other
- Surround-2D —
xrSetSharedTextureSurround2DEXTplumbing 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
CMakeListsVERSION from the latestvX.Y.Ztag on every Windows run; misc doc updates.
Full changelog: v1.6.0...v1.6.1
DisplayXR Runtime v1.6.0
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-shippedleia v1.0.5reports ABI v1 and will be skipped at load time withABI major mismatch — plugin_api=1, runtime expects 2 … skipping (ADR-020 rule 3); the runtime falls back tosim_displaySBS. The matchingleia v1.0.6is the next release in thedisplayxr-leia-pluginrepo and restores the weave.
Features
feat(abi): plug-in ABI major v2 —struct_sizeon DP vtables + loader reject + #342 re-scan (ADR-020). 23 files / +719/-163. (#351, 4572fcf)- 8-byte
struct_size+reserved_0header at the top of every DP vtable;XRT_DP_BASE_OFF-anchored_Static_assertblocks 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 reportedstruct_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.crejects a major mismatch in all threetry_load_onevariants (Windows registry, Android, POSIX/JSON).- All 5
sim_displayfactories setbase.struct_size. - Folded #342: new
target_plugin_refresh_active()(mutex-guarded, strictly-better-ProbeOrderfilter, leaks old DLL) + newxrt_system_compositor_info::refresh_display_processorscallback invoked at the top ofmulti_compositor_create(VK service) andsystem_create_native_compositor(D3D11 service). - #345 cleanup:
comp_d3d11_window.cppdev-manifest auto-resolution now gated onDISPLAYXR_DEV=1(end-user installs no longer get a staleXR_RUNTIME_JSONforced onto child apps). comp_vk_native_compositor.c: thedp_vtable_looks_sanedegrade-log now names ABI mismatch as a likely cause.
- 8-byte
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
- Install DisplayXR Runtime v1.6.0 (this release).
- Until
leia v1.0.6ships, the Leia weave path will be unavailable — the runtime falls back tosim_displaySBS. This is the intentional ADR-020 cliff that prevents silent vtable corruption. - When
leia v1.0.6is published indisplayxr-leia-plugin, install it. The matching bundlev0.6.0will land indisplayxr-installersoon after, pinning both pieces together.
Related ADR
docs/adr/ADR-020-plugin-abi-compatibility-policy.md—Proposed → Acceptedin this release.
Assets
DisplayXRSetup-1.6.0.1044.exe— Windows installerDisplayXR-Installer-1.6.0.pkg— macOS installerDisplayXR-TestApps-1.6.0.zip— test apps bundle (cube_handle_*,cube_hosted_*,cube_texture_*across D3D11/D3D12/GL/VK)
DisplayXR Runtime v1.5.2
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/xrCreateSessionbuild-up, swapchain + frame loop, triangle/cube renderer, OpenXR runtime broker ContentProvider, sibling.sopreload 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 installerDisplayXR-Installer-1.5.2.pkg— macOS runtime installerDisplayXR-TestApps-1.5.2.zip— Windows test-apps bundle