protonscr

[ARM64 / Steam Frame] x86-64 Windows OpenXR apps crash in xrCreateInstance under Proton ARM64

protonclosed
ValveSoftware/Proton#10211 · opened 2026-10-02 by jesse-chelin · updated 2026-10-02 · 4 comments · github
Jjesse-chelin 2026-10-02 github

[ARM64 / Steam Frame] x86-64 Windows OpenXR apps crash in xrCreateInstance under Proton ARM64

Summary

On SteamOS for Steam Frame (aarch64), x86-64 Windows OpenXR applications running under
Proton ARM64 (WoW64 / FEX) crash while creating the OpenXR instance. Proton's wineopenxr
runtime appears to load and even connect to SteamVR, but xrCreateInstance fails/crashes.

Environment

  • Device: Steam Frame; SteamOS "vr" variant, build 20260928.6175029, kernel 6.18.0, aarch64
  • Proton: experimental-11.0-20260924-cache-arm64 (also reproduced with proton-11.0-2c-arm64)
  • WoW64/FEX: libwow64fex.so, libarm64ecfex.so
  • VR runtime: SteamVR ARM64 (/opt/steamvr/bin/linuxarm64/vrclient.so); host OpenXR
    ~/.config/openxr/1/active_runtime.json -> /opt/steamvr/steamxr_linuxarm64.json
  • Prefix OpenXR ActiveRuntime: C:\openxr\wineopenxr64.json

Steps to reproduce

  1. In a Proton ARM64 prefix, open a standard OpenXR loader (the app bundles the Khronos loader).
    Concretely, the CircuitLord TF2 VR mod ships a probe: TF2VR/tools/xr_probe.exe.
  2. Run xr_probe.exe --inventory inside the Titanfall 2 prefix.

Expected

The OpenXR instance is created and the runtime/headset is reported.

Actual

The probe prints the runtime manifest path and then stops at the instance stage:

Active OpenXR runtime: C:/openxr/wineopenxr64.json
stage=openxr_instance

The full application (Northstar + the VR plugin) crashes inside xrCreateInstance:

EXCEPTION_ACCESS_VIOLATION
Attempted to read from: 0x0
At: MSVCP140.dll + 0x714b4

~/.local/share/Steam/logs/vrserver.txt shows Proton's wineopenxr DID connect to SteamVR, then
the process drops:

