Correction and retraction: this report was caused by errors in my minimal caller's hand-written OpenXR ABI constants, not by Proton/wineopenxr.
The caller incorrectly defined several XrStructureType values, including:
XR_TYPE_EXTENSION_PROPERTIES as 3 (Khronos defines 2)XR_TYPE_INSTANCE_CREATE_INFO as 2 (Khronos defines 3)XR_TYPE_SYSTEM_GET_INFO as 25 (Khronos defines 4)XR_TYPE_GRAPHICS_REQUIREMENTS_D3D11_KHR as 1000027003 (Khronos defines 1000027002)This fully explains the loader validation messages (unknown type in properties and expected XR_TYPE_INSTANCE_CREATE_INFO). The issue body's source-level hypothesis about wineopenxr leaving type/next uninitialized was therefore invalid: the caller was passing incorrect structure-type values.
I am closing this as invalid. Apologies for the erroneous report and noise; I should have compared every hand-written ABI constant against the generated Khronos header before filing.
proton 11.0-3x1 2026-07WINEDEBUG=-all`x1 2026-07openxr_loader.dllx1 2026-07
wineopenxr: xrEnumerateInstanceExtensionProperties returns XR_ERROR_RUNTIME_UNAVAILABLE with WiVRn/Monado runtime
Summary
Calling
xrEnumerateInstanceExtensionProperties(standard two-call pattern: count query, then data query) through the Khronos OpenXR loader against wineopenxr under Proton + WiVRn/Monado returnsXR_ERROR_RUNTIME_UNAVAILABLE(-1) on the data call. The loader's built-in validation rejects all returnedXrExtensionPropertiesstructs with:This blocks any Windows OpenXR application from even enumerating extensions — the very first OpenXR call fails.
Expected Behavior
The two-call enumeration should succeed: the count call returns the number of extensions, and the data call fills the caller's
XrExtensionPropertiesarray with propertype=XR_TYPE_EXTENSION_PROPERTIES,next=NULL, and valid extension name strings.Actual Behavior
63 consecutive "unknown type in properties" errors are emitted for every extension struct, followed by "invalid properties", and the function returns
XR_ERROR_RUNTIME_UNAVAILABLE. The probe exits with failure code.Environment
Loader Versions Tested (all fail identically)
What Works
wineopenxr test instancesucceeds in the same run — it creates an instance, enumerates 'WiVRn HMD' + controllers, and reaches session stateSYNCHRONIZED.XrExtensionPropertiesstructs are spec-correct:type=XR_TYPE_EXTENSION_PROPERTIES,next=NULL, 128-byte extension name field — verified against OpenXR 1.x spec.Probable Cause
The following Wine log line appears immediately before the validation errors in the Proton log:
This suggests the defect is in wineopenxr's force-enable path in
wine_xrEnumerateInstanceExtensionProperties. When wineopenxr force-adds an extension entry to the array, it writes the extension name viastrcpybut does not set thetype(XR_TYPE_EXTENSION_PROPERTIES) ornext(NULL) fields on the newly added entries. Since these array slots lie beyond what the native Monado runtime filled, thetypefield contains uninitialized memory, and the Khronos loader's conformant validation rejects the entire array.The relevant code path (Proton HEAD at 25880e8,
wineopenxr/openxr.c):Similarly, the non-force-enable substitution path that appends (
dst = (*propertyCountOutput)++) also writes to uninitialized slots without settingtype/next.Minimal Reproduction
Any Windows OpenXR application that performs the standard two-call
xrEnumerateInstanceExtensionPropertiesunder Proton with a WiVRn/Monado runtime and a validating Khronos loader will hit this. A minimal self-contained Windows OpenXR caller (dynamic binding, no SDK dependency) was used to isolate the failure.Not fixed by
XR_ENABLE_API_LAYERS=""(validation is compiled into the loader) orWINEDEBUG=-all(it's a hardXrResult, not a debug print).Additional Notes