Skip to content

Wrong floor height in Walkabout Mini Golf #46

Description

@ikemike
  1. 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.
  2. 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions