We're hiring!

Monado 21.0.0, an officially conformant OpenXR implementation!

Jakob Bornecrantz avatar

Jakob Bornecrantz
February 15, 2021

Share this post:

Reading time:

We are pleased to announce that Monado now provides an officially conformant OpenXR implementation. The official listing of conformant OpenXR 1.0 implementations now includes Monado, based on running the OpenXR conformance test suite on a "simulated" device.

Note that the OpenXR 1.0 conformant status applies only to the simulated device. Anyone building a product using Monado with non-simulated hardware still needs to go through the full, normal adopter and conformance process for that product in order to claim OpenXR conformance and take advantage of the benefits. This resembles the situation with Mesa: though Mesa implements numerous Khronos APIs, not all API and driver combinations are formally conformant, and hardware vendors have the responsibility to follow the adopter process and submit conformance results.

Among other benefits of official adoption, this conformance result and adoption allows the Monado project to use the OpenXR word and logo trademarks to describe its feature set. This recognizes publicly that the Monado open-source project truly does implement OpenXR as specified.


In recognition of this conformance status, we have made our first proper release version, and have moved away from the pre-release 0.X.Y version series that we used before. This first officially conformant release is known as 21.0.0, rather than 1.0.0. Common SemVer conventions mainly address API stability. However, since the only public API to Monado is through the externally-maintained OpenXR specification, a standard SemVer number for Monado would remain at major version 1 for a long time despite advancements in the project.

Instead, we decided to follow the versioning model of fellow FreeDesktop.org project, Mesa: a hybrid of SemVer and date-based versioning. Monado version numbers going forward will take the form MAJOR.MINOR.PATCH, where the first component (MAJOR) is the last two digits of the year in which the branch was made. The MINOR and PATCH follows the SemVer conventions. The MINOR version component is incremented for each release branch made through the year, and the PATCH component is incremented for each release from that branch.

SteamVR driver

From its inception, Valve's SteamVR runtime has allowed hardware vendors, developers and hobbyists to add hardware support with an officially supported OpenVR driver SDK.

Monado now comes with a SteamVR driver that allows using any of Monado's HMD and controller drivers to be used inside SteamVR. Information on how to set up the SteamVR driver can be found on our website.

We will be talking about the SteamVR driver in a later blogpost.


