- Floor height is wrong — the player is placed underground in games that work (e.g., Walkabout Mini Golf). Likely a STAGE reference space offset issue.
- Old Unity games fail to initialize OpenXR — games using Unity 2019 / Oculus SDK v1.49.0 (e.g., Arizona Sunshine v1.6) never call
CompositorOpenXR::PreInitialize, so the OpenXR session is never created.
Device
- Model: Samsung Galaxy XR (SM-I610, codename
xrvst2)
- OS: Android XR (Android 14 / API 34+), Snapdragon XR2+ Gen 2
- OpenXR runtime:
libopenxr.google.so — reports as Oculus, version 67.522.0
- Brand:
ro.product.brand = samsung
Issue 1: Floor height wrong (underground)
Game tested
Walkabout Mini Golf (com.MightyCoconut.WalkaboutMiniGolf) v6.2 — Unity 2022.3.62
Behavior
The game launches into VR and renders correctly, but the player's viewpoint is placed underground — the floor plane is above the player. Controllers and tracking work. The game is otherwise fully playable.
Suspected cause
The overport runtime's STAGE reference space mapping likely doesn't account for Galaxy XR's floor offset. On Quest, the STAGE origin is at the real-world floor. On Galaxy XR's OpenXR runtime, the STAGE origin may be at a different position, or the runtime may need XR_EXT_local_floor to get the correct floor height.
Galaxy XR's runtime supports XR_EXT_local_floor (reported in extension enumeration) — perhaps this extension should be used instead of/in addition to the standard STAGE space for floor-relative positioning.
Relevant log: boundary error
E OVRPlugin: [GetBoundaryGeometry] ovrpBoundary_Outer is not supported (CompositorOpenXR.cpp:11542)
Full initialization log (successful)
D Unity : loading library OVRPlugin
D OVRPlugin: JNI_OnLoad
D OVRPlugin: CompositorOpenXR::PreInitialize(nullptr)
I OVRPlugin: CompositorOpenXR::PreInitialize: use default UnityPlayer activity
I OVRPlugin: CompositorOpenXR::PreInitialize(activity = 0x3d4a, apiType = 0, preinitializeFlags=0x0)
I OVRPlugin: Support Non-Oculus runtime: NO
I OVRPlugin: -- Set xrGetInstanceProcAddr to OpenXR Loader
I overportOXR: Linking this loader: libopenxr_loader_generic.so (samsung)
I overportOXR: Hello, OpenXR! (overport by crx, version 3.4.0)
I overport: Loading settings for runtime. (overport by crx, version 3.4.0)
V OpenXR-Loader: xrInitializeLoaderKHR: Entering loader trampoline
V OpenXR-Loader: InitializeLoaderInitData: Unloading any previously loaded runtime
V OpenXR-Loader: xrEnumerateInstanceExtensionProperties: Entering loader trampoline
I OpenXR-Loader: getActiveRuntimeCursor: Querying URI: content://org.khronos.openxr.runtime_broker/openxr/1/abi/arm64-v8a/runtimes/active
W OpenXR-Loader: Exception when querying installable content resolver: Permission Denial: requires org.khronos.openxr.permission.OPENXR
I OpenXR-Loader: getActiveRuntimeCursor: Querying URI: content://org.khronos.openxr.system_runtime_broker/openxr/1/abi/arm64-v8a/runtimes/active
W OpenXR-Loader: Exception when querying system content resolver: Permission Denial: requires org.khronos.openxr.permission.OPENXR_SYSTEM
E OpenXR-Loader: Could access neither the installable nor system runtime broker.
I OpenXR-Loader: RuntimeManifestFile::FindManifestFiles - using global runtime file /system/etc/openxr/1/active_runtime.json
I OpenXR-Loader: RuntimeManifestFile::CreateIfValid - attempting to load /system/etc/openxr/1/active_runtime.json
I OpenXR-Loader: RuntimeInterface::LoadRuntime succeeded loading runtime using interface version 1 and OpenXR API version 1.1
V OpenXR-Loader: xrCreateInstance: Entering loader trampoline
I [xrCreateInstance]: Instance created
I [xrCreateInstance]: Head: 'Generic CPM'
I [xrCreateInstance]: Left: 'CPM_hand_interaction_left'
I [xrCreateInstance]: Right: 'CPM_hand_interaction_right'
I OVRPlugin: Preinitialize: xrCreateInstance() succeeded
I OVRPlugin: OpenXR runtime name: Oculus, version 67.522.0
I OVRPlugin: Preinitialize: xrGetSystem() succeeded. xrSystemId 1
D OVRPlugin: CompositorOpenXR_Vulkan::Layer::Initialize(): CreateSwapchain for eye 0 — 4 stages
Note on OpenXR permission warnings
The Khronos generic loader fails to query both the installable and system runtime brokers due to missing OPENXR and OPENXR_SYSTEM permissions. It falls back to /system/etc/openxr/1/active_runtime.json which works. Adding org.khronos.openxr.permission.OPENXR_SYSTEM to the manifest might enable the preferred broker path, but the fallback works.
Issue 2: Old Unity games (2019) fail to initialize OpenXR
Game tested
Arizona Sunshine (com.vertigogames.azsq) v1.6 — Unity 2019.1.4f1, Oculus Utilities v1.49.0
Behavior
The app launches, audio plays, entitlements pass, but SDK v0.0.0 and SystemHeadset None. No VR rendering. The app displays in a 2D window and eventually hangs on a loading screen.
Root cause
The old Unity 2019 C# Oculus SDK uses the legacy UnityPluginLoad entry point, which does NOT trigger CompositorOpenXR::PreInitialize. Without PreInitialize, the OpenXR session is never created.
CompositorOpenXR::PreInitialize, so the OpenXR session is never created.Device
xrvst2)libopenxr.google.so— reports asOculus, version 67.522.0ro.product.brand = samsungIssue 1: Floor height wrong (underground)
Game tested
Walkabout Mini Golf (
com.MightyCoconut.WalkaboutMiniGolf) v6.2 — Unity 2022.3.62Behavior
The game launches into VR and renders correctly, but the player's viewpoint is placed underground — the floor plane is above the player. Controllers and tracking work. The game is otherwise fully playable.
Suspected cause
The overport runtime's STAGE reference space mapping likely doesn't account for Galaxy XR's floor offset. On Quest, the STAGE origin is at the real-world floor. On Galaxy XR's OpenXR runtime, the STAGE origin may be at a different position, or the runtime may need
XR_EXT_local_floorto get the correct floor height.Galaxy XR's runtime supports
XR_EXT_local_floor(reported in extension enumeration) — perhaps this extension should be used instead of/in addition to the standard STAGE space for floor-relative positioning.Relevant log: boundary error
Full initialization log (successful)
Note on OpenXR permission warnings
The Khronos generic loader fails to query both the installable and system runtime brokers due to missing
OPENXRandOPENXR_SYSTEMpermissions. It falls back to/system/etc/openxr/1/active_runtime.jsonwhich works. Addingorg.khronos.openxr.permission.OPENXR_SYSTEMto the manifest might enable the preferred broker path, but the fallback works.Issue 2: Old Unity games (2019) fail to initialize OpenXR
Game tested
Arizona Sunshine (
com.vertigogames.azsq) v1.6 — Unity 2019.1.4f1, Oculus Utilities v1.49.0Behavior
The app launches, audio plays, entitlements pass, but
SDK v0.0.0andSystemHeadset None. No VR rendering. The app displays in a 2D window and eventually hangs on a loading screen.Root cause
The old Unity 2019 C# Oculus SDK uses the legacy
UnityPluginLoadentry point, which does NOT triggerCompositorOpenXR::PreInitialize. Without PreInitialize, the OpenXR session is never created.