Skip to content

1.2.0

Latest

Choose a tag to compare

@demonixis demonixis released this 19 Jun 12:32

1.2.0

screenshot

Added

  • Added Linux-first Qt frontends under clients/Qt/, including Qt Home, a standalone Qt simulator, and a reusable simulator widget.
  • Added Qt Home support for compatible app launching, selected-runtime registration on Linux, runtime TOML editing, runtime activity/status display, custom ADB selection, USB reverse mapping setup, and asynchronous transport readiness checks.
  • Added Qt simulator video preview with FFmpeg when available, tracking-only fallback when FFmpeg is unavailable, mouse-driven synthetic head tracking, frame-loss/FEC status, and keyframe recovery requests.
  • Added Linux Vulkan/FFmpeg runtime scaffolding, portable platform helpers, portable socket helpers, and platform-specific config/state directory support.
  • Added first-pass Windows layout and portability scaffolding while keeping the Windows runtime backend non-gating for this release.
  • Added canonical shared protocol headers under common/protocol/include/oxrsys/protocol/.
  • Added centralized product versioning in config/OXRSysVersion.xcconfig for CMake, Xcode, and Android consumers.
  • Added macOS package and distribution helpers: scripts/macos_build_package.sh and scripts/macos_sign_notarize.sh.
  • Added the net.demonixis.oxrsys-unity Unity Package Manager package with editor runtime selection and a macOS Player OpenXR loader postprocessor.
  • Added runtime tests for portable platform behavior, streaming frame queue replacement, Vulkan dispatch, expanded input handling, protocol layout, runtime status, and loader-backed API behavior.
  • Added server-selected headset refresh controls, foveated encoding presets, headset client foveation override presets, Quest shader upscaling controls, and reserved headset-audio configuration to SwiftUI Home and Qt Home.
  • Added protocol v1.1 trailing fields for server feature flags, client capability flags, foveated encoding parameters, client foveation, client upscaling, and reserved headset speaker audio.
  • Added ALVR-style AADT foveated encoding math, a Metal encoder preprocessing shader, and Quest shader-side foveated-encoding decompression.
  • Added a Quest edge-aware shader upscaling path without requiring the proprietary Snapdragon SDK.
  • Added configurable Quest client reprojection modes (off, pose, pose_warp) for short decode/network gaps, with displayed-frame-age and reprojection counters in latency reports and runtime status.
  • Added a local Quest/PICO shell that replaces standby/loading color clears with a 3D grid, upright status panel, reset button, optional XR_FB_passthrough mode, controller laser interaction, hand laser/pinch interaction, and visible hand-joint markers.
  • Added a runtime ABR controller with off, bitrate, and full modes, sliding-window hysteresis, fast bitrate downshift, slow recovery, and profile reporting for future session-safe resolution/foveation/upscaling transitions.