Note: In the changelogs below, xrt refers to the Monado-internal XR Run Time API used for communication between modules.

  • Major changes
    • Adds a initial SteamVR driver state tracker and target that produces a SteamVR plugin that enables any Monado hardware driver to be used in SteamVR. This is the initial upstreaming of this code and has some limitations, like only having working input when emulating a Index controller. (!583)
  • XRT Interface
    • Add xrt_binding_profile struct, related pair structs and fields on xrt_device to allow to move the static rebinding of inputs and outputs into device drivers. This makes it easier to get a overview in the driver itself which bindings it can bind to. (!587)
    • xrt: Generate bindings for Monado and SteamVR from json. (!638)
    • xrt: Introduce xrt_system_compositor, it is basically a analogous to XrSystemID but instead of being a fully fledged xrt_system this is only the compositor part of it. Also fold the prepare_session function into the create native compositor function to simplify the interface. (!652)
    • Expose more information on the frameservers, like product, manufacturer and serial. (!665)
    • Add XRT_FORMAT_BAYER_GR8 format. (!665)
  • State Trackers
    • st/oxr: Add OXR_FRAME_TIMING_SPEW for basic frame timing debug output. (!591)
    • OpenXR: Make sure to restore old EGL display/context/drawables when creating a client EGL compositor. (!602)
    • GUI: Expand with support for controlling the remote driver hand tracking. (!604)
    • st/oxr: Implement XR_KHR_vulkan_enable2 (!633)
    • st/oxr: Add OXR_TRACKING_ORIGIN_OFFSET_{X,Y,Z} env variables as a quick way to tweak 6dof tracking origins. (!634)
    • OpenXR: Be more relaxed with Quat validation, spec says within 1% of unit length, normalize if not within float epsilon. (!659)
  • Drivers
    • North Star: Fix memory leak in math code. (!564)
    • psvr: Rename some variables for better readability. (!597)
    • openhmd: Fix viewport calculation of rotated displays. (!600)
    • remote: Add support for simulated hand tracking, this is based on the curl model that is used by the Valve Index Controller. (!604)
    • android: Acquire device display metrics from system. (!611)
    • openhmd: Rotate DK2 display correctly. (!628)
    • d/psmv: The motor on zcmv1 does not rumble at amplitudes < 0.25. Linear rescale amplitude into [0.25, 1] range. (!636)
    • v4l2: Expose more information through new fields in XRT interface. (!665)
    • v4l2: Allocate more buffers when streaming data. (!665)
  • IPC
    • ipc: Port IPC to u_logging. (!601)
    • ipc: Make OXR_DEBUG_GUI work with monado-service. (!622)
  • Compositor
    • comp: Add basic frame timing information to XRT_COMPOSITOR_LOG=trace. (!591)
    • main: Refactor how the compositor interacts with targets, the goal is to enable the compositor to render to destinations that isn't backed by a VkSwapchain. Introduce comp_target and remove comp_window, also refactor vk_swapchain to be a sub-class of comp_target named comp_target_swapchain, the window backends now sub class comp_target_swapchain. (!599)
    • Implement support for XR_KHR_composition_layer_equirect (equirect1). (!620, !624)
    • comp: Improve thread safety. Resolve issues in mutlithreading CTS. (!645)
    • main: Lower priority on sRGB format. This works around a bug in the OpenXR CTS and mirrors better what at least on other OpenXR runtime does. (!671)
  • Helper Libraries
    • os/time: Make timespec argument const. (!597)
    • os/time: Add a Linux specific way to get the realtime clock (for RealSense). (!597)
    • math: Make sure that we do not drop and positions in poses when the other pose has a non-valid position. (!603)
    • aux/vk: vk_create_device now takes in a list of Vulkan device extensions. (!605)
    • Port everything to u_logging. (!627)
    • u/hand_tracking: Tweak finger curl model making it easier to grip ingame objects. (!635)
    • math: Add math_quat_validate_within_1_percent function. (!659)
    • u/sink: Add Bayer format converter. (!665)
    • u/distortion: Improve both Vive and Index distortion by fixing polynomial math. (!666)
    • u/distortion: Improve Index distortion and tidy code. While this touches the Vive distortion code all Vive headsets seems to have the center set to the same for each channel so doesn't help them. And Vive doesn't have the extra coefficient that the Index does so no help there either. (!667)
  • Misc. Features
  • Misc. Fixes
    • steamvr: Support HMDs with rotated displays (!600)


Comments (2)

  1. Richard Martin:
    Oct 19, 2022 at 04:59 PM

    Are Android binaries available somewhere? I wanted to test the Khronos OpenXR loader for Android with a phone.

    Reply to this comment

    Reply to this comment

    1. Jakob Bornecrantz:
      Oct 19, 2022 at 06:00 PM

      You can get them from the CI here https://gitlab.freedesktop.org/monado/monado , you will also need the broker and a application to to test with. We are working on a blogpost that will be released in a month or two that will tell you more exactly how to test it.

      Reply to this comment

      Reply to this comment

Add a Comment

Allowed tags: <b><i><br>Add a new comment:


Search the newsroom

Latest News & Events

Blast from the past at Embedded World: Atari plays for Linux


Adhering to the fundamentals of open source, the Atari VCS OS is based on Debian using the Apertis infrastructure, and the graphics rely…

Up close and personal with STMicroelectronics' STM32MP2 at Embedded World


Using TensorFlow Lite models optimized for the STM3MP2 NPU along with an upstream-ready H.264 encoder (Video4Linux2), this demo showcases…

New unixfd plugin in GStreamer 1.24


GStreamer 1.24 was recently released, and with it came with a new plugin to help separate pipelines into different processes.

Open Since 2005 logo

We use cookies on this website to ensure that you get the best experience. By continuing to use this website you are consenting to the use of these cookies. To find out more please follow this link.

Collabora Ltd © 2005-2024. All rights reserved. Privacy Notice. Sitemap.