{"record":{"id":"4287401ee884e42b","repo":"stride3d/stride","slug":"the-device-does-not-support-passthrough-mode","errorCode":null,"errorMessage":"The device does not support passthrough mode","messagePattern":"The device does not support passthrough mode","errorType":"exception","errorClass":"NotSupportedException","httpStatus":null,"severity":"error","filePath":"sources/engine/Stride.VirtualReality/OpenXR/OpenXRHmd.cs","lineNumber":389,"sourceCode":"\n            Xr.AttachSessionActionSets(session, &actionset_attach_info).CheckResult();\n\n            // figure out what interaction profile we are using, and determine if it has a touchpad/thumbstick or both\n            handProfileState = new InteractionProfileState()\n            {\n                Type = StructureType.InteractionProfileState,\n                Next = null\n            };\n            Xr.StringToPath(Instance, \"/user/hand/left\", ref leftHandPath);\n        }\n\n        public override IDisposable StartPassthrough()\n        {\n            if (!passthroughRequested)\n                throw new InvalidOperationException(\"The passthrough mode needs to be enabled at device creation\");\n\n            if (!SupportsPassthrough)\n                throw new NotSupportedException(\"The device does not support passthrough mode\");\n\n            if (passthroughExt is null)\n                passthroughExt = new OpenXRExt_FB_Passthrough(Xr, globalSession, Instance);\n\n            if (passthroughExt.Enabled)\n                throw new InvalidOperationException(\"Passthrough already started\");\n\n            passthroughExt.Enabled = true;\n\n            return new AnonymousDisposable(() => passthroughExt.Enabled = false);\n        }\n\n        private void EndNullFrame()\n        {\n            FrameEndInfo frame_end_info = new FrameEndInfo()\n            {\n                Type = StructureType.FrameEndInfo,\n                DisplayTime = globalFrameState.PredictedDisplayTime,","sourceCodeStart":371,"sourceCodeEnd":407,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/engine/Stride.VirtualReality/OpenXR/OpenXRHmd.cs#L371-L407","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","solutions":["Check SupportsPassthrough (and passthroughRequested) before calling StartPassthrough and handle the unsupported case in-app.","Run on passthrough-capable hardware with a runtime that exposes FB_passthrough (e.g. Quest on its native runtime).","Make passthrough an optional feature of your app rather than a hard requirement."],"exampleFix":"// before\nhmd.StartPassthrough(); // throws on unsupported devices\n// after\nif (hmd.SupportsPassthrough)\n{\n    var passthrough = hmd.StartPassthrough();\n}\nelse\n{\n    // fall back to opaque background\n}","handlingStrategy":"validation","validationCode":"if (!hmd.SupportsPassthrough)\n{\n    // skip passthrough, use opaque background\n    return;\n}\nvar passthrough = hmd.StartPassthrough();","typeGuard":"bool DeviceSupportsPassthrough(IDeviceHmd hmd) => hmd is OpenXRHmd ox && ox.SupportsPassthrough;","tryCatchPattern":"try { passthrough = hmd.StartPassthrough(); }\ncatch (NotSupportedException) { passthrough = null; /* opaque fallback */ }","preventionTips":["Always gate passthrough behind a SupportsPassthrough check.","Test on the actual target headsets/runtimes; assume PCVR runtimes lack FB passthrough.","Make passthrough optional in app settings."],"tags":["openxr","vr","passthrough","unsupported-device"],"backgroundTag":"operation-not-supported","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}