New Connect message from .../Proton Experimental (ARM64)/files/lib/wine/aarch64-unix/wine-preloader
  (VRApplication_OpenXRInstance) (Args: steam2ea://launchgame/1237970?platform=steam&theme=tf2)
Creating Builtin AppInfo for .../wine-preloader (VRApplication_OpenXRInstance).
  steam.app.1237970, wineopenxr test instance, 35136
...
AppInfoManager.ProcessDisconnected: Clearing application steam.app.1237970 PID was 35136
  because 35136 has exited

Notes

  • Same app works on Windows with SteamVR; this is specific to Proton ARM64.
  • The x86-64 OpenXR loader reaches the runtime manifest and the runtime connects, so this looks
    like a crash in the loader↔wineopenxr negotiation path on ARM64 (possibly FEX/ARM64EC related),
    not a missing-runtime misconfiguration.
  • The host OpenXR runtime manifest and the prefix ActiveRuntime both resolve correctly.

Attached

  • environment.txt
  • xr_probe_output.txt
  • engine.txt (the mod's staged init log)
  • northstar_crash.txt
  • vrserver_excerpt.txt

Logs

environment.txt
SteamOS (Steam Frame, VR variant) build 20260928.6175029
Linux frame 6.18.0-gfbdbca41fd45 #1 SMP PREEMPT Mon, 28 Sep 2026 19:51:17 +0000 aarch64 GNU/Linux
arch: aarch64
Proton Experimental (ARM64): 1790452683 experimental-11.0-20260924-cache-arm64
Proton 11.0 (ARM64): 1788505046 proton-11.0-2c-arm64
FEX libs: libwow64fex.so libarm64ecfex.so (Proton ARM64 WoW64)
Host OpenXR active runtime: /opt/steamvr/steamxr_linuxarm64.json
SteamVR lib: /opt/steamvr/bin/linuxarm64/vrclient.so
xr_probe_output.txt
Active OpenXR runtime: C:/openxr/wineopenxr64.json
stage=openxr_instance
engine.txt
Active OpenXR runtime: C:/openxr/wineopenxr64.json
stage=openxr_instance
northstar_crash.txt
[2026-10-02] [14:48:08] [NORTHSTAR] [info] NorthstarLauncher version: 1.31.13.0
[2026-10-02] [14:48:08] [NORTHSTAR] [info] Command line: Titanfall2.exe -noOriginStartup  
[2026-10-02] [14:48:08] [NORTHSTAR] [info] Using profile: R2Northstar
[2026-10-02] [14:48:08] [NORTHSTAR] [info] Operating System: Linux (Wine)
[2026-10-02] [14:48:08] [NORTHSTAR] [info] Wine build: wine-11.0
[2026-10-02] [14:48:09] [NORTHSTAR] [error] Northstar has crashed!
[2026-10-02] [14:48:09] [NORTHSTAR] [error] 	EXCEPTION_ACCESS_VIOLATION
[2026-10-02] [14:48:09] [NORTHSTAR] [error] 	Attempted to read from: 0x0
[2026-10-02] [14:48:09] [NORTHSTAR] [error] 	At: MSVCP140.dll + 0x714b4
[2026-10-02] [14:48:09] [NORTHSTAR] [error] 	Rip: 0x6ffff89114b4
[2026-10-02] [14:48:09] [NORTHSTAR] [error] Loaded Plugins:
vrserver_excerpt.txt
Fri Oct 02 2026 14:36:13.607310 [Info] - AppInfoManager.ProcessDisconnected: Clearing application steam.app.1237970 PID was 31586
Fri Oct 02 2026 14:36:13.607327 [Info] - AppInfoManager.ProcessDisconnected: Clearing application steam.app.1237970 PID because 31586 has exited
Fri Oct 02 2026 14:37:28.408962 [Info] - New Connect message from /home/steamos/.local/share/Steam/steamapps/common/Proton 11.0 (ARM64)/files/lib/wine/aarch64-unix/wine-preloader (VRApplication_OpenXRInstance) (Args: Z:\home\steamos\.local\share\Steam\steamapps\common\Titanfall2\TF2VR\tools\crash_monitor.exe Z:\home\steamos\.local\share\Steam\steamapps\common\Titanfall2\TF2VR Z:\home\steamos\.local\share\Steam\steamapps\common\Titanfall2\Titanfall2VRLauncher.exe -profile=TF2VR -novid -windowed -w 1280 -h 720 +ns_has_agreed_to_send_token 2 +ns_masterserver_hostname http://127.0.0.1:9 +ns_report_server_to_masterserver 0 +sp_not_focus_pause 0 +not_focus_sleep 0 +sound_without_focus 1 +hud_setting_adsDof 0 +dof_enable 0 +mat_letterbox_aspect_threshold 0 +dvs_enable 0 +mat_viewportscale 1 +mat_vsync_mode 0 +fps_max 0 +fps_max_use_refresh 0                                                                                                                                                                                                                        ) 32519 
Fri Oct 02 2026 14:37:28.408983 [Info] - Creating Builtin AppInfo for /home/steamos/.local/share/Steam/steamapps/common/Proton 11.0 (ARM64)/files/lib/wine/aarch64-unix/wine-preloader (VRApplication_OpenXRInstance). steam.app.3955719543, wineopenxr test instance, 32519
Fri Oct 02 2026 14:45:01.961468 [Info] - New Connect message from /home/steamos/.local/share/Steam/steamapps/common/Proton Experimental (ARM64)/files/lib/wine/aarch64-unix/wine-preloader (VRApplication_OpenXRInstance) (Args: steam2ea://launchgame/1237970?platform=steam&theme=tf2                                                                                                                                                                                                                                        ) 35136 
Fri Oct 02 2026 14:45:01.961607 [Info] - Creating Builtin AppInfo for /home/steamos/.local/share/Steam/steamapps/common/Proton Experimental (ARM64)/files/lib/wine/aarch64-unix/wine-preloader (VRApplication_OpenXRInstance). steam.app.1237970, wineopenxr test instance, 35136
Fri Oct 02 2026 14:45:01.961700 [Info] - AppInfoManager.ProcessConnected BEGIN 35136 /home/steamos/.local/share/Steam/steamapps/common/Proton Experimental (ARM64)/files/lib/wine/aarch64-unix/wine-preloader 9 steam.app.1237970
Fri Oct 02 2026 14:45:01.961748 [Info] - SetApplicationPid appkey=steam.app.1237970 pid=35136, external transition
Fri Oct 02 2026 14:45:01.961796 [Info] - SetApplicationPid: Setting app steam.app.1237970 PID to 35136
Fri Oct 02 2026 14:45:01.962182 [Error] - [Input] LoadActionManifest failed. Could not find action manifest for app '35136: wine-preloader' with key 'steam.app.1237970'
Fri Oct 02 2026 14:45:04.103668 [Info] - AppInfoManager.ProcessDisconnected: Clearing application steam.app.1237970 PID was 35136
Fri Oct 02 2026 14:45:04.103683 [Info] - AppInfoManager.ProcessDisconnected: Clearing application steam.app.1237970 PID because 35136 has exited
Jjesse-chelin 2026-10-02 github

Update after more debugging — narrowed to two distinct problems.

1. The crash is the Aarch64/ARM64EC msvcp140.dll being loaded by the x86-64 process

WINEDEBUG=+loaddll on the x86-64 probe shows:

trace:loaddll:build_module Loaded L"C:\\windows\\system32\\MSVCP140.dll" ... : native
=>0 0x006ffff96a14b4 in msvcp140 (+0x714b4)
0x006ffff96a14b4 msvcp140+0x714b4: ldr x8, [x8]

The prefix's system32/msvcp140.dll is Aarch64 (PE32+ ... Aarch64), and it is being
loaded into the x86-64 process, where it faults. (system32/vcruntime140_1.dll is x86-64,
system32/msvcp140.dll / vcruntime140.dll are Aarch64 — mixed.)

Workaround that removes the crash: place an x86-64 msvcp140.dll / vcruntime140.dll /
vcruntime140_1.dll next to the exe. Wine then loads those from the app dir
(Loaded L"Z:\\...\\MSVCP140.dll" ... : native, x86-64) and the xrCreateInstance crash goes away.

2. Afterwards, negotiation with the runtime fails

With the x86-64 runtime in place, the loader runs and reports:

err:openxr:get_vulkan_extensions Could not create key, status 0x2.
RuntimeInterface::LoadRuntime skipping manifest file C:\openxr\wineopenxr64.json, negotiation failed with error -6
RuntimeInterface::LoadRuntimes - failed to load a runtime
... XR_ERROR_RUNTIME_UNAVAILABLE (XrResult -51)

wineopenxr.dll loads as builtin. The failure is in get_vulkan_extensions
(Could not create key, status 0x2).

This was captured headless (proton run with no display/Vulkan). I'm now re-testing through
Steam with a display and SteamVR active, and will update with the result.

Jjesse-chelin 2026-10-02 github

Resolved on my side with a workaround — confirming this is real and reproducible.

Workaround: ship the x86-64 msvcp140.dll / vcruntime140.dll / vcruntime140_1.dll
next to the x86-64 exe (so the app dir wins over system32). With that in place, the mod now
initializes OpenXR fully through Proton + SteamVR:

stage=openxr_instance
OpenXR runtime: SteamVR/OpenXR version=2.18.1
stage=openxr_headset
Finger tracking: available, unobstructed motion: available
Headset: SteamVR/OpenXR : cv, positional tracking: reported
stage=openxr_graphics_requirements
stage=openxr_view_configuration
stage=openxr_actions
stage=openxr_ready
xr_resolution ... width=1728 height=1728
call_thunks ... allocated=6fff4c260000 error=0

No crash; the game runs in VR at 1728x1728.

The earlier err:openxr:get_vulkan_extensions Could not create key, status 0x2 was a headless
artifact (proton run with no display/Vulkan); it does not occur in a normal Steam launch with a
display and SteamVR active.

So the actionable bug is: an x86-64 process is loading the Aarch64/ARM64EC
C:\windows\system32\msvcp140.dll
(and vcruntime140.dll), causing an access violation in
native ARM64 code (ldr x8,[x8], read from 0x0). Shipping the x86-64 runtime works around it.
system32/vcruntime140_1.dll is already x86-64 while msvcp140.dll/vcruntime140.dll are
Aarch64, so the prefix's system32 is mixed.

Jjesse-chelin 2026-10-02 github

Final status: the workaround fully resolves it end-to-end.

With the x86-64 msvcp140.dll / vcruntime140.dll / vcruntime140_1.dll next to the exe,
the app now initializes OpenXR and runs in VR via Proton ARM64 + SteamVR, e.g.:

stage=openxr_instance
OpenXR runtime: SteamVR/OpenXR version=2.18.1
stage=openxr_headset
Headset: SteamVR/OpenXR : cv, positional tracking: reported
stage=openxr_ready
eye=0 width=1728 height=1728   eye=1 width=1728 height=1728

The get_vulkan_extensions ... status 0x2 error I mentioned earlier was indeed a headless-only
artifact (no display/Vulkan) and does not occur in a normal Steam launch.

The actionable bug

An x86-64 process loads the Aarch64/ARM64EC C:\windows\system32\msvcp140.dll and
vcruntime140.dll and faults (EXCEPTION_ACCESS_VIOLATION, read from 0x0, ldr x8,[x8]).
system32 is mixed: vcruntime140_1.dll is already x86-64, while msvcp140.dll /
vcruntime140.dll are Aarch64. Providing the x86-64 versions in the app dir is the workaround;
ideally Wine would resolve the WoW64 (x86-64) MSVC runtime for x86-64 processes.

Happy to provide more logs / re-test a fix.

Kkisak-valve maintainer 2026-10-02 github

Hello @jesse-chelin, we're using one issue report per unofficially supported game title, so I've gone ahead and transferred this issue report to https://github.com/ValveSoftware/Proton/issues/4001#issuecomment-5952344655.