Changed

  • Moved the repository toward the OXRSys cross-platform layout, including clients/Android/android-vr/, clients/Apple/common/, and clients/Qt/.
  • Changed the runtime graphics plumbing to use typed GraphicsContext and FrameSource data across sessions, swapchains, streaming, and encoders.
  • Kept Vulkan loader usage app-owned: the runtime resolves Vulkan entry points from the application-provided dispatch path or already-loaded process symbols without directly linking or loading the Vulkan loader.
  • Reworked streaming frame submission around a latest-frame-only queue so replacing a pending frame releases its backend resources.
  • Expanded runtime configuration reload behavior for dynamic streaming values while keeping initialization-time resources restart-bound.
  • Raised the shared streaming bitrate range to 1 through 200 Mbps and allowed clients to send ClientConnect.maxBitrateMbps = 0 to defer to the server-configured bitrate.
  • Updated Apple and Qt simulator clients to avoid imposing their own bitrate cap.
  • Updated Apple and Qt simulator clients to own simulator vertical FOV and send it through tracking eye-FOV metadata instead of exposing it through Home runtime config.
  • Updated headset client foveation to default to auto, moved headset-side options into dedicated Home sections, and made Quest/PICO XR_FB_foveation apply only when Home sends an explicit override.
  • Updated the streaming protocol to carry render-pose metadata per frame and to store the final FEC group packet payload size in the existing video header padding.
  • Updated Quest/PICO controller profile handling to stay profile-aware instead of falling back globally to KHR simple_controller.
  • Reworked Android VR client transport handling to prefer USB ADB reverse TCP when available, fall back to WiFi UDP discovery, request the build-configured display refresh rate before discovery, and advertise the headset OpenXR system name.
  • Updated the Android VR client to request the server-announced refresh rate after discovery, report the active headset rate, advertise streaming capabilities, and apply server-selected client foveation/upscaling options.
  • Updated runtime video dispatch so encoded frames pass through a bounded sender queue before WiFi/USB transport writes, keeping socket backpressure out of encoder callbacks.
  • Updated the Quest USB ADB client to defer bitrate limits to the server/Home configuration instead of imposing an extra 100 Mbps cap.
  • Updated the Quest decoder path to drain MediaCodec output on a decoder thread instead of the XR frame loop.
  • Updated the Quest MediaCodec input sizing to keep bounded headroom for high-bitrate foveated-encoding IDR frames.
  • Updated the Quest/PICO shell to pause passthrough, stop local shell interactions, and release shell GL resources while streaming video is actively rendered.
  • Updated SwiftUI Home and Qt Home with ABR and Quest client reprojection controls plus runtime status display for frame age, ABR state, and reprojection reuse.
  • Updated FFmpeg encoder preset mapping so Linux scaffolding maps speed, balanced, and quality to low-latency FFmpeg presets instead of always using ultrafast.
  • Updated macOS Home for direct distribution workflows, selected-runtime app launching, runtime registration, package-compatible runtime paths, runtime activity display, and shared Developer simulator integration.
  • Updated visionOS streaming behavior around the minimal search window, automatic immersive entry on stream connection, head/hand tracking, and first-pass tracked accessory controller data.

Fixed

  • Fixed Metal streaming frame snapshots so the async encoder reads a release-time staging texture instead of a swapchain slot that the app may already have reused. thanks to @wwtssu
  • Fixed server-side foveated encoding on Metal by running the AADT pass through a compute shader into a private GPU scratch texture before blitting into the VideoToolbox pixel buffer, avoiding render-encoder validation aborts on the first encoded frame.
  • Fixed Quest connection recovery when a server is discovered but no first video frame arrives, returning the client to discovery/retry instead of leaving the standby/loading screen stuck.
  • Fixed controller pose handling so streaming packets only update controller poses when the corresponding controller-active flag is present.
  • Fixed hand tracking and hand-interaction coexistence so hand bindings remain available while controller bindings keep priority for shared actions.
  • Fixed Quest hand tracking ingestion by feeding real XR_EXT_hand_tracking joints from the Android client into the runtime.
  • Fixed USB ADB reverse TCP reconnect behavior so closed control/video sockets or video stalls return the Android client to discovery/retry without relaunching the client.
  • Hardened Quest USB TCP sends with bounded socket behavior and stale video dispatch cleanup so failed sends do not block encoder callbacks or Session::EndFrame().
  • Hardened Quest receive hot paths by reusing TCP/UDP reassembly buffers, avoiding per-packet receive timeout updates, and making USB tracking sends best-effort/non-blocking.
  • Hardened Quest headset foveation shutdown by detaching the foveation profile from swapchains before destroying it.
  • Hardened runtime-managed Quest logcat capture so it remains optional, bounded, and best-effort during startup.
  • Fixed render-pose matching on headset clients so decoded frames are submitted with the pose used to render that frame.
  • Filtered known macOS linkd.autoShortcut App Intents diagnostics from Home captured app logs.
  • Fixed and covered xrLocateSpacesKHR as an alias for the OpenXR 1.1 xrLocateSpaces entry point.

Documentation

  • Reworked platform documentation for build, install, architecture, protocol, Quest/PICO, macOS Home, Qt Home, simulator, visionOS, and testing/conformance workflows.
  • Documented current Linux, Windows-scaffold, macOS package, Unity, USB ADB, protocol, and CTS expectations.

Known Limits

  • Linux video streaming still needs real Vulkan image readback before it can be treated as feature-complete.
  • Windows remains layout and portability scaffolding only for this release.
  • PICO and headset-specific controller/hand tracking behavior still needs regular hardware validation.
  • Headset speaker audio has protocol/config scaffolding but no active runtime capture/playback pipeline yet.