stride3d/stride · error · NotSupportedException

The device does not support passthrough mode

Error message

The device does not support passthrough mode

What it means

StartPassthrough() throws this NotSupportedException when the device's SupportsPassthrough property is false, i.e. the OpenXR runtime/extension does not expose FB passthrough. Even if passthrough was requested at creation, the physical device or runtime may lack the capability. The library refuses to start a passthrough session that cannot exist.

Solutions

  1. Check SupportsPassthrough (and passthroughRequested) before calling StartPassthrough and handle the unsupported case in-app.
  2. Run on passthrough-capable hardware with a runtime that exposes FB_passthrough (e.g. Quest on its native runtime).
  3. Make passthrough an optional feature of your app rather than a hard requirement.

Example fix

// before
hmd.StartPassthrough(); // throws on unsupported devices
// after
if (hmd.SupportsPassthrough)
{
    var passthrough = hmd.StartPassthrough();
}
else
{
    // fall back to opaque background
}
Defensive patterns

Strategy: validation

Validate before calling

if (!hmd.SupportsPassthrough)
{
    // skip passthrough, use opaque background
    return;
}
var passthrough = hmd.StartPassthrough();

Type guard

bool DeviceSupportsPassthrough(IDeviceHmd hmd) => hmd is OpenXRHmd ox && ox.SupportsPassthrough;

Try / catch

try { passthrough = hmd.StartPassthrough(); }
catch (NotSupportedException) { passthrough = null; /* opaque fallback */ }

Prevention

When it happens

Trigger: Calling StartPassthrough() on hardware or an OpenXR runtime without the FB_passthrough extension (e.g. PCVR runtimes, older headsets, passthrough-capable hardware run with a runtime that doesn't expose it).

Common situations: Testing passthrough code on a desktop PCVR runtime instead of a standalone headset; deploying to a headset model without passthrough support; runtime update that dropped the extension.

Related errors


AI-assisted analysis of stride3d/stride@96fad776d2 (2026-09-14). Data as JSON: /api/errors/4287401ee884e42b. Report an issue: GitHub.

Appendix: source

Thrown at sources/engine/Stride.VirtualReality/OpenXR/OpenXRHmd.cs:389

            Xr.AttachSessionActionSets(session, &actionset_attach_info).CheckResult();

            // figure out what interaction profile we are using, and determine if it has a touchpad/thumbstick or both
            handProfileState = new InteractionProfileState()
            {
                Type = StructureType.InteractionProfileState,
                Next = null
            };
            Xr.StringToPath(Instance, "/user/hand/left", ref leftHandPath);
        }

        public override IDisposable StartPassthrough()
        {
            if (!passthroughRequested)
                throw new InvalidOperationException("The passthrough mode needs to be enabled at device creation");

            if (!SupportsPassthrough)
                throw new NotSupportedException("The device does not support passthrough mode");

            if (passthroughExt is null)
                passthroughExt = new OpenXRExt_FB_Passthrough(Xr, globalSession, Instance);

            if (passthroughExt.Enabled)
                throw new InvalidOperationException("Passthrough already started");

            passthroughExt.Enabled = true;

            return new AnonymousDisposable(() => passthroughExt.Enabled = false);
        }

        private void EndNullFrame()
        {
            FrameEndInfo frame_end_info = new FrameEndInfo()
            {
                Type = StructureType.FrameEndInfo,
                DisplayTime = globalFrameState.PredictedDisplayTime,

View on GitHub (pinned to 96fad776d2)