New to the project? Read ORIENTATION.md first — a top-down, plain-language tour of what DisplayXR is, why it's built this way, and where every doc lives. This page below is the role-based jump table.
| App developer | OXR contributor | DXR core contributor | Vendor contributor |
|---|---|---|---|
| Building apps that target DisplayXR | Working on the OpenXR state tracker / extensions | Working on compositors, IPC, shell contracts, build | Integrating a 3D-display vendor (driver + DP) |
→ getting-started/ |
→ architecture/ |
→ architecture/ |
→ guides/vendor-plugin-onboarding.md |
→ specs/extensions/ |
→ specs/extensions/ |
→ specs/runtime/ |
→ specs/vendor/ |
→ reference/ |
→ guides/implementing-extension.md |
→ adr/, roadmap/ |
→ vendors/ (your vendor's subfolder) |
→ adr/ |
→ adr/ (003, 007, 015) |
Build apps for 3D displays using the OpenXR standard.
- Getting Started — what is DisplayXR, architecture, sim_display
- Building — build instructions for Windows, macOS, and Linux
- Android Build Guide — Lume Pad-class hardware: vendor SDK setup, Gradle, install
- Android Bring-Up Checklist — A→B→C→D step-by-step test plan for first hardware install
- App Classes — handle, texture, hosted, IPC — which one to use
- Your First Handle App — tutorial walkthrough
- Ship a Manifest — make your app discoverable on every workspace controller, OEM shell, and showcase in the ecosystem with a 30-second JSON file + optional 3D logo
- Troubleshooting — symptom → cause → fix for the field-confirmed pitfalls (app hangs at startup / VPN Winsock LSP, "Failed to initialize OpenXR", Vulkan crashes, eye-tracking/camera, wrong runtime loads); start with
displayxr-cli selftest - FAQ — conceptual questions: what DisplayXR is, supported displays/OSes/graphics APIs, do I need hardware to develop, multiview vs stereo, engines, license, relation to Monado
- XR_DXR_display_info — display properties, eye tracking, rendering modes
- XR_DXR_win32_window_binding — app-provided Win32 HWND
- XR_DXR_cocoa_window_binding — app-provided Cocoa NSView
- XR_DXR_xlib_window_binding — app-provided X11 window (desktop Linux)
- XR_DXR_spatial_workspace — workspace controller surface (shell-style apps)
- XR_DXR_display_zones — N 3D zones + 2D zones + wish mask (design sketch, ADR-027)
- XR_DXR_depth_budget — rear depth budget: how far behind the display plane a transparent app may render (ADR-040)
- XR_EXT_view_configuration_views_change — Khronos extension: adoption note for the live-
recommendedImageRect*doorbell (movesubImage.imageRect, never reallocate; kill switches; the two bespoke zone events it soft-deprecates) - Kooima Projection — N-view Kooima math and projection pipelines
- Window Segments — a window spanning screens, woven per screen by each screen's own DP (multi-screen M2)
Contribute to the DisplayXR runtime — compositors, state tracker, auxiliary code.
- Production Components — what ships, what runs, how the pieces connect (service, workspace controller, bridge, runtime DLL)
- Contributing Guide — workflow, code style, CI expectations
- Separation of Concerns — layer boundaries (authoritative)
- Project Structure — source tree organization
- Compositor Pipeline — end-to-end rendering pipeline (single-app)
- Transparency Modes — canonical vocabulary: live/baked composition × shaped/unshaped windows, costs, rules, per-app table
- Rear depth budget (explainer) — plain-language: how a transparent app decides whether it may draw behind the screen (the plug-in supplies a desktop thumbnail, the runtime measures horizontal cues under the app's content bounds and publishes a budget, the app moves its far plane; ADR-040)
- Service-Mode Multi-Compositor — server-side N-client compositor (workspace + IPC apps + bridge)
- Extension vs Legacy Apps — how the runtime handles both app types
- Service Architecture — the service as built: processes, threads, locks, the two compositor modes, client classes, failure domains, limits
- One Compositor Pipeline (D3D11 service) — #964 design note: always-on multi-comp, presenter kinds, default presenter policy, one DP per panel, legacy gate
- comp_multi One Pipeline (macOS/Linux/Android) — #967 design note: bounded waits, shared-surface port to Android, issue split
- In-Process vs Service — compositor deployment modes
- Implementing an Extension — how to add OpenXR extensions
- Stereo camera consent — what gates
XR_DXR_stereo_cameraframes (consent prompt, delegating browsers, foreground rule, kill switches) and how an app or browser declares itself
- Swapchain Model — two-swapchain architecture and canvas concept
- Multiview Tiling — atlas layout algorithm for N-view rendering
- Legacy App Support — compromise scaling for non-extension apps
- Workspace Controller Registration — how shell-style apps register with the runtime
- DisplayXR App Manifest — sidecar JSON for app discovery
Integrate your 3D display hardware into DisplayXR.
- Vendor Plug-in Onboarding — zero-to-shipping guide for a new vendor's external plug-in repo (post-#263 model)
xrt_plugin_ifacereference — per-method contract for the plug-in vtable- Plug-in discovery spec — registry / JSON manifest formats, env-var overrides
- ADR-019: Vendor Plug-in / Aux Boundary — why the runtime DLL holds zero vendor identifiers
- ADR-022: Per-Mode Capability Flags + Frozen Enumerated App Structs —
mode_flagsbits (no more rendering-mode ABI breaks) +XrDisplayRenderingModeInfoDXRfrozen at v13 (all future per-mode fields chain) - Display Processor Interface — the DP vtable you'll implement
- Eye Tracking Modes — MANAGED vs MANUAL contract
- Lens-preference ownership — after its first explicit lens call DisplayXR owns the lens, so every hardware-2D path must pair with a restore of the app's own choice; audit of every desktop-Linux caller
- OEM Android platform requirements — what an OEM/ODM must provide (or must not break) to bring up an Android 3D display: tiered REQUIRED / RECOMMENDED / NICE-TO-HAVE asks with mechanism, consequence, fallback and acceptance test
- ADR-003: Vendor Abstraction — why vendor code is isolated
- ADR-007: Compositor Never Weaves — compositor / DP boundary
- ADR-015: Multi-Display Routing — how multiple vendors coexist
- Separation of Concerns — what goes where
- Legacy: in-tree integration model — historical reference for pre-#263 vendors who forked the runtime
- Writing a Driver — driver framework basics
- ADR-034: Input-Provider Plug-ins — the second plug-in type: tracked motion controllers from an external DLL (discovery contract · iface reference)
- OpenVR titles via OpenComposite — how SteamVR-era titles reach the runtime + its motion controllers
- Vendors index — list of integrated vendors + how to add a new one
- Leia SR (in displayxr-leia-plugin) — D3D11 / D3D12 / OpenGL / Vulkan, weaver, transparency model
- sim_display — reference simulation vendor (SBS / anaglyph on a 2D window)
Index below is generated by
scripts/gen_adr_index.py(CI-checked). Add an ADR file, re-run the script. Full standalone index:adr/README.md.
- ADR-001 — Native Compositors Per Graphics API
- ADR-002 — IPC Layer Preserved for Multi-App
- ADR-003 — Vendor Abstraction via Display Processor Vtable
- ADR-004 — D3D11 Native Over Vulkan Multi-Compositor
- ADR-005 — Multiview Atlas Layout
- ADR-006 — Legacy App Compromise View Scale
- ADR-007 — Compositor Never Weaves
- ADR-008 — Display as Spatial Entity
- ADR-009 — Upstream Cherry-Pick Strategy
- ADR-010 — Shared App IOSurface Worst-Case Sized
- ADR-011 — D3D11 Swapchain Textures Must Use TYPELESS Format
- ADR-012 — Window-Relative Kooima Projection
- ADR-013 — Universal App Launch Model (Hidden HWND Proxy)
- ADR-014 — Shell Owns Rendering Mode Control
- ADR-015 — DisplayXR Owns Multi-Display Vendor Routing
- ADR-016 — Workspace Controllers Own Their Tray Surface and Lifecycle
- ADR-017 — Tiered strategy for Win32 modal dialogs under the workspace shell
- ADR-018 — Workspace Hit-Test Is Plumbing; Drag/Resize/Cursor Policy Is the Controller's
- ADR-019 — Aux Library Boundary for Vendor Plug-in DLLs
- ADR-020 — Plug-in ABI Compatibility Policy (versioning,
struct_sizenegotiation, drift guards) - ADR-021 — Color Management & the Encoding-State Invariant
- ADR-022 — Per-Mode Capability Flags + Frozen Enumerated App Structs
- ADR-023 — Unified Atlas Capture (XR_DXR_atlas_capture)
- ADR-024 — Raw vs Render-Ready Views (XR_DXR_view_rig)
- ADR-025 — Android Vendor Display Processors Run Out-of-Process
- ADR-026 — Orientation-Independent Rendering Modes, Config-Derived View Scale, Rotation-Aware Worst-Case Atlas
- ADR-027 — Display Zones — decoupled mixed 2D/3D layout, per-zone rig, wish mask
- ADR-028 — The rendering mode is the content recipe; the hardware state is an orthogonal override
- ADR-029 — The IPC client owns the transparent present; the DP reconstructs alpha, never bakes a background
- ADR-030 — Compositor Crops to Content; Zero-Copy Only When the Swapchain Equals the Mode Atlas
- ADR-031 — Remove the 2D-surround / output-rect mechanism — display-zones is the sole region paradigm
- ADR-032 — Array (Layered) Swapchains Are First-Class Alongside the Tiled Atlas
- ADR-033 — The Party That Owns Placement Reports Geometry; the Weaver Owns Everything Phase
- ADR-034 — Input Providers Are a Second Plug-in Type, Not a Display-Processor Extension
- ADR-035 — The Service Owns Arbitration, Runs One Compositor Pipeline, and Isolates Its Satellites
- ADR-036 — Android: per-window compositor instances; the workspace overlay is an optional mode
- ADR-037 — Adapter placement policy on hybrid-GPU devices
- ADR-038 — On Android the Vendor Plug-in Ships Inside the Runtime APK
- ADR-039 — One fill engine for every tier (same-adapter split)
- ADR-040 — Rear depth budget — the runtime owns the policy, the plug-in owns pixels, the app owns geometry
- ADR-041 — Fixed view count with per-frame activity — inactive views alias, they do not disappear
- ADR-042 — A vendor 2D→3D conversion module supersedes the open default — the runtime exposes it, weaving stays the DP's
- ADR-043 — A display's stereo camera is a plug-in-provided source, owned by the service and privacy-gated by the runtime
- ADR-044 — The colour contract, per backend and swapchain format
- ADR-045 — Plug-ins are always loadable and report their platform state
- ADR-046 — Depth-aware cursor — opt-in only; the app knows the depth, the runtime places the cursor
- ADR-047 — Multi-screen — segments and per-screen views
Design docs, status trackers, and plans — some shipped, some in progress. After the 2026-05-13 cleanup, this folder holds only living docs (PRDs, in-progress plans, current contracts) — historical agent prompts and shipped-phase status snapshots are recoverable from git history.
- 3D Capture — capture pipeline (shipped in Shell Phase 8)
- Workspace/Runtime Contract — IPC between a workspace controller and the runtime
- MCP — framework extracted to
DisplayXR/displayxr-mcp. See the MCP spec for the protocol; Phase A (handle-app introspection) and Phase B (workspace tools, hosted indisplayxr-shell-pvt) both shipped. - Desktop Overlay Apps — Forward Work — follow-on work after the transparent HWND path shipped (#191)
- Roadmap Overview — milestone status and project trajectory
- Spatial Desktop PRD — product vision
- PR FAQ — press-release-style framing
- Stereo Camera Source — a display's (eye-tracking) stereo camera as a plug-in-provided, privacy-gated source for web calls: browser
getUserMediaintegration, Android, phased plan (design, ADR-043) - Spatial Workspace Extensions Plan — three-phase plan to decouple the shell from the runtime: boundary rename (Phase 1, done), policy migration behind extensions (Phase 2), repo severance (Phase 3)
- Workspace Extensions Header Sketch —
XR_DXR_spatial_workspace.hC-level API draft (historical: the separate app-launcher extension sketched there was dropped; launcher tiles ship as*.displayxr.jsonmanifests) - Workspace Controller Detection — Phase 2.0 prep: orchestrator detects installed controller via sidecar
.controller.jsonmanifest - Workspace Activation Auth Handshake — Phase 2.0 prep: orchestrator-PID match replaces the brand-coupled
application_name == "displayxr-shell"check - Phase 2 Audit — line-by-line classification of the remaining
shellmentions incomp_d3d11_service.cpp - Per-App MCP Tools & Workspace Aggregator — apps register their own MCP tools via
XR_DXR_mcp_tools; one-connection--target workspaceaggregator with<app-id>__<tool>namespacing - WebXR Support — Status & Roadmap — shipped Bridge v2 metadata sideband + the inline-3D (
session.displayXR.weave()) roadmap via Chromium patches - Display Zones — N 3D zones + 2D zones + wish mask: avatar migration + phased plan (ADR-027)
- Android Transparency — Compose-Under-Background — why Android weaves-then-gates instead of compositing a captured background under the views, the Android capture landscape, and the T0/T1/T2 plan (#1031)
- Display Spatial Model — displays in the spatial graph (#46)
- Multi-screen plan — N screens, one DP each, segments + per-screen views; joint runtime × LeiaSR milestones (#69)
- Multi-Display Single Machine — multiple displays, one machine (#69)
- Multi-Display Networked — displays across the network (#70)
- XR_VIEW_CONFIGURATION_PRIMARY_MULTIVIEW — Khronos multiview proposal (#80)
Cross-cutting references that don't belong to a single audience.
- Conventions — code style and naming conventions
- Understanding Targets — build target structure
- Windows Build — Windows build instructions
- Qwerty Device — keyboard/mouse simulated controller
- Window Drag Rendering — rendering during window drag
- Debug Logging — log level conventions
- View-Configuration Model —
PRIMARY_STEREOvsPRIMARY_MULTIVIEW_DXR: which view configuration an app begins, what each reports atxrEnumerateViewConfigurationViews/xrLocateViews/xrEndFrame, the under-submit contract, CTS status and theDXR_VIEW_CONFIG_LEGACYkill switch (#1486 / #80) - CTS interactive procedure — operator runbook for the three human-evaluated CTS categories (
[composition]/[scenario]/[actions]×[interactive]): which display processor a submission should use and why, the qwerty key map that stands in for controllers, a per-test judgement table, and stated verdict rules for the 3D-display ambiguities (#1523 § 4) - Motion-to-Photon Levers — every latency knob (late weave, repaint, queue tiers, deferred present, late latching) with its default, and the defaults per GPU topology (dGPU / iGPU / hybrid)
- Weave Cadence vs. Eye Prediction — how late weave / repaint / slot partition / adapter split relate to vendor-side late latching and the eye predictor, which of them exist on Android, and the CNSDK prediction measurement plan
- Adapter Selection —
DXR_D3D_FORCE_GPU/DXR_VK_FORCE_GPUsupported contract (hybrid iGPU/dGPU machines, in-processgetenvcaveat) - DPI Awareness — the DLL rule: Win32 geometry read inside the runtime answers in the HOST app's DPI space, so publish-worthy rects must pin a per-monitor-v2 thread context
- Control Panel performance settings — census of all 71
DXR_*levers (read site, mechanism, default, tier) + the design for a persisted settings store the runtime reads inside the app process (design only) - Workspace Stability — the wedge family (lock starvation, fence jams, blocking presents, vendor-DP and MCP write wedges), the no-unbounded-work principle (#925), and the diagnostic toolkit ([RENDER] tell, PDBs, wedge captures, close gauntlet)
Vendor-specific reference docs now live in vendors/<vendor>/.
Resolved or superseded documents — kept for historical reference.
- Compositor vs Display Processor — resolved by ADR-007 + process_atlas
- IPC Design — inherited from Monado
- Design Spaces — inherited from Monado
- Swapchains IPC — inherited from Monado
Inherited Monado documentation — kept for reference, not actively maintained.