mirror of
https://github.com/mitch030504/Wiicompiled_VR_Frame.git
synced 2026-10-06 06:00:25 +02:00
docs: package and document experimental OpenXR support
This commit is contained in:
1 parent
2156617cd5
commit
b5a73959d4
7 files changed
+111
-3
No files matched your search
@@ -65,6 +65,7 @@ project.lock.json
|
|||||||
/tools/
|
/tools/
|
||||||
/TEMP/
|
/TEMP/
|
||||||
/tmp/
|
/tmp/
|
||||||
|
/.scratch/
|
||||||
/test_output/
|
/test_output/
|
||||||
*.log
|
*.log
|
||||||
output.txt
|
output.txt
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ Assert-Directory $dependencySources 'Pinned offline dependency sources'
|
|||||||
# to compile (launcher/Prepare-NativePrebuilt.ps1).
|
# to compile (launcher/Prepare-NativePrebuilt.ps1).
|
||||||
# Kept in step with InstalledLayout.DependencyNames by Test-PinnedFacts.ps1: the installed host
|
# Kept in step with InstalledLayout.DependencyNames by Test-PinnedFacts.ps1: the installed host
|
||||||
# refuses to call a toolkit complete unless every one of these directories is present.
|
# refuses to call a toolkit complete unless every one of these directories is present.
|
||||||
$requiredDependencies = @('abseil-cpp','cppwinrt','dawn_prebuilt','fmt','freetype','imgui','libusb','native_prebuilt','png','SDL','sqlite3','tracy','xxhash','zlib','zstd')
|
$requiredDependencies = @('abseil-cpp','cppwinrt','dawn_prebuilt','fmt','freetype','imgui','libusb','native_prebuilt','openxr','png','SDL','sqlite3','tracy','xxhash','zlib','zstd')
|
||||||
|
|
||||||
# The precompiled archives are only interchangeable with what the user's machine
|
# The precompiled archives are only interchangeable with what the user's machine
|
||||||
# compiles if both came from this toolchain and this flag set, so a stale package
|
# compiles if both came from this toolchain and this flag set, so a stale package
|
||||||
@@ -225,6 +225,7 @@ Write-Host '[3/6] Writing manifests and third-party license inventory...'
|
|||||||
Copy-Item (Join-Path $portableTools 'README-LICENSES.txt') (Join-Path $payloadRoot 'licenses\Portable-build-tools.txt')
|
Copy-Item (Join-Path $portableTools 'README-LICENSES.txt') (Join-Path $payloadRoot 'licenses\Portable-build-tools.txt')
|
||||||
Copy-Item (Join-Path $repoRoot 'aurora-main\LICENSE') (Join-Path $payloadRoot 'licenses\Aurora-LICENSE.txt')
|
Copy-Item (Join-Path $repoRoot 'aurora-main\LICENSE') (Join-Path $payloadRoot 'licenses\Aurora-LICENSE.txt')
|
||||||
Copy-Item (Join-Path $dependencySources 'cppwinrt\LICENSE.txt') (Join-Path $payloadRoot 'licenses\CppWinRT-LICENSE.txt')
|
Copy-Item (Join-Path $dependencySources 'cppwinrt\LICENSE.txt') (Join-Path $payloadRoot 'licenses\CppWinRT-LICENSE.txt')
|
||||||
|
Copy-Item (Join-Path $dependencySources 'openxr\LICENSE') (Join-Path $payloadRoot 'licenses\OpenXR-SDK-LICENSE.txt')
|
||||||
# The precompiled aurora/third-party archives are built from the very sources
|
# The precompiled aurora/third-party archives are built from the very sources
|
||||||
# already shipped under build-workspace\Dependencies and aurora-main, so they add
|
# already shipped under build-workspace\Dependencies and aurora-main, so they add
|
||||||
# no third-party component and therefore no new license obligation.
|
# no third-party component and therefore no new license obligation.
|
||||||
|
|||||||
@@ -189,12 +189,13 @@ $pins = Get-MkwProjectPins $project
|
|||||||
# (the real RAM guard, capping concurrent clang compiles of memory-hungry translated TUs via the Ninja
|
# (the real RAM guard, capping concurrent clang compiles of memory-hungry translated TUs via the Ninja
|
||||||
# MKW_TRANSLATED_COMPILE_JOBS pool), and $globalJobs (Ninja's overall parallelism for everything else).
|
# MKW_TRANSLATED_COMPILE_JOBS pool), and $globalJobs (Ninja's overall parallelism for everything else).
|
||||||
# An explicit -Parallel pins all three.
|
# An explicit -Parallel pins all three.
|
||||||
$memoryGiB = [math]::Max(1, [math]::Floor((Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory / 1GB))
|
|
||||||
if ($Parallel -gt 0) {
|
if ($Parallel -gt 0) {
|
||||||
$translatorThreads = $Parallel
|
$translatorThreads = $Parallel
|
||||||
$translatedJobs = $Parallel
|
$translatedJobs = $Parallel
|
||||||
$globalJobs = $Parallel
|
$globalJobs = $Parallel
|
||||||
} else {
|
} else {
|
||||||
|
$memoryGiB = [math]::Max(1, [math]::Floor(
|
||||||
|
(Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory / 1GB))
|
||||||
$translatorThreads = [math]::Max(1, [math]::Min([Environment]::ProcessorCount, 16))
|
$translatorThreads = [math]::Max(1, [math]::Min([Environment]::ProcessorCount, 16))
|
||||||
$translatedJobs = [math]::Max(1, [math]::Min([Environment]::ProcessorCount,
|
$translatedJobs = [math]::Max(1, [math]::Min([Environment]::ProcessorCount,
|
||||||
[math]::Floor($memoryGiB / 2)))
|
[math]::Floor($memoryGiB / 2)))
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ internal static class InstalledLayout
|
|||||||
public static readonly string[] DependencyNames =
|
public static readonly string[] DependencyNames =
|
||||||
[
|
[
|
||||||
"abseil-cpp", "cppwinrt", "dawn_prebuilt", "fmt", "freetype", "imgui", "libusb", "native_prebuilt",
|
"abseil-cpp", "cppwinrt", "dawn_prebuilt", "fmt", "freetype", "imgui", "libusb", "native_prebuilt",
|
||||||
"png", "SDL", "sqlite3", "tracy", "xxhash", "zlib", "zstd"
|
"openxr", "png", "SDL", "sqlite3", "tracy", "xxhash", "zlib", "zstd"
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,95 @@
|
|||||||
|
# Experimental OpenXR VR
|
||||||
|
|
||||||
|
WiiCompiled has an opt-in OpenXR rendering path. The first functional backend is Windows D3D12.
|
||||||
|
It asks the OpenXR runtime for the required GPU before Aurora creates Dawn, then copies each eye
|
||||||
|
on that same D3D12 device and queue into the acquired OpenXR swapchain images. Eye submission
|
||||||
|
stays on the GPU; there is no CPU texture readback and no second graphics device.
|
||||||
|
|
||||||
|
This is an experimental renderer, not yet a release-ready VR mode.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- A Windows OpenXR runtime selected as the system's active runtime.
|
||||||
|
- A connected headset supported by that runtime.
|
||||||
|
- A D3D12-capable GPU and driver accepted by both OpenXR and Dawn.
|
||||||
|
- A build made with `MKW_ENABLE_OPENXR=ON`, which defaults on for Windows and off elsewhere while
|
||||||
|
the Vulkan bridge remains capability-gated.
|
||||||
|
|
||||||
|
OpenXR remains disabled until requested in `Config.toml`. The file is next to the installed game
|
||||||
|
configuration and is created with the following defaults:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[vr]
|
||||||
|
enabled = false
|
||||||
|
required = false
|
||||||
|
render_scale = 1.0
|
||||||
|
world_units_per_meter = 500.0
|
||||||
|
hud_distance_meters = 2.0
|
||||||
|
stop_at_display_copy = true
|
||||||
|
skip_copy_clears = true
|
||||||
|
```
|
||||||
|
|
||||||
|
Set `enabled = true`, close the game completely, and start it again. These settings are read only
|
||||||
|
at launch. The in-game F10 settings bar also exposes the enable switch, but a restart is still
|
||||||
|
required.
|
||||||
|
|
||||||
|
`required = false` is the safe default: an absent runtime, disconnected headset, unsupported GPU,
|
||||||
|
or graphics-binding failure is logged and the game continues in ordinary desktop mode. Set it to
|
||||||
|
`true` only when a failed VR startup should stop the game with an error.
|
||||||
|
|
||||||
|
`render_scale` scales the per-eye size recommended by the OpenXR runtime.
|
||||||
|
`world_units_per_meter` controls the scale of headset translation in the game world.
|
||||||
|
`hud_distance_meters` controls the distance of the head-locked virtual screen.
|
||||||
|
`stop_at_display_copy` ends eye replay at the final `GXCopyDisp`, matching the frame shown on the
|
||||||
|
desktop. `skip_copy_clears` independently suppresses the EFB reset performed after a copy. Both
|
||||||
|
default on and can be changed live from the F10 settings bar for diagnostics.
|
||||||
|
|
||||||
|
## Presentation policy
|
||||||
|
|
||||||
|
The runtime deliberately fails safe instead of guessing which Mario Kart camera is active:
|
||||||
|
|
||||||
|
- Menus, loading screens, unclassified scenes, and multiplayer render on a head-locked virtual
|
||||||
|
screen.
|
||||||
|
- A PAL `RMCP01` race scene switches to immersive stereo only after translated-code observers
|
||||||
|
confirm exactly one distinct race camera for the current GX frame.
|
||||||
|
- Leaving the race or observing zero or multiple cameras immediately returns presentation to the
|
||||||
|
virtual screen. Session/runtime loss safely tears down XR and continues on the desktop mirror.
|
||||||
|
|
||||||
|
Aurora records the original GX frame once and replays it for both OpenXR eyes. Perspective GX draws
|
||||||
|
receive asymmetric headset projections; orthographic and unclassified draws retain their original
|
||||||
|
GX transforms during immersive replay. Menus and unsafe whole scenes use the virtual-screen path.
|
||||||
|
Head pose is sampled by the OpenXR pacing thread, while Aurora's frame worker consumes a
|
||||||
|
short-lived immutable stereo packet. Each sealed GX frame and immersive packet carry the same
|
||||||
|
policy-generation tag; a mismatch is rendered in mono and the acquired XR frame is canceled, so an
|
||||||
|
asynchronous menu/race transition cannot replay race transforms over unsafe content. A pause or
|
||||||
|
minimized window can withdraw an unencoded packet and end that compositor frame without layers; an
|
||||||
|
encoded-work stall requests teardown at Aurora's next safe producer boundary. All OpenXR session
|
||||||
|
and swapchain calls remain on their owning thread.
|
||||||
|
|
||||||
|
## Backend status
|
||||||
|
|
||||||
|
| Backend | Status |
|
||||||
|
| --- | --- |
|
||||||
|
| Windows D3D12 | Implemented: same-adapter, same-device asynchronous OpenXR submission. |
|
||||||
|
| Linux Vulkan | Capability-gated scaffold. The pinned Dawn package does not expose the complete native Vulkan instance/device/queue context needed for safe same-device OpenXR interop, so the runtime logs the limitation and falls back to desktop rendering. |
|
||||||
|
| Other platforms | Not wired yet. |
|
||||||
|
|
||||||
|
The Vulkan path intentionally does not create an unrelated Vulkan device or use a CPU readback as
|
||||||
|
a workaround. It accepts a future explicit Dawn native context, including external queue locking,
|
||||||
|
so it can be enabled once Aurora exposes those handles safely.
|
||||||
|
|
||||||
|
## Current limitations
|
||||||
|
|
||||||
|
- Only the project's supported PAL `RMCP01` translation has race instrumentation addresses.
|
||||||
|
- Motion-controller/Wii Remote emulation and OpenXR action bindings are not implemented yet; use
|
||||||
|
the existing game-controller input path.
|
||||||
|
- Dedicated Quest, Android, and Apple visionOS packaging is not implemented. The static recompilation
|
||||||
|
architecture avoids a runtime JIT, but each platform still needs an Aurora graphics bridge,
|
||||||
|
windowing/lifecycle work, and packaging.
|
||||||
|
- Scene-specific comfort options, culling fixes, replay/spectator classification, and a broader VR
|
||||||
|
settings UI beyond the current enable/replay controls are future work.
|
||||||
|
- The desktop window remains available as a mirror/fallback.
|
||||||
|
|
||||||
|
OpenXR diagnostics are written to the normal run log under
|
||||||
|
`%LOCALAPPDATA%\WiiCompiled\Logs`. Search for `OpenXR` when reporting a startup or submission
|
||||||
|
failure.
|
||||||
@@ -36,6 +36,13 @@ The graphics layer is built on
|
|||||||
**High internal resolution.**
|
**High internal resolution.**
|
||||||
Play at several times the console's resolution.
|
Play at several times the console's resolution.
|
||||||
|
|
||||||
|
**Experimental OpenXR VR.**
|
||||||
|
Windows builds can render through a D3D12 OpenXR runtime without CPU readback. Menus and
|
||||||
|
unsupported scenes appear as a head-locked virtual screen; a validated single-camera race switches
|
||||||
|
to immersive stereo rendering. VR is opt-in and falls back to the normal desktop renderer if the
|
||||||
|
runtime or headset is unavailable. See [`OPENXR.md`](OPENXR.md) for setup, configuration, and the
|
||||||
|
current limitations.
|
||||||
|
|
||||||
**Music ducking.**
|
**Music ducking.**
|
||||||
Start playing something else, Spotify, a YouTube video, and
|
Start playing something else, Spotify, a YouTube video, and
|
||||||
the game automatically mutes its own music until the other audio stops. Optional, if you'd
|
the game automatically mutes its own music until the other audio stops. Optional, if you'd
|
||||||
@@ -178,6 +185,8 @@ All translated output is verified against real hardware behavior and most import
|
|||||||
project's whole graphics layer sits on. MIT licensed.
|
project's whole graphics layer sits on. MIT licensed.
|
||||||
- **[Dawn](https://dawn.googlesource.com/dawn)** - Google's WebGPU implementation, powering
|
- **[Dawn](https://dawn.googlesource.com/dawn)** - Google's WebGPU implementation, powering
|
||||||
aurora's Direct3D, Vulkan and OpenGL backends.
|
aurora's Direct3D, Vulkan and OpenGL backends.
|
||||||
|
- **[OpenXR](https://www.khronos.org/openxr/)** - the Khronos cross-platform API used by the
|
||||||
|
experimental VR renderer.
|
||||||
- **[Dolphin Emulator](https://github.com/dolphin-emu/dolphin)** - an invaluable reference for Wii
|
- **[Dolphin Emulator](https://github.com/dolphin-emu/dolphin)** - an invaluable reference for Wii
|
||||||
hardware behavior during development, plus the source of the free DSP coefficient ROM and the
|
hardware behavior during development, plus the source of the free DSP coefficient ROM and the
|
||||||
unmodified default WiiConnect24 bootstrap tree bundled with the runtime.
|
unmodified default WiiConnect24 bootstrap tree bundled with the runtime.
|
||||||
|
|||||||
@@ -141,6 +141,7 @@ included in the installer's `licenses/` folder.
|
|||||||
| SQLite | 3.51.3 amalgamation | Public domain | <https://sqlite.org/> |
|
| SQLite | 3.51.3 amalgamation | Public domain | <https://sqlite.org/> |
|
||||||
| Tracy Profiler | pinned commit | BSD-3-Clause | <https://github.com/wolfpld/tracy> |
|
| Tracy Profiler | pinned commit | BSD-3-Clause | <https://github.com/wolfpld/tracy> |
|
||||||
| C++/WinRT | - | MIT (Microsoft) | <https://github.com/microsoft/cppwinrt> |
|
| C++/WinRT | - | MIT (Microsoft) | <https://github.com/microsoft/cppwinrt> |
|
||||||
|
| OpenXR-SDK | 1.1.61 | Apache-2.0 | <https://github.com/KhronosGroup/OpenXR-SDK> |
|
||||||
| nodtool (disc image extraction) | v2.0.0-alpha.10 | MIT OR Apache-2.0 | <https://github.com/encounter/nod> |
|
| nodtool (disc image extraction) | v2.0.0-alpha.10 | MIT OR Apache-2.0 | <https://github.com/encounter/nod> |
|
||||||
|
|
||||||
### Dual-licensed components - elections made by this project
|
### Dual-licensed components - elections made by this project
|
||||||
|
|||||||
Reference in new issue
Block a user