Files
daniel-lynch--ovrplugin-ope…/shim/README.md
T
Daniel LynchandClaude Opus 4.8 a72a79ad29 Initial public release: OVRPlugin→OpenXR interoperability shim
An independent reimplementation of Meta's libOVRPlugin ABI on top of OpenXR, so
VrApi-era Meta Quest VR titles can run on non-Meta OpenXR runtimes (Monado,
Steam Frame) instead of being locked to Meta hardware. Original code only — no
Meta/Epic/Capcom binaries, headers, or assets. Includes a desktop harness that
drives the shim against Monado headless.

Scope/legal: interoperability; entitlement handling is out of scope. See README
for the legal/scope section and docs/ for the research trail and design notes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D6sFYGXZPsq3v7xtcDES6g
2026-06-29 00:48:48 -04:00

55 lines
2.8 KiB
Markdown

# libOVRPlugin.so shim (OVRPlugin v1.51 -> OpenXR)
Drop-in replacement for RE4 VR's libOVRPlugin.so that re-exports the ovrp_* symbols
backed by OpenXR (Monado) instead of Meta's libvrapi.so. See ../HOST.md, ../SHIM-SCOPE.md.
## Layout
- include/ovrplugin_shim.h — OVRPlugin v1.51 C ABI (types + core protos; self-checking
_Static_asserts on binary-verified struct sizes).
- gen_stubs.sh — generates src/stubs.c from ../analysis/shim_surface.txt.
- src/stubs.c (generated) — 224 stubs: 101 Unsupported(-1004), 32 no-op Success(0),
91 NotYetImplemented(-1005).
- src/core.c — the 15 header-prototyped core fns (frame loop/init/poses/
controller/system), currently TODO stubs returning -1005 with outputs zeroed.
## Build (host, for validation)
```
cc -std=c11 -Wall -shared -fPIC -fvisibility=hidden -Iinclude src/stubs.c src/core.c \
-o build/libOVRPlugin.so
```
Status: builds; exports exactly 239 ovrp_ symbols (1:1 with shim_surface.txt, 0
missing/extra); dlopen+dlsym verified. This is the SKELETON — it loads and resolves,
it does not yet drive VR (core fns are TODO).
## Real target build (deployable) — TODO
Must be aarch64 / Android (bionic) since it runs inside Lepton. Use the Android NDK:
```
$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android29-clang \
-std=c11 -shared -fPIC -fvisibility=hidden -Iinclude src/stubs.c src/core.c \
-o build/arm64/libOVRPlugin.so
```
(host build only proves the C + symbol coverage; NDK build is the artifact that
replaces the real lib in the APK.)
## Modules (current)
- include/ovrplugin_shim.h — OVRPlugin v1.51 ABI (types, structs, core protos).
- src/stubs.c (generated) — 221 stubs (unsupported/no-op/TODO).
- src/core.c — lifecycle + frame loop + poses (-> xr_runtime).
- src/xr_runtime.{h,c} — OpenXR engine: session, frame loop, swapchains.
- src/vk_session.c — Vulkan-typed: xrCreateSession binding + image enum.
- src/layers.c — ovrp_SetupLayer / GetLayerTexture2 / StageCount.
- tests/harness.c — Path B smoke test (see ../TESTING.md).
Build adds: -Ithird_party/openxr -Ithird_party/vulkan, and src/{core,xr_runtime,
vk_session,layers,stubs}.c. 20 OpenXR fns used; 239/239 ovrp_ exported.
## Done so far
Session lifecycle, frame loop (xrWaitFrame/Begin/EndFrame), poses (xrLocateViews/
Space), swapchains (xrCreateSwapchain from ovrpLayerDesc, acquire/wait/release,
XrCompositionLayerProjection submit). Vulkan binding from Initialize5 args [VERIFIED].
## Next (see ../TESTING.md for the test plan)
1. NDK arm64 build (host build is validation only).
2. [ANDROID-TODO] JavaVM/activity -> XrInstanceCreateInfoAndroidKHR + xrInitializeLoaderKHR.
3. Input action sets (controllers/hands); depth layer; GetVulkan*ExtensionsKHR mapping.
4. Repack APK (real entitlement — you own it); test on Quest 2.