mirror of
https://github.com/spoopyghosty0/frameport.git
synced 2026-10-25 21:01:47 +01:00
Compare commits
8
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
63ad73a485 | ||
|
|
4d40b1c5bb | ||
|
|
87e34bd9ef | ||
|
|
af142439ba | ||
|
|
6988d54d5c | ||
|
|
1eb7f655ba | ||
|
|
fe8b106560 | ||
|
|
a8ab024b26 |
No files matched your search
@@ -14,11 +14,11 @@ e63d93e086df3b7b29501188b80fb113879e2fd325d7659f68a31ac5bc87b561 ./arm64-v8a/li
|
||||
4a13a33e112c9e4e3c5ff4337ed6e988a9e5b3602f48d654df148ef5fafbf426 ./arm64-v8a/libfpglmv.so
|
||||
36400eae4ba3807bcfcd54463daa217347032b07218792faa448d8cbbd086a0e ./arm64-v8a/libframe_xrshim.so
|
||||
19ba5ed3c4b780f5ae46251f6958f552acfc5f13c8bb39f995579593fa8990c6 ./arm64-v8a/libglshim.so
|
||||
dc8b8dd017934077ad181da0cd08b03581561822b189b580faa2b495e20eec7d ./arm64-v8a/libopenxr_loader_generic.so
|
||||
be863bb0001bc60e9bbd691753f5c5968664ae7917b29258dd15b7a9dd1c3ade ./arm64-v8a/libopenxr_loader_generic.so
|
||||
1feaeafad467c4cafdf2b018a4d84b0bee200c3f711697b4ce97e66a3ba256ca ./arm64-v8a/libovrplatformcompat.so
|
||||
c7a14d34e4ddf20ec943641f6431525867d6f030cd01160df1b24afd441af39f ./arm64-v8a/libvrapi.so
|
||||
c7a14d34e4ddf20ec943641f6431525867d6f030cd01160df1b24afd441af39f ./arm64-v8a/libvrapi_foveation.so
|
||||
200525569cd37551e606be93fc76e8ac41e9516b3ffa922a3d4ebe40ba6a3824 ./armeabi-v7a/libopenxr_loader_generic.so
|
||||
2f978a24bc78a33a4162f5d35ec13d722a5a965a67772bd6128cbd6f8b0b4b17 ./armeabi-v7a/libopenxr_loader_generic.so
|
||||
6fd59e6c6e533c0a17204e4f12adaf992ffa6cf58d6280aa9b37ca7ba20299d4 ./dex/browser-handoff.dex
|
||||
1871eae093432d277da4bc751bf5f3269dfcf11f9168260b0c3caadb0dedb19d ./dex/oculusos-stubs.dex
|
||||
b634ab5640e258563c536e658cad87080553df6f34f62269a21d554844e58bfe ./hevc/COPYING.FFmpeg
|
||||
@@ -27,10 +27,10 @@ b634ab5640e258563c536e658cad87080553df6f34f62269a21d554844e58bfe ./hevc/COPYING
|
||||
46c3dcad2c43cc30bea3b3680b362ed84a99c15d60714bbbbb422c80ecf90405 ./hevc/media_codecs_frameport.xml
|
||||
529ea35d5d82474afe9e09ad1216d269317f56dd24a05fb100fced52b7b4dbca ./hevc/podman.py.txt
|
||||
6cda3076a8c09b31bb1f90da614ea89e7ee194589626eeac613e522849604e47 ./licenses/LuaJIT.txt
|
||||
2cc16b90abcd3d359f1658c581172bd650017bf2725e24268915f50904c000ec ./linux-arm64-bin/fp_roomscan
|
||||
b10b3a5c10c3339fc63fd9f6cb4d01ea29be11a863d0ebad1389ea69fd471940 ./linux-arm64-bin/fp_venc
|
||||
1aa733117cf57ccff7cf23f0425dbfd73b0332a3ef1c905ceeca0ccd0449c4e0 ./linux-arm64/XR_APILAYER_FRAMEPORT_timefix.json
|
||||
28c2430a02bbd8902c5bfb9562c6fd0e318654f9e05c095bfeb94b0450ab1b07 ./linux-arm64/libxr_frameport_timefix.so
|
||||
2cc16b90abcd3d359f1658c581172bd650017bf2725e24268915f50904c000ec ./linux-arm64-bin/fp_roomscan
|
||||
b10b3a5c10c3339fc63fd9f6cb4d01ea29be11a863d0ebad1389ea69fd471940 ./linux-arm64-bin/fp_venc
|
||||
00c2dead0fd7497929833467f0e55699d57d26be1b85dce35402993852f7b111 ./roomscan/ceiling.png
|
||||
c1962de31ed2810d31c760cf9ee63316ac2b8c9528ccbcd9299ebf5ba39b2995 ./roomscan/done.png
|
||||
0dfaea4c68979b0a45a9fef06fdf1a92468ffc8f46f80a3a014fce1d805972d5 ./roomscan/failed.png
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,19 @@
|
||||
package: com.Oculus.FirstContact
|
||||
title: First Contact
|
||||
status: works
|
||||
notes: '32-bit only, runs through FramePort''s 32-bit bridge (experimental). Played in the headset
|
||||
(GitHub #489); the headless launch test ends early, which is expected for the bridge.'
|
||||
tested_version: '1.12'
|
||||
engine: Unreal
|
||||
xr: VrApi
|
||||
frame:
|
||||
- frame.a32_bridge
|
||||
verified:
|
||||
date: '2026-10-25'
|
||||
known_good_sha256: 7b971d70af24ec554994e59f65b2568c5b86a94df04e962699051f267d6358b7
|
||||
app: 1.3.0
|
||||
overport_cli: 1.2.5
|
||||
frame_build: '20261022.6153909'
|
||||
agent: 109
|
||||
issue: 489
|
||||
source_hint: com.Oculus.FirstContact
|
||||
@@ -9,9 +9,9 @@ notes: 'FrameBridge turns its upside-down UI panels upright (flip emulation, in
|
||||
login may not work. frame.unity_text_input added from detection (not headset-verified); no device.text_input_window:
|
||||
its Android window took the controllers'' input (owner, 2026-10-23).
|
||||
|
||||
Keeps the Quest 2 headset identity for now: as a Quest 3 it switches to larger eye images after the intro, which
|
||||
the Frame''s swapchain limit refused (GitHub #424). With the Vulkan panel pool (swapchain_pool) it runs as a Quest
|
||||
3 (checked headless 2026-10-23); the Quest 3 identity comes back with the FramePort release that has it.'
|
||||
Runs as a Quest 3 with the Vulkan panel pool (swapchain_pool): as a Quest 3 it switches to larger eye images after
|
||||
the intro, which the Frame''s swapchain limit refused before the pool (GitHub #424; checked headless 2026-10-23,
|
||||
FramePort 1.4.0).'
|
||||
details: Ubisoft online login may not work. Data folder holds raw assets (start0..2, .climb, bundles), not .obb
|
||||
files; install to obb as-is.
|
||||
overport_extra:
|
||||
@@ -19,7 +19,6 @@ overport_extra:
|
||||
frame:
|
||||
- frame.unity_text_input
|
||||
frame_remove:
|
||||
- device.headset_model
|
||||
- device.text_input_window
|
||||
verified:
|
||||
date: '2026-09-28'
|
||||
@@ -28,7 +27,7 @@ verified:
|
||||
known_good_sha256: 89644a12bf8df956fa3d3a9a40540ba9e1fb62f63494714a05c9f05984383ac8
|
||||
no_appsw_90: '2026-10-02, OVRPort 1.2.5 (owner: 90 Hz felt better than 72 Hz; same known issues)'
|
||||
flip_in_place: '2026-10-14, owner in the headset: launch warnings and tutorial pop-ups upright (GitHub #138)'
|
||||
updated: '2026-10-23'
|
||||
min_app: 1.3.0
|
||||
updated: '2026-10-25'
|
||||
min_app: 1.4.0
|
||||
adapter:
|
||||
swapchain_pool: 1
|
||||
@@ -0,0 +1,23 @@
|
||||
package: com.XrealGames.Zc15
|
||||
title: Zero Caliber 2
|
||||
status: works
|
||||
tested_version: 2.0.1173-S-80237
|
||||
engine: Unreal
|
||||
xr: OpenXR
|
||||
alt_overport:
|
||||
- patch_remove_unreal_force_quit
|
||||
frame:
|
||||
- frame.hw_video_decode
|
||||
- frame.unreal_noreserve
|
||||
adapter:
|
||||
haptic_fix: 1
|
||||
fixed_resolution: 1
|
||||
verified:
|
||||
date: '2026-10-25'
|
||||
known_good_sha256: 48a6fc11f64aba9a9ee95863cb601d64ad8b54eba9034d5b05097f5d3ee00b57
|
||||
app: 1.3.0
|
||||
overport_cli: 1.2.5
|
||||
frame_build: '20261022.6153909'
|
||||
agent: 109
|
||||
issue: 492
|
||||
source_hint: Zero Caliber 2
|
||||
@@ -0,0 +1,24 @@
|
||||
package: com.baobab.invasion
|
||||
title: Invasion
|
||||
status: works
|
||||
tested_version: 1.0.250
|
||||
engine: Unity
|
||||
xr: VrApi
|
||||
frame:
|
||||
- frame.unity_oculus_check
|
||||
- frame.unity_text_input
|
||||
- frame.unity_runtime_msaa_off
|
||||
- frame.unity_gl_shim
|
||||
device:
|
||||
- device.text_input_window
|
||||
adapter:
|
||||
haptic_fix: 1
|
||||
verified:
|
||||
date: '2026-10-25'
|
||||
known_good_sha256: 06c8f94556eb8d8d6679e089d2429e70b45148aba7ad0d47c42bd1de932cbdc1
|
||||
app: 1.3.0
|
||||
overport_cli: 1.2.5
|
||||
frame_build: '20261022.6153909'
|
||||
agent: 109
|
||||
issue: 490
|
||||
source_hint: com.baobab.invasion
|
||||
@@ -1,9 +1,9 @@
|
||||
package: com.drbeef.questzdoom
|
||||
title: QuestZDoom
|
||||
status: issues
|
||||
notes: 'Needs a WAD: put it into QuestZDoom/wads in the game''s storage (Files tab) and set QuestZDoom/commandline.txt
|
||||
to "qzdoom -iwad /sdcard/QuestZDoom/wads/<name>.wad". Slowed to a crawl after 5-10 minutes before
|
||||
gl_error_clear (issue 237); not yet confirmed in the headset with it.'
|
||||
status: works
|
||||
notes: 'Needs a WAD: put it into QuestZDoom/wads in the game''s storage (Files tab) and create QuestZDoom/qzdoom.ini
|
||||
with the lines "[IWADSearch.Directories]" and "Path=/sdcard/QuestZDoom/wads" (commandline.txt alone is not
|
||||
enough). Smooth past 15 minutes in the headset with gl_error_clear (issue 237).'
|
||||
details: GZDoom on OpenGL ES with Team Beef's OpenXR code. The game leaves GL_INVALID_ENUM pending every frame; the
|
||||
runtime's GL check failed on it at the first swapchain and its GL interop then created about 100 GPU objects a
|
||||
second that were never freed (8,000 after 75 s headless). Frames slowed down over the minutes, and in a player's
|
||||
@@ -17,7 +17,7 @@ frame:
|
||||
adapter:
|
||||
gl_error_clear: 1
|
||||
verified:
|
||||
date: '2026-10-24'
|
||||
date: '2026-10-25'
|
||||
issue: 237
|
||||
updated: '2026-10-24'
|
||||
updated: '2026-10-25'
|
||||
source_hint: questzdoom-1.6.2
|
||||
@@ -0,0 +1,26 @@
|
||||
package: com.mrf.kluge.SynthRiders
|
||||
title: SynthRiders
|
||||
status: works
|
||||
tested_version: 3.6.7a2
|
||||
engine: Unity
|
||||
xr: OpenXR
|
||||
frame:
|
||||
- frame.meta_permissions
|
||||
- frame.bhaptics_permission
|
||||
- frame.unity_text_input
|
||||
- frame.oculusos
|
||||
device:
|
||||
- device.text_input_window
|
||||
adapter:
|
||||
controller_models: 1
|
||||
haptic_fix: 1
|
||||
scene_emul: 1
|
||||
verified:
|
||||
date: '2026-10-25'
|
||||
known_good_sha256: ef1792f577697c5fa355a61adfc02e9d8a50fe4ddfec0357398bd5867df42f17
|
||||
app: 1.3.1.dev703
|
||||
overport_cli: 1.2.5
|
||||
frame_build: '20261022.6153909'
|
||||
agent: 125
|
||||
issue: 494
|
||||
source_hint: com.mrf.kluge.SynthRiders
|
||||
@@ -0,0 +1,16 @@
|
||||
package: io.port0r.houseofthedead
|
||||
title: 'Port0r: House of the Dead VR'
|
||||
status: works
|
||||
tested_version: 0.1.1
|
||||
engine: Other
|
||||
xr: OpenXR
|
||||
as_is: true
|
||||
verified:
|
||||
date: '2026-10-25'
|
||||
known_good_sha256: 699a25d696df8af8669feee11037a2c1c56f15a8f9359b1f8d17897aa841b197
|
||||
app: 1.3.0
|
||||
overport_cli: 1.2.5
|
||||
frame_build: '20261020.6124238'
|
||||
agent: 109
|
||||
issue: 496
|
||||
source_hint: Port0r-HouseOfTheDeadVR-v0.1.1-quest3
|
||||
@@ -0,0 +1,16 @@
|
||||
package: io.port0r.segarally
|
||||
title: 'Port0r: Rally VR'
|
||||
status: works
|
||||
tested_version: 0.2.6
|
||||
engine: Other
|
||||
xr: OpenXR
|
||||
as_is: true
|
||||
verified:
|
||||
date: '2026-10-25'
|
||||
known_good_sha256: 186018b96550c3881e4659293d07a2fbe6bb7a962798de1dbf6bcba3a99b9025
|
||||
app: 1.3.0
|
||||
overport_cli: 1.2.5
|
||||
frame_build: '20261020.6124238'
|
||||
agent: 109
|
||||
issue: 498
|
||||
source_hint: Port0r-RallyVR-v0.2.6-quest3
|
||||
@@ -0,0 +1,20 @@
|
||||
package: io.port0r.timecrisis
|
||||
title: 'Port0r: Time Crisis VR'
|
||||
status: issues
|
||||
notes: Immersive mode shows a black screen (only the arm and gun); the flat and 3D screen modes work
|
||||
(game menu, setup button).
|
||||
tested_version: 0.2.2
|
||||
engine: Other
|
||||
xr: OpenXR
|
||||
adapter:
|
||||
refresh_rate: 90.0
|
||||
as_is: true
|
||||
verified:
|
||||
date: '2026-10-25'
|
||||
known_good_sha256: 4208f5bf16ecc2cfcf3fbb6cb5abf2d632eeffdc3a74115c0b03e861c1bdee43
|
||||
app: 1.3.0
|
||||
overport_cli: 1.2.5
|
||||
frame_build: '20261020.6124238'
|
||||
agent: 109
|
||||
issue: 497
|
||||
source_hint: Port0r-TimeCrisisVR-v0.2.2-quest3
|
||||
@@ -0,0 +1,18 @@
|
||||
package: io.port0r.timecrisis2
|
||||
title: 'Port0r: Time Crisis II VR'
|
||||
status: issues
|
||||
notes: Gameplay runs well; cut scenes and the title and game-selection screens after inserting coins
|
||||
don't display properly.
|
||||
tested_version: 0.1.0
|
||||
engine: Other
|
||||
xr: OpenXR
|
||||
as_is: true
|
||||
verified:
|
||||
date: '2026-10-25'
|
||||
known_good_sha256: 3277d77f81fc6ec7e686d2bd74050234dbfb4c90bf3009a1feb027147372aecb
|
||||
app: 1.3.0
|
||||
overport_cli: 1.2.5
|
||||
frame_build: '20261020.6124238'
|
||||
agent: 109
|
||||
issue: 495
|
||||
source_hint: Port0r-TimeCrisisIIVR-v0.1.0-quest3
|
||||
@@ -0,0 +1,16 @@
|
||||
package: io.port0r.virtuacop
|
||||
title: 'Port0r: Cop VR'
|
||||
status: works
|
||||
tested_version: 0.2.2
|
||||
engine: Other
|
||||
xr: OpenXR
|
||||
as_is: true
|
||||
verified:
|
||||
date: '2026-10-25'
|
||||
known_good_sha256: 67e0e5676054b8c7a05d9e835d312d29716437e2166c2ce558b6b9b1782286bf
|
||||
app: 1.3.0
|
||||
overport_cli: 1.2.5
|
||||
frame_build: '20261020.6124238'
|
||||
agent: 109
|
||||
issue: 493
|
||||
source_hint: Port0r-CopVR-v0.2.1-quest3
|
||||
@@ -179,6 +179,13 @@ signatures:
|
||||
severity: fatal
|
||||
diagnosis: The app closed at start because it can't find classes from one of Android's optional libraries (for example org.apache.http.legacy in YouTube VR). The Frame's Android has the library, but OVRPort removed the app's request for it from the manifest; "Keep Android's shared libraries the app uses" puts it back. Turn it on and rebuild the game ("Update on Frame").
|
||||
suggest: [frame.keep_system_libraries]
|
||||
- id: refresh-rate-refused
|
||||
# GitHub #336 (OutRun): the game quits when its xrRequestDisplayRefreshRateFB is refused; FrameBridge now answers
|
||||
# success, so the game's own error line only shows in older builds
|
||||
pattern: 'request display Hz: -1000101000'
|
||||
severity: error
|
||||
diagnosis: The game asked for a refresh rate the Frame's runtime refuses and may quit on that error. A newer FramePort keeps the current rate instead; press Update on Frame. Setting Game settings → Refresh rate to 90 Hz also avoids the error.
|
||||
suggest: [adapter.refresh_rate=90]
|
||||
- id: hybrid-feature-missing
|
||||
# GitHub #484 (YouTube VR): a Horizon OS hybrid app checks for the system feature oculus.software.vr.app.hybrid
|
||||
# before it leaves its 2D panel for VR
|
||||
|
||||
+11
-1
@@ -63,6 +63,7 @@ Generated from [catalog/games](../catalog/games) by `scripts/compat_list.py`.
|
||||
| Epic Roller Coasters | Quest | ✅ Works | |
|
||||
| Espire 2 | Quest | ✅ Works | |
|
||||
| Eye of the Temple | Quest | ✅ Works | |
|
||||
| First Contact | Quest | ✅ Works | |
|
||||
| FrenzyVR | Quest | ✅ Works | |
|
||||
| Fruit Ninja | Quest | ✅ Works | |
|
||||
| Fruit Salon | Quest | ✅ Works | |
|
||||
@@ -74,12 +75,14 @@ Generated from [catalog/games](../catalog/games) by `scripts/compat_list.py`.
|
||||
| Gunjack | Quest | ✅ Works | |
|
||||
| H.U.N.T | Quest | ✅ Works | |
|
||||
| Hitstream | Quest | ✅ Works | |
|
||||
| Hungry Shark Evolution | Quest | ✅ Works | |
|
||||
| I Am Cat | Quest | ✅ Works | |
|
||||
| I Am Monkey | Quest | ✅ Works | |
|
||||
| I Expect You To Die 2 | Quest | ✅ Works | |
|
||||
| IEYTD3 | Quest | ✅ Works | |
|
||||
| In Death: Unchained | Quest | ✅ Works | |
|
||||
| Into The Radius 2 | Quest | ✅ Works | |
|
||||
| Invasion | Quest | ✅ Works | |
|
||||
| Job Simulator | Quest | ✅ Works | |
|
||||
| Journey of the Gods | Quest | ✅ Works | |
|
||||
| Jurassic World Aftermath Collection | Quest | ✅ Works | |
|
||||
@@ -119,9 +122,13 @@ Generated from [catalog/games](../catalog/games) by `scripts/compat_list.py`.
|
||||
| Pistol Whip | Quest | ✅ Works | |
|
||||
| Pistol Whip | PC VR | ✅ Works | |
|
||||
| Please Don't Touch Anything | Quest | ✅ Works | |
|
||||
| Port0r: Cop VR | Quest | ✅ Works | |
|
||||
| Port0r: House of the Dead VR | Quest | ✅ Works | |
|
||||
| Port0r: Rally VR | Quest | ✅ Works | |
|
||||
| PowerWash Simulator VR | Quest | ✅ Works | |
|
||||
| Punch Fit | Quest | ✅ Works | |
|
||||
| QuestCraft | Quest | ✅ Works | |
|
||||
| QuestZDoom | Quest | ✅ Works | |
|
||||
| Racket: Nx | Quest | ✅ Works | |
|
||||
| RacketPinball | Quest | ✅ Works | |
|
||||
| RC Pilot Trainer | Quest | ✅ Works | |
|
||||
@@ -157,6 +164,7 @@ Generated from [catalog/games](../catalog/games) by `scripts/compat_list.py`.
|
||||
| Survival Nation | Quest | ✅ Works | |
|
||||
| Surviving Mars: Pioneer | Quest | ✅ Works | |
|
||||
| SynthRiders | Quest | ✅ Works | |
|
||||
| SynthRiders | Quest | ✅ Works | |
|
||||
| Table Troopers | Quest | ✅ Works | |
|
||||
| Taskmaster | Quest | ✅ Works | |
|
||||
| Tea For God | Quest | ✅ Works | |
|
||||
@@ -192,6 +200,7 @@ Generated from [catalog/games](../catalog/games) by `scripts/compat_list.py`.
|
||||
| Wallace & Gromit in The Grand Getaway | Quest | ✅ Works | |
|
||||
| Waltz of the Wizard: Extended Edition | Quest | ✅ Works | |
|
||||
| Wander | Quest | ✅ Works | |
|
||||
| Zero Caliber 2 | Quest | ✅ Works | |
|
||||
| ZombielandVR | Quest | ✅ Works | |
|
||||
| AFFECTED: The Manor | Quest | ⚠️ Works with issues | Gear VR game (32-bit only), runs through FramePort's 32-bit bridge (experimental). |
|
||||
| Ancient_Dungeon | Quest | ⚠️ Works with issues | Multiplayer isn't available (offline). |
|
||||
@@ -216,10 +225,11 @@ Generated from [catalog/games](../catalog/games) by `scripts/compat_list.py`.
|
||||
| Phantom: Covert Ops | Quest | ⚠️ Works with issues | DLC/store button crashes (no Meta store). |
|
||||
| Pinball FX VR | Quest | ⚠️ Works with issues | Plays; space warp off (fewer stutters). |
|
||||
| Plezy | Quest | ⚠️ Works with issues | Some videos play with strong artifacts and wrong colours; the cause is unknown, possibly hardware video decoding. |
|
||||
| Port0r: Time Crisis II VR | Quest | ⚠️ Works with issues | Gameplay runs well; cut scenes and the title and game-selection screens after inserting coins don't display properly. |
|
||||
| Port0r: Time Crisis VR | Quest | ⚠️ Works with issues | Immersive mode shows a black screen (only the arm and gun); the flat and 3D screen modes work (game menu, setup button). |
|
||||
| PrimedGun v2 | Quest | ⚠️ Works with issues | Vulkan via a statically linked Khronos OpenXR loader, which bypasses FrameBridge (the picture jumps). |
|
||||
| Puzzling Places | Quest | ⚠️ Works with issues | Works fine, but pointers dont show well on main menu, easy to work around. |
|
||||
| Quantum Void | Quest | ⚠️ Works with issues | no hands |
|
||||
| QuestZDoom | Quest | ⚠️ Works with issues | Needs a WAD: put it into QuestZDoom/wads in the game's storage (Files tab) and set QuestZDoom/commandline.txt to "qzdoom -iwad /sdcard/QuestZDoom/wads/<name>… |
|
||||
| Ragnarock | Quest | ⚠️ Works with issues | |
|
||||
| Real VR Fishing | Quest | ⚠️ Works with issues | Seems to be almost 100% functional with meta permissions enabled. |
|
||||
| Silhouette | Quest | ⚠️ Works with issues | Hand-tracking game; the Frame synthesizes hands from controllers, so it is janky. |
|
||||
|
||||
+32
-29
@@ -39,18 +39,18 @@ Link to an entry with its id, dots replaced by dashes: `PATCHES.md#frame-unity_t
|
||||
| [Patch Oculus detection for Unity](#patch_oculus_unity) | `patch_oculus_unity` | Patches from OVRPort | default |
|
||||
| [Patch Oculus detection for Unreal](#patch_oculus_unreal) | `patch_oculus_unreal` | Patches from OVRPort | default |
|
||||
| [Remove localized app names](#patch_remove_localized_names) | `patch_remove_localized_names` | Patches from OVRPort | default |
|
||||
| [Remove Unreal's ForceQuit](#patch_remove_unreal_force_quit) | `patch_remove_unreal_force_quit` | Patches from OVRPort | 49 |
|
||||
| [Remove Unreal's ForceQuit](#patch_remove_unreal_force_quit) | `patch_remove_unreal_force_quit` | Patches from OVRPort | 50 |
|
||||
| [Remove uses-library](#patch_remove_uses_library) | `patch_remove_uses_library` | Patches from OVRPort | default |
|
||||
| [Remove VrApi library](#patch_remove_vrapi) | `patch_remove_vrapi` | Patches from OVRPort | |
|
||||
| [Replace application label and icon](#patch_replace_icon_label) | `patch_replace_icon_label` | Patches from OVRPort | default |
|
||||
| [Pico/YVR/Quest metadata](#patch_vr_metadata) | `patch_vr_metadata` | Patches from OVRPort | default |
|
||||
| [VrApi → OpenXR adapter (OVRPort)](#patch_vrapi_openxr) | `patch_vrapi_openxr` | Patches from OVRPort | |
|
||||
| [32-bit ARM bridge (Gear VR / Go games)](#frame-a32_bridge) | `frame.a32_bridge` | Steam Frame patches | 6 |
|
||||
| [32-bit ARM bridge (Gear VR / Go games)](#frame-a32_bridge) | `frame.a32_bridge` | Steam Frame patches | 7 |
|
||||
| [FrameBridge OpenXR adapter](#frame-adapter) | `frame.adapter` | Steam Frame patches | default |
|
||||
| [Content files from the game's data](#frame-asset_files) | `frame.asset_files` | Steam Frame patches | 2 |
|
||||
| [Asset-file service bypass](#frame-asset_files_stub) | `frame.asset_files_stub` | Steam Frame patches | |
|
||||
| [Skip Meta avatars](#frame-avatar_stub) | `frame.avatar_stub` | Steam Frame patches | 1 |
|
||||
| [bHaptics: skip the Bluetooth permission request](#frame-bhaptics_permission) | `frame.bhaptics_permission` | Steam Frame patches | 11 |
|
||||
| [bHaptics: skip the Bluetooth permission request](#frame-bhaptics_permission) | `frame.bhaptics_permission` | Steam Frame patches | 12 |
|
||||
| [BlazeRush: controllers without Meta avatars, own shader cache](#frame-blazerush) | `frame.blazerush` | Steam Frame patches | 1 |
|
||||
| [Browser for sign-ins: open pages in Steam's browser](#frame-browser_handoff) | `frame.browser_handoff` | Steam Frame patches | |
|
||||
| [Cortopia games: don't wait for Meta's org-scoped id](#frame-cortopia_org_id) | `frame.cortopia_org_id` | Steam Frame patches | 1 |
|
||||
@@ -60,7 +60,7 @@ Link to an entry with its id, dots replaced by dashes: `PATCHES.md#frame-unity_t
|
||||
| [GL shim (Mesa GLSL compatibility)](#frame-gl_shim) | `frame.gl_shim` | Steam Frame patches | 2 |
|
||||
| [Play services: Android 11 version checks](#frame-gms_platform_version) | `frame.gms_platform_version` | Steam Frame patches | 2 |
|
||||
| [Godot apps: start without a clipboard service](#frame-godot_clipboard) | `frame.godot_clipboard` | Steam Frame patches | 1 |
|
||||
| [Hardware video decoding (H.264, HEVC, VP9)](#frame-hw_video_decode) | `frame.hw_video_decode` | Steam Frame patches | 42 |
|
||||
| [Hardware video decoding (H.264, HEVC, VP9)](#frame-hw_video_decode) | `frame.hw_video_decode` | Steam Frame patches | 43 |
|
||||
| [Just Dance VR: keep progress in the local save](#frame-justdance_local_save) | `frame.justdance_local_save` | Steam Frame patches | |
|
||||
| [Keep Android's shared libraries the app uses](#frame-keep_system_libraries) | `frame.keep_system_libraries` | Steam Frame patches | default |
|
||||
| [Language packs from the game's files](#frame-langpacks) | `frame.langpacks` | Steam Frame patches | |
|
||||
@@ -69,7 +69,7 @@ Link to an entry with its id, dots replaced by dashes: `PATCHES.md#frame-unity_t
|
||||
| [Fix Lua startup crashes on Frame](#frame-luajit_pointers) | `frame.luajit_pointers` | Steam Frame patches | 1 |
|
||||
| [Start the game in the app's main process](#frame-main_process) | `frame.main_process` | Steam Frame patches | default |
|
||||
| [Unity: disable Meta depth occlusion](#frame-meta_depth_occlusion) | `frame.meta_depth_occlusion` | Steam Frame patches | 1 |
|
||||
| [Declare Meta-only permissions](#frame-meta_permissions) | `frame.meta_permissions` | Steam Frame patches | 9 |
|
||||
| [Declare Meta-only permissions](#frame-meta_permissions) | `frame.meta_permissions` | Steam Frame patches | 10 |
|
||||
| [Meta XR Audio: skip Quest telemetry class](#frame-metaxr_telemetry) | `frame.metaxr_telemetry` | Steam Frame patches | default |
|
||||
| [Clear android:debuggable](#frame-nodebug) | `frame.nodebug` | Steam Frame patches | 3 |
|
||||
| [Oculus OS telemetry class stubs](#frame-oculusos) | `frame.oculusos` | Steam Frame patches | 18 |
|
||||
@@ -89,19 +89,19 @@ Link to an entry with its id, dots replaced by dashes: `PATCHES.md#frame-unity_t
|
||||
| [Allow swapchains larger than 4096 px](#frame-swapchain_limit) | `frame.swapchain_limit` | Steam Frame patches | default |
|
||||
| [Team Beef ports: treat the Frame as a Meta headset](#frame-tbxr_vendor) | `frame.tbxr_vendor` | Steam Frame patches | 3 |
|
||||
| [Unity App UI: no Android 12 vibrator](#frame-unity_appui_vibrator) | `frame.unity_appui_vibrator` | Steam Frame patches | |
|
||||
| [GL shim for Unity (no multisampled render-to-texture)](#frame-unity_gl_shim) | `frame.unity_gl_shim` | Steam Frame patches | 27 |
|
||||
| [GL shim for Unity (no multisampled render-to-texture)](#frame-unity_gl_shim) | `frame.unity_gl_shim` | Steam Frame patches | 28 |
|
||||
| [Unity: render each eye separately (no multiview)](#frame-unity_multipass) | `frame.unity_multipass` | Steam Frame patches | 2 |
|
||||
| [Unity: disable MSAA](#frame-unity_no_msaa) | `frame.unity_no_msaa` | Steam Frame patches | 11 |
|
||||
| [Unity: skip OVROverlay layers (fades, splash screens)](#frame-unity_no_overlay_copy) | `frame.unity_no_overlay_copy` | Steam Frame patches | 2 |
|
||||
| [Unity: start VR without Meta's system apps](#frame-unity_oculus_check) | `frame.unity_oculus_check` | Steam Frame patches | 14 |
|
||||
| [Unity: keep MSAA off at runtime (OVRManager)](#frame-unity_runtime_msaa_off) | `frame.unity_runtime_msaa_off` | Steam Frame patches | 33 |
|
||||
| [Unity: start VR without Meta's system apps](#frame-unity_oculus_check) | `frame.unity_oculus_check` | Steam Frame patches | 15 |
|
||||
| [Unity: keep MSAA off at runtime (OVRManager)](#frame-unity_runtime_msaa_off) | `frame.unity_runtime_msaa_off` | Steam Frame patches | 34 |
|
||||
| [Unity: skip Meta's player-in-room check](#frame-unity_scene_active_rooms) | `frame.unity_scene_active_rooms` | Steam Frame patches | 1 |
|
||||
| [Make Unity text fields work](#frame-unity_text_input) | `frame.unity_text_input` | Steam Frame patches | 135 |
|
||||
| [Make Unity text fields work](#frame-unity_text_input) | `frame.unity_text_input` | Steam Frame patches | 136 |
|
||||
| [Unity: share thread keys (games that run out of them)](#frame-unity_tls_key_pool) | `frame.unity_tls_key_pool` | Steam Frame patches | 1 |
|
||||
| [Unity: headset always counts as worn](#frame-unity_user_presence) | `frame.unity_user_presence` | Steam Frame patches | 1 |
|
||||
| [GL shim for Unreal (no multisampled render-to-texture)](#frame-unreal_gl_shim) | `frame.unreal_gl_shim` | Steam Frame patches | 1 |
|
||||
| [Unreal: match multiview depth to the eye size](#frame-unreal_multiview_depth) | `frame.unreal_multiview_depth` | Steam Frame patches | 1 |
|
||||
| [Unreal: reserve memory like on Quest](#frame-unreal_noreserve) | `frame.unreal_noreserve` | Steam Frame patches | |
|
||||
| [Unreal: reserve memory like on Quest](#frame-unreal_noreserve) | `frame.unreal_noreserve` | Steam Frame patches | 1 |
|
||||
| [Unreal: stand-ins for OVRPlugin functions OVRPort lacks](#frame-unreal_ovrp_entrypoints) | `frame.unreal_ovrp_entrypoints` | Steam Frame patches | 6 |
|
||||
| [Unreal: Quest controller bindings (RPOC key map)](#frame-unreal_quest_keymap) | `frame.unreal_quest_keymap` | Steam Frame patches | 3 |
|
||||
| [Unreal: don't wait for the Quest shader precompile](#frame-unreal_quest_precompile) | `frame.unreal_quest_precompile` | Steam Frame patches | 3 |
|
||||
@@ -135,7 +135,7 @@ Link to an entry with its id, dots replaced by dashes: `PATCHES.md#frame-unity_t
|
||||
| [Per-eye diagnostics (log)](#adapter-eye_debug) | `adapter.eye_debug` | Game settings | |
|
||||
| [Draw fades over the picture](#adapter-fade_quad) | `adapter.fade_quad` | Game settings | 2 |
|
||||
| [Colour space support](#adapter-fb_color_space) | `adapter.fb_color_space` | Game settings | 1 |
|
||||
| [Keep full resolution (no dynamic resolution)](#adapter-fixed_resolution) | `adapter.fixed_resolution` | Game settings | 1 |
|
||||
| [Keep full resolution (no dynamic resolution)](#adapter-fixed_resolution) | `adapter.fixed_resolution` | Game settings | 2 |
|
||||
| [Upside-down panel images (diagnostics)](#adapter-flip_dump) | `adapter.flip_dump` | Game settings | |
|
||||
| [Fix upside-down menus](#adapter-flip_emul) | `adapter.flip_emul` | Game settings | |
|
||||
| [Rotate panels 180°](#adapter-flip_quads) | `adapter.flip_quads` | Game settings | |
|
||||
@@ -148,7 +148,7 @@ Link to an entry with its id, dots replaced by dashes: `PATCHES.md#frame-unity_t
|
||||
| [GL shim: high-precision vertex shaders](#adapter-gl_highp_markers) | `adapter.gl_highp_markers` | Game settings | 1 |
|
||||
| [GL shim: integer vertex inputs](#adapter-gl_int_attribs) | `adapter.gl_int_attribs` | Game settings | 1 |
|
||||
| [Flat panel diagnostics (log)](#adapter-gl_mv_debug) | `adapter.gl_mv_debug` | Game settings | |
|
||||
| [Fix freezes when controllers vibrate](#adapter-haptic_fix) | `adapter.haptic_fix` | Game settings | 120 |
|
||||
| [Fix freezes when controllers vibrate](#adapter-haptic_fix) | `adapter.haptic_fix` | Game settings | 122 |
|
||||
| [Vibration strength](#adapter-haptic_scale) | `adapter.haptic_scale` | Game settings | |
|
||||
| [Turn off Quest Vulkan foveation](#adapter-hide_fb_foveation) | `adapter.hide_fb_foveation` | Game settings | |
|
||||
| [Turn off space warp](#adapter-hide_space_warp) | `adapter.hide_space_warp` | Game settings | 5 |
|
||||
@@ -166,12 +166,12 @@ Link to an entry with its id, dots replaced by dashes: `PATCHES.md#frame-unity_t
|
||||
| [Animate fingers from touch](#adapter-proximity_emul) | `adapter.proximity_emul` | Game settings | |
|
||||
| [Controller buttons](#adapter-quest_buttons) | `adapter.quest_buttons` | Game settings | |
|
||||
| [Keep pictures in bounds](#adapter-rect_clamp) | `adapter.rect_clamp` | Game settings | |
|
||||
| [Refresh rate](#adapter-refresh_rate) | `adapter.refresh_rate` | Game settings | 5 |
|
||||
| [Refresh rate](#adapter-refresh_rate) | `adapter.refresh_rate` | Game settings | 6 |
|
||||
| [Wait for the game's GPU](#adapter-release_wait) | `adapter.release_wait` | Game settings | |
|
||||
| [Re-create play space](#adapter-respace_kick) | `adapter.respace_kick` | Game settings | |
|
||||
| [Render resolution (supersampling)](#adapter-scale) | `adapter.scale` | Game settings | 18 |
|
||||
| [Room depth](#adapter-scene_depth) | `adapter.scene_depth` | Game settings | |
|
||||
| [Use room layout](#adapter-scene_emul) | `adapter.scene_emul` | Game settings | 20 |
|
||||
| [Use room layout](#adapter-scene_emul) | `adapter.scene_emul` | Game settings | 21 |
|
||||
| [Room height](#adapter-scene_height) | `adapter.scene_height` | Game settings | |
|
||||
| [Hide play-area size](#adapter-scene_hide_bounds) | `adapter.scene_hide_bounds` | Game settings | 1 |
|
||||
| [Scan when requested](#adapter-scene_scan_request) | `adapter.scene_scan_request` | Game settings | |
|
||||
@@ -209,7 +209,7 @@ Link to an entry with its id, dots replaced by dashes: `PATCHES.md#frame-unity_t
|
||||
| [Extra Lepton settings](#device-lepton_env) | `device.lepton_env` | Files and settings on the Frame | 3 |
|
||||
| [Share a folder with another game](#device-shared_folder) | `device.shared_folder` | Files and settings on the Frame | |
|
||||
| [Controllers as a gamepad (Steam Input)](#device-steam_gamepad) | `device.steam_gamepad` | Files and settings on the Frame | |
|
||||
| [Show the app's Android window (for typing)](#device-text_input_window) | `device.text_input_window` | Files and settings on the Frame | 134 |
|
||||
| [Show the app's Android window (for typing)](#device-text_input_window) | `device.text_input_window` | Files and settings on the Frame | 135 |
|
||||
| [Launch options (SteamVR or OpenXR)](#pcvr-launch_args) | `pcvr.launch_args` | PC VR (Proton and Revive) | 2 |
|
||||
| [Provide the Oculus runtime from Revive (Frame)](#pcvr-libovr_redirect) | `pcvr.libovr_redirect` | PC VR (Proton and Revive) | |
|
||||
| [No Unreal crash reporter](#pcvr-no_crash_reporter) | `pcvr.no_crash_reporter` | PC VR (Proton and Revive) | |
|
||||
@@ -454,7 +454,7 @@ Stops some Unreal games from closing themselves right after starting.
|
||||
- `patch_remove_unreal_force_quit`
|
||||
- **Changes:** Changes the APK (during the OVRPort conversion).
|
||||
- **Offered (off):** Built as the alternate APK for Unreal games (use it if the game quits itself).
|
||||
- **Catalog games (49):** Asgard's Wrath 2, BARTENDER VR SIMULATOR, Breathedge VR, Carve Snowboarding, Creed, Dance Central, Darksword, Espire 1: VR Operative (Quest Edition) and 41 more.
|
||||
- **Catalog games (50):** Asgard's Wrath 2, BARTENDER VR SIMULATOR, Breathedge VR, Carve Snowboarding, Creed, Dance Central, Darksword, Espire 1: VR Operative (Quest Edition) and 42 more.
|
||||
- **Suggested by launch-test signatures:**
|
||||
- `force-quit` (error): The game quit itself right after starting.
|
||||
- **Source:** [patches/overport.py](../src/frameport/patches/overport.py)
|
||||
@@ -529,7 +529,7 @@ Runs a 32-bit game (Gear VR, Oculus Go, early Quest) on the Frame, which only ru
|
||||
- `frame.a32_bridge` · experimental · also for 2D apps
|
||||
- **Changes:** Changes the APK (a rebuild and reinstall apply it).
|
||||
- **Suggested (on):** 32-bit-only game: the Frame can't run 32-bit ARM code, the bridge translates it.
|
||||
- **Catalog games (6):** AFFECTED: The Manor, Gunjack, Journey of the Gods, Shadow Point, Sports Scramble (Santa Cruz), Spunky Dungeon.
|
||||
- **Catalog games (7):** AFFECTED: The Manor, First Contact, Gunjack, Journey of the Gods, Shadow Point, Sports Scramble (Santa Cruz), Spunky Dungeon.
|
||||
- **Suggested by launch-test signatures:**
|
||||
- `a32-jit-overflow` (fatal): The 32-bit bridge's translator stopped the game on a long run of instructions it hands to its interpreter, for example OpenSSL's ARMv8 SHA-1 code in Pinball FX2 VR.
|
||||
- `a32-video-ndk` (error): A 32-bit game on the bridge can't play its videos through Unity's video player (Ghost Giant's intro stays black).
|
||||
@@ -602,7 +602,7 @@ Stops bHaptics from asking for a Bluetooth permission the Frame doesn't have (th
|
||||
- `frame.bhaptics_permission` · also for 2D apps
|
||||
- **Changes:** Changes the APK (a rebuild and reinstall apply it).
|
||||
- **Suggested (on):** bHaptics asks for an Android 12 Bluetooth permission at start; the permission screen interrupts the game on the Frame.
|
||||
- **Catalog games (11):** Darksword, Deisim, Epic Roller Coasters, Eternal Starlight, Quantum Void, Ragnarock, Smash Drums, Tea For God and 3 more.
|
||||
- **Catalog games (12):** Darksword, Deisim, Epic Roller Coasters, Eternal Starlight, Quantum Void, Ragnarock, Smash Drums, SynthRiders and 4 more.
|
||||
- **Suggested by launch-test signatures:**
|
||||
- `bhaptics-permission-prompt` (error): The game asked for Android 12's Bluetooth permission (bHaptics' vest SDK, for example Yupitergrad).
|
||||
- **Source:** [patches/frame/bhaptics_permission.py](../src/frameport/patches/frame/bhaptics_permission.py)
|
||||
@@ -736,7 +736,7 @@ Plays the game's videos on the Frame's video hardware, so 4K and 8K video runs s
|
||||
- `frame.hw_video_decode` · also for 2D apps
|
||||
- **Changes:** Install only: written on the Frame when the game is installed; the APK isn't changed.
|
||||
- **Suggested (on):** The game plays video through Android's decoders (MediaCodec, ExoPlayer or VLC): decode it on the Frame's hardware.
|
||||
- **Catalog games (42):** 4XVR Video Player, AugmentedEmpire, Batman: Arkham Shadow, Battlemarked, BattleTalent, Breathedge VR, Dance Central, Darksword and 34 more.
|
||||
- **Catalog games (43):** 4XVR Video Player, AugmentedEmpire, Batman: Arkham Shadow, Battlemarked, BattleTalent, Breathedge VR, Dance Central, Darksword and 35 more.
|
||||
- **Source:** [patches/frame/hw_video_decode.py](../src/frameport/patches/frame/hw_video_decode.py)
|
||||
|
||||
> Decodes the game's videos on the Frame's hardware video decoder instead of Android's software decoders, which stutter or fall behind with 4K/8K video (for example video players, Batman: Arkham Shadow's cutscenes). Adds FramePort's codec plugin (OMX.frameport.avc/hevc/vp9.decoder) to this game's container only; the APK isn't changed. When the hardware is busy (for example Steam's own hardware video decoding is on) the video is decoded in software as before.
|
||||
@@ -848,7 +848,7 @@ Declares Meta's permissions some mixed-reality games ask for, so they don't stop
|
||||
- **Changes:** Changes the APK (a rebuild and reinstall apply it).
|
||||
- **Suggested (on):** Mixed-reality game that needs the room model: its 'use spatial data' permission must be granted (for example Demeter).
|
||||
- **Suggested (on):** Uses Meta's room or anchor APIs: their permissions must be granted, or the game never asks for the room (for example NOPE's MR mode).
|
||||
- **Catalog games (9):** Arkio, BattleTalent, Demeter, Laser Dance, Movie Deck for Plex, Punch Fit, Real VR Fishing, Test Quest MR and 1 more.
|
||||
- **Catalog games (10):** Arkio, BattleTalent, Demeter, Laser Dance, Movie Deck for Plex, Punch Fit, Real VR Fishing, SynthRiders and 2 more.
|
||||
- **Source:** [patches/frame/manifest_fixes.py](../src/frameport/patches/frame/manifest_fixes.py)
|
||||
|
||||
> Declares com.oculus.permission.* / horizonos.permission.* that the app uses, so Android grants them at install (for example the 'use spatial data' permission of mixed-reality games like Demeter).
|
||||
@@ -1116,7 +1116,7 @@ Stops a gray or frozen screen in Unity games that turn on anti-aliasing while ru
|
||||
- `frame.unity_gl_shim`
|
||||
- **Changes:** Changes the APK (a rebuild and reinstall apply it).
|
||||
- **Suggested (on):** Unity GLES game that may switch to MSAA at runtime: hide multisampled render-to-texture, which crashes the Frame's GL driver (for example The Room VR).
|
||||
- **Catalog games (27):** Audica, BattleSisters, Beat Saber, COMPOUND, Cosmodread, Down the Rabbit Hole, Drunkn Bar Fight, End Space and 19 more.
|
||||
- **Catalog games (28):** Audica, BattleSisters, Beat Saber, COMPOUND, Cosmodread, Down the Rabbit Hole, Drunkn Bar Fight, End Space and 20 more.
|
||||
- **Suggested by launch-test signatures:**
|
||||
- `unreal-msrtt-crash` (fatal): The game's graphics crashed a few seconds after start.
|
||||
- **Source:** [patches/frame/vrapi_bridge.py](../src/frameport/patches/frame/vrapi_bridge.py)
|
||||
@@ -1171,7 +1171,7 @@ Lets older Unity games start VR without Meta's system apps (they'd stay on a 2D
|
||||
- `frame.unity_oculus_check` · revision 5
|
||||
- **Changes:** Changes the APK (a rebuild and reinstall apply it).
|
||||
- **Suggested (on):** Unity with built-in Oculus support: it checks for Meta's system apps before starting VR, else it runs as a 2D app (for example Accounting+, BattleSisters).
|
||||
- **Catalog games (14):** Accounting+, Audica, BattleSisters, Cosmodread, End Space, Eye of the Temple, I Expect You To Die 2, Jurassic World Aftermath Collection and 6 more.
|
||||
- **Catalog games (15):** Accounting+, Audica, BattleSisters, Cosmodread, End Space, Eye of the Temple, I Expect You To Die 2, Invasion and 7 more.
|
||||
- **Suggested by launch-test signatures:**
|
||||
- `unity-vr-device-none` (fatal): Unity didn't start VR, so the game runs as a hidden 2D app.
|
||||
- **Source:** [patches/frame/unity_oculus_check.py](../src/frameport/patches/frame/unity_oculus_check.py)
|
||||
@@ -1185,7 +1185,7 @@ Keeps a smoothing setting off that the game turns on itself and that can freeze
|
||||
- `frame.unity_runtime_msaa_off` · revision 2
|
||||
- **Changes:** Changes the APK (a rebuild and reinstall apply it).
|
||||
- **Suggested (on):** GLES Unity game whose OVRManager turns 4x MSAA on at runtime: multisampled render-to-texture can hang the Frame's GPU.
|
||||
- **Catalog games (33):** Audica, BattleSisters, BattleTalent, Beat Saber, COMPOUND, Cosmodread, Down the Rabbit Hole, Drunkn Bar Fight and 25 more.
|
||||
- **Catalog games (34):** Audica, BattleSisters, BattleTalent, Beat Saber, COMPOUND, Cosmodread, Down the Rabbit Hole, Drunkn Bar Fight and 26 more.
|
||||
- **Suggested by launch-test signatures:**
|
||||
- `unity-render-crash` (fatal): The game's graphics crashed, so the picture freezes or stays gray.
|
||||
- `unity-runtime-msaa` (info): The game turns MSAA on at runtime, which can hang the Frame's GPU.
|
||||
@@ -1213,7 +1213,7 @@ Lets you type into this app's text fields on the Frame (they'd close at once).
|
||||
- `frame.unity_text_input` · also for 2D apps
|
||||
- **Changes:** Changes the APK (a rebuild and reinstall apply it).
|
||||
- **Suggested (on):** Unity app with text fields (…): they close at once on the Frame because it has no system keyboard.
|
||||
- **Catalog games (135):** AgeOfJoy, AllInOneSports, Ancient_Dungeon, Arcsmith, Arkio, Assassin's Creed Nexus, Attack on Titan VR: Unbreakable, Audica and 127 more.
|
||||
- **Catalog games (136):** AgeOfJoy, AllInOneSports, Ancient_Dungeon, Arcsmith, Arkio, Assassin's Creed Nexus, Attack on Titan VR: Unbreakable, Audica and 128 more.
|
||||
- **Source:** [patches/frame/unity_text_input.py](../src/frameport/patches/frame/unity_text_input.py)
|
||||
|
||||
> Unity's TMP_InputField / InputField wait for Android's on-screen keyboard and close themselves a frame later when there is none (Lepton has no on-screen keyboard; Meta's system keyboard does this on a Quest), so a selected text field only flashes a caret. Rewrites TouchScreenKeyboardShouldBeUsed -> false and isKeyboardUsingEvents (TMP) / InPlaceEditing (uGUI) -> true in libil2cpp.so, found per game with Cpp2IL (downloaded on first use), so fields stay selected and take key presses: Steam's keyboard (with "Show the app window") or Type on Frame from the PC.
|
||||
@@ -1280,6 +1280,7 @@ Lets the game load: it reserves more memory at start than the Frame grants in on
|
||||
- `frame.unreal_noreserve` · also for 2D apps
|
||||
- **Changes:** Changes the APK (a rebuild and reinstall apply it).
|
||||
- **Suggested (on):** Unreal's Binned3 allocator reserves more memory at start than the Frame's kernel allows in one piece; without this the game crashes while it loads.
|
||||
- **Catalog games (1):** Zero Caliber 2.
|
||||
- **Suggested by launch-test signatures:**
|
||||
- `unreal-reserve-refused` (fatal): The game crashed while Unreal was still loading, before its first frame.
|
||||
- **Source:** [patches/frame/unreal_noreserve.py](../src/frameport/patches/frame/unreal_noreserve.py)
|
||||
@@ -1765,7 +1766,7 @@ Prevents dynamic resolution from moving Valve foveation off-centre or leaving a
|
||||
- **Options:**
|
||||
- Value: int, default `0`.
|
||||
- Game settings → Picture → "Keep full resolution (no dynamic resolution)" (advanced).
|
||||
- **Catalog games (1):** Batman: Arkham Shadow.
|
||||
- **Catalog games (2):** Batman: Arkham Shadow, Zero Caliber 2.
|
||||
- **Suggested by launch-test signatures:**
|
||||
- `dynamic-resolution-foveation` (info): The game submits an offset projection viewport.
|
||||
- **Source:** [patches/settings.py](../src/frameport/patches/settings.py)
|
||||
@@ -1959,7 +1960,7 @@ For games that freeze the Frame when a controller vibrates (for example Lucky's
|
||||
- **Options:**
|
||||
- Value: int, default `0`.
|
||||
- Game settings → Controllers → "Fix freezes when controllers vibrate" (advanced).
|
||||
- **Catalog games (120):** AgeOfJoy, Ancient_Dungeon, Attack on Titan VR: Unbreakable, Audica, AugmentedEmpire, Barbaria, Battlemarked, BattleSisters and 112 more.
|
||||
- **Catalog games (122):** AgeOfJoy, Ancient_Dungeon, Attack on Titan VR: Unbreakable, Audica, AugmentedEmpire, Barbaria, Battlemarked, BattleSisters and 114 more.
|
||||
- **Source:** [patches/settings.py](../src/frameport/patches/settings.py)
|
||||
|
||||
> Routes OVRPlugin through FramePort's extension shim, which turns Meta's amplitude-envelope vibrations into plain ones: OVRPort's loader reads their nanosecond duration as seconds and allocates gigabytes, freezing the Frame when the game vibrates a controller (for example Lucky's Tale's save slots, GitHub #9). Needs a rebuild.
|
||||
@@ -2225,7 +2226,9 @@ How often the picture updates. Higher is smoother if the game can keep up.
|
||||
- **Options:**
|
||||
- Value: float, default `0.0`.
|
||||
- Game settings → Picture → "Refresh rate": Game's choice (`0`), 72 Hz (`72`), 80 Hz (`80`), 90 Hz (`90`), 96 Hz (`96`), 108 Hz (`108`), 120 Hz (`120`), 144 Hz (`144`).
|
||||
- **Catalog games (5):** Astro VR Host, Does it Stack?, Majora's Mask VR, Simpsons Hit and Run VR, Vacation Simulator.
|
||||
- **Catalog games (6):** Astro VR Host, Does it Stack?, Majora's Mask VR, Port0r: Time Crisis VR, Simpsons Hit and Run VR, Vacation Simulator.
|
||||
- **Suggested by launch-test signatures:**
|
||||
- `refresh-rate-refused` (error): The game asked for a refresh rate the Frame's runtime refuses and may quit on that error.
|
||||
- **Source:** [patches/settings.py](../src/frameport/patches/settings.py)
|
||||
|
||||
> Display refresh rate for this game (72, 80, 90, 96, 108, 120 or 144; 0 = the game's choice). Applied through SteamVR before the game starts. A video's frame rate that divides the refresh rate plays smoothest (for example 30 fps at 90 Hz, 24 fps at 72 Hz).
|
||||
@@ -2297,7 +2300,7 @@ Scene games get your saved room. Without one, they get a simple room from the pl
|
||||
- **Options:**
|
||||
- Value: int, default `0`.
|
||||
- Game settings → Mixed reality → "Use room layout".
|
||||
- **Catalog games (20):** Arkio, AugmentedEmpire, Battlemarked, BattleTalent, cubism, Demeo, Demeter, Ghostbusters: Rise of the Ghost Lord and 12 more.
|
||||
- **Catalog games (21):** Arkio, AugmentedEmpire, Battlemarked, BattleTalent, cubism, Demeo, Demeter, Ghostbusters: Rise of the Ghost Lord and 13 more.
|
||||
- **Suggested by launch-test signatures:**
|
||||
- `mr-discovery-unsupported` (warning): The game cannot discover a Meta room.
|
||||
- `scene-missing` (warning): The game wants Meta's room data (scene API), which the Frame lacks.
|
||||
@@ -2860,7 +2863,7 @@ Lets typing reach this app from Steam's on-screen keyboard or your PC's keyboard
|
||||
- **Changes:** Install only: written on the Frame when the game is installed; the APK isn't changed.
|
||||
- **Suggested (on):** The app opens a flat launcher that starts its VR part (…): Lepton runs VR apps headless, so the launcher is only seen in a shown Android window.
|
||||
- **Suggested (on):** App with text fields: key presses only reach a shown Android window.
|
||||
- **Catalog games (134):** AFFECTED: The Manor, AgeOfJoy, AllInOneSports, Ancient_Dungeon, Arcsmith, Arkio, Attack on Titan VR: Unbreakable, Audica and 126 more.
|
||||
- **Catalog games (135):** AFFECTED: The Manor, AgeOfJoy, AllInOneSports, Ancient_Dungeon, Arcsmith, Arkio, Attack on Titan VR: Unbreakable, Audica and 127 more.
|
||||
- **Source:** [patches/settings.py](../src/frameport/patches/settings.py)
|
||||
|
||||
> Lepton runs VR apps headless: their Android window is never shown, so it never gets keyboard focus and no key press (Steam's on-screen keyboard, a USB/Bluetooth keyboard, Type on Frame) reaches the app's text fields. With Lepton's lepton-show-flatscreen marker the window is shown (behind the VR view, which keeps working) and Steam's keyboard opens for a selected text field. Steam lists the shown window as "Gamescope" (the Frame's compositor). While the game runs, FramePort turns off SteamVR's automatic theater mode for game windows: it put the Android window in front of the player with the controllers as a mouse pointer, and the game got no controller input. The window stays a page of the game in the dashboard. Pairs with "Make Unity text fields work without a system keyboard". Apps that open a flat launcher before their VR part (for example Xelee or WiiCompiled, whose launchers pick the game) need the window too: headless, the launcher is never seen and the VR part never starts. For those, theater mode stays on, so the launcher is in front of you; once the VR part runs, close the dashboard with the controller's button if it opened on the window.
|
||||
|
||||
@@ -190,6 +190,7 @@ longer investigations.
|
||||
| Video in a game or player stutters, falls behind or drops to a few fps (4K/8K, for example a video player's 360° video, Batman's cutscenes); `OMX.google.*` / `c2.android.*` decoders in the log | Lepton's Android has only software decoders | `frame.hw_video_decode` (suggested when the APK uses MediaCodec/ExoPlayer/VLC; no APK change, reinstall): `OMX.frameport.{avc,hevc,vp9}.decoder` on the Frame's Iris hardware (H.264 High, HEVC Main, VP9 profile 0 up to 4096x2304; 8-bit; up to 8192 px), mounted into this game's container only (log `Iris hardware video/… decoder active`; launch.log `FramePort video: loading the Iris hardware codec plugin`). `Iris … unavailable` / `initialization failed (-12)` (triage `hw-video-decoder-busy`): another decoder holds the hardware, usually Steam's own hardware video decoding: turn it off in Steam, restart Steam. Video broken with it: Settings → Installing → Hardware video decoding off (all games) or `FRAMEPORT_NO_HW_VIDEO=1 %command%` (one game) |
|
||||
| `Rec.709 color space unavailable`, the game quits before xrCreateSession (GitHub #336, OutRun Quest VR) | The Frame's runtime has no XR_FB_color_space | Adapter setting `fb_color_space=1` (triage `color-space-missing` suggests it): FrameBridge offers the extension (v3), reports Rec.709 and accepts any colour space without converting. Reaches games with their own OpenXR loader; OVRPort's dispatcher can't forward the new functions. Device-unverified |
|
||||
| `AppSW recommended buffers unavailable`, the game quits at start with or without XR_FB_space_warp (GitHub #336, OutRun Quest VR) | The game requires Meta's Application SpaceWarp; the Frame's runtime reports no motion-vector size and its GLES swapchains take only sRGB colour formats. `hide_space_warp` can't help (the game refuses to start without the extension) | Adapter setting `space_warp_emul=1` (triage `appsw-required`): FrameBridge offers XR_FB_space_warp, reports a motion-vector size (the runtime's, else eye/4), serves the motion-vector + space-warp depth swapchains as its own GL textures / Vulkan images and strips `XrCompositionLayerSpaceWarpInfoFB` at xrEndFrame. Log `space_warp_emul:`. docs/DEVICE_NOTES.md#xr_fb_space_warp-emulation-336 |
|
||||
| Log: `request display Hz: -1000101000` (XR_ERROR_DISPLAY_REFRESH_RATE_UNSUPPORTED_FB), then the game destroys its instance right after its first frames (GitHub #336, OutRun Quest VR) | The game asked for a refresh rate the runtime refuses and treats that as fatal | Fixed in FrameBridge: a refused or unsupported `xrRequestDisplayRefreshRateFB` keeps the current rate and returns success (log `refresh rate: app asked for …`); rebuild with Update on Frame. Older builds: Game settings → Refresh rate = 90 Hz |
|
||||
|
||||
Foveation mode, area size and diagnostic test are per-game user preferences (discussion #365), excluded from
|
||||
shared working recipes. Saving Game settings rewrites launcher exports through `set_settings`; changes apply
|
||||
@@ -258,6 +259,7 @@ support. Catalog `device.foveation` defaults and the guarded Batman/Climb 2 APK
|
||||
|---|---|---|
|
||||
| Uploads to the Frame are slow | The link, storage or transfer backend can limit throughput | Check the job's "Transfer link"; try the Frame's hotspot or USB cable. Large install files prefer system OpenSSH SFTP, retaining paired-host checks and `.part` resume; unavailable or failed native uploads fall back to Paramiko. The log names the backend. Settings → Installing → Parallel uploads accepts 1–8 (default 3; saved preferences are preserved). More is not always faster. Measure the production path with `scripts/upload_bench.py --methods app-files-3 --check-resume` (three repetitions, checksum verification) |
|
||||
| Log: `OpenSSH SFTP failed (255): … Permission denied (publickey,password)`, then Paramiko | OpenSSH offered keys the Frame doesn't authorize (GitHub #242) | The log lists the keys OpenSSH offered (`Offering public key`) and its warnings. A connection that logged in with the PC's own keys/agent makes OpenSSH use them too (copies of `~/.ssh/id_*` + the agent); a refused FramePort key is retried that way once. A Frame that accepts only another key file: Settings → Installing → SSH keys (CLI `frameport frame ssh-keys --add <file>`); passphrase keys go through the SSH agent |
|
||||
| Build fails at once: `Input APK is not a file: …LEGO?? Bricktales/…` (a folder or file name with ®, ™, accents or CJK shows `?`) | FramePort on Linux or on the Frame started Java under a C/POSIX locale, so Java decoded the path as ASCII (GitHub #487, fixed) | Update FramePort (`toolchain.java_env` gives Java `LC_ALL=C.UTF-8` when the locale isn't UTF-8); older versions: rename the folder without those characters and rescan |
|
||||
| Log: `OpenSSH SFTP failed (1): stat C://…/[…: No such file or directory` | sftp got glob escapes inside its quotes (GitHub #324, fixed): `[` in a local folder name | Update FramePort; the native_upload `quote()` passes only `\\` and `\"` escapes, Windows paths with `/` |
|
||||
| An install button opens another program (or nothing) instead of FramePort | another program owns the link type, or the switch is off, or macOS (Flet can't receive links there) | Settings → Install links → **Use FramePort for these links**; else Add games → Add from a link… (paste the button's address) |
|
||||
| Game page shows another game's description or screenshots, or they stay wrong after Rename (GitHub #377: "Lollipop" matched an adult Steam game) | Store details were looked up by title and kept after a rename; Steam exact-title matches had no content check | Rename/reset drops title-matched details and screenshots and fetches them again under the new name (package-matched details and custom art stay); Steam matches with sexual-content descriptors are rejected for details and artwork |
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 102 KiB |
@@ -2711,12 +2711,13 @@ XRAPI_ATTR XrResult XRAPI_CALL xrGetInstanceProcAddr(XrInstance instance, const
|
||||
HOOK_AS(xrDestroySession, hook_xrDestroySession)
|
||||
}
|
||||
if (layer_debug || refresh_rate > 0 || equirect_emul) HOOK_AS(xrBeginSession, hook_xrBeginSession)
|
||||
if (layer_debug || refresh_rate > 0) {
|
||||
// The Frame's runtime has no XR_FB_display_refresh_rate (newer SteamOS lists it), but OVRPort's dispatcher offers
|
||||
// it to the game and answers 0 Hz without it: the measured rate instead (the runtime's own answer when it has one),
|
||||
// and a request for a rate the runtime refuses keeps the current one (GitHub #336).
|
||||
if (instance != XR_NULL_HANDLE) {
|
||||
HOOK_AS(xrGetDisplayRefreshRateFB, hook_get_refresh_rate)
|
||||
HOOK_AS(xrRequestDisplayRefreshRateFB, hook_request_refresh_rate)
|
||||
}
|
||||
// The Frame's runtime has no XR_FB_display_refresh_rate, but OVRPort's dispatcher offers it to the game and answers
|
||||
// 0 Hz without it: the measured rate instead (the runtime's own answer when it has one).
|
||||
if (instance != XR_NULL_HANDLE) HOOK_AS(xrGetDisplayRefreshRateFB, hook_get_refresh_rate)
|
||||
if (surface_emul) HOOK_AS(xrCreateSwapchainAndroidSurfaceKHR, hook_xrCreateSwapchainAndroidSurfaceKHR)
|
||||
if (eye_debug || release_wait) HOOK_AS(xrReleaseSwapchainImage, eye_hook_xrReleaseSwapchainImage)
|
||||
if (swapchain_pool || layer_debug || cube_standin) { // pooled images, counters + cube stand-ins; every other wait/release hook above takes precedence
|
||||
|
||||
@@ -737,12 +737,16 @@ static void refresh_on_begin_session(XrSession session) {
|
||||
static XRAPI_ATTR XrResult XRAPI_CALL hook_request_refresh_rate(XrSession session, float rate) {
|
||||
PFN_xrRequestDisplayRefreshRateFB fn =
|
||||
(PFN_xrRequestDisplayRefreshRateFB)lookup(active_instance, "xrRequestDisplayRefreshRateFB");
|
||||
if (!fn) return XR_ERROR_FUNCTION_UNSUPPORTED;
|
||||
float wanted = refresh_rate > 0 ? refresh_rate : rate;
|
||||
XrResult result = fn(session, wanted);
|
||||
XrResult result = fn ? fn(session, wanted) : XR_ERROR_FUNCTION_UNSUPPORTED;
|
||||
LOG("refresh rate: app asked for %.1f Hz, requested %.1f Hz: result %d", rate, wanted, result);
|
||||
// A refused override keeps the current rate (as frame-control's compat layer does) instead of failing the app.
|
||||
return XR_FAILED(result) && refresh_rate > 0 ? XR_SUCCESS : result;
|
||||
// A refused request keeps the current rate (as frame-control's compat layer does) instead of failing the app: an
|
||||
// override always, the app's own rate when the runtime doesn't offer it (OutRun quit on
|
||||
// XR_ERROR_DISPLAY_REFRESH_RATE_UNSUPPORTED_FB right after its first frames, GitHub #336).
|
||||
if (XR_FAILED(result) && (refresh_rate > 0 || result == XR_ERROR_DISPLAY_REFRESH_RATE_UNSUPPORTED_FB ||
|
||||
result == XR_ERROR_FUNCTION_UNSUPPORTED || result == XR_ERROR_FEATURE_UNSUPPORTED))
|
||||
return XR_SUCCESS;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Always on: the Frame's runtime has no XR_FB_display_refresh_rate; OVRPort's dispatcher still offers the extension and
|
||||
|
||||
+283
-112
@@ -1,32 +1,32 @@
|
||||
{
|
||||
"updated": "2026-10-19",
|
||||
"updated": "2026-10-25",
|
||||
"people": [
|
||||
{
|
||||
"login": "spoopyghosty0",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/336754034?v=4",
|
||||
"url": "https://github.com/spoopyghosty0",
|
||||
"commits": 783,
|
||||
"commits": 981,
|
||||
"issues": 6,
|
||||
"prs": 5,
|
||||
"total": 826
|
||||
"prs": 6,
|
||||
"total": 1029
|
||||
},
|
||||
{
|
||||
"login": "Izimzizi",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/77581918?v=4",
|
||||
"url": "https://github.com/Izimzizi",
|
||||
"commits": 0,
|
||||
"issues": 21,
|
||||
"issues": 24,
|
||||
"prs": 0,
|
||||
"total": 63
|
||||
"total": 72
|
||||
},
|
||||
{
|
||||
"login": "tkp206093",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/29872453?v=4",
|
||||
"url": "https://github.com/tkp206093",
|
||||
"commits": 0,
|
||||
"issues": 21,
|
||||
"issues": 22,
|
||||
"prs": 0,
|
||||
"total": 63
|
||||
"total": 66
|
||||
},
|
||||
{
|
||||
"login": "Klownicle",
|
||||
@@ -60,9 +60,27 @@
|
||||
"avatar": "https://avatars.githubusercontent.com/u/40860703?v=4",
|
||||
"url": "https://github.com/Genosystem",
|
||||
"commits": 0,
|
||||
"issues": 13,
|
||||
"issues": 14,
|
||||
"prs": 0,
|
||||
"total": 39
|
||||
"total": 42
|
||||
},
|
||||
{
|
||||
"login": "Nikoroq",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/135438574?v=4",
|
||||
"url": "https://github.com/Nikoroq",
|
||||
"commits": 0,
|
||||
"issues": 14,
|
||||
"prs": 0,
|
||||
"total": 42
|
||||
},
|
||||
{
|
||||
"login": "supercoleman04",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/342592118?v=4",
|
||||
"url": "https://github.com/supercoleman04",
|
||||
"commits": 0,
|
||||
"issues": 14,
|
||||
"prs": 0,
|
||||
"total": 42
|
||||
},
|
||||
{
|
||||
"login": "Lucas-Mathieu",
|
||||
@@ -73,6 +91,15 @@
|
||||
"prs": 5,
|
||||
"total": 37
|
||||
},
|
||||
{
|
||||
"login": "brunoga",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/1944863?v=4",
|
||||
"url": "https://github.com/brunoga",
|
||||
"commits": 0,
|
||||
"issues": 11,
|
||||
"prs": 0,
|
||||
"total": 33
|
||||
},
|
||||
{
|
||||
"login": "Sheebalove",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/176067652?v=4",
|
||||
@@ -82,15 +109,6 @@
|
||||
"prs": 0,
|
||||
"total": 33
|
||||
},
|
||||
{
|
||||
"login": "brunoga",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/1944863?v=4",
|
||||
"url": "https://github.com/brunoga",
|
||||
"commits": 0,
|
||||
"issues": 10,
|
||||
"prs": 0,
|
||||
"total": 30
|
||||
},
|
||||
{
|
||||
"login": "LynkWyland",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/54166762?v=4",
|
||||
@@ -109,15 +127,6 @@
|
||||
"prs": 4,
|
||||
"total": 30
|
||||
},
|
||||
{
|
||||
"login": "supercoleman04",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/342592118?v=4",
|
||||
"url": "https://github.com/supercoleman04",
|
||||
"commits": 0,
|
||||
"issues": 10,
|
||||
"prs": 0,
|
||||
"total": 30
|
||||
},
|
||||
{
|
||||
"login": "inseend",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/11666993?v=4",
|
||||
@@ -127,20 +136,20 @@
|
||||
"prs": 0,
|
||||
"total": 27
|
||||
},
|
||||
{
|
||||
"login": "jim2011",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/15848374?v=4",
|
||||
"url": "https://github.com/jim2011",
|
||||
"commits": 0,
|
||||
"issues": 8,
|
||||
"prs": 0,
|
||||
"total": 24
|
||||
},
|
||||
{
|
||||
"login": "Jmckenzie84",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/71196491?v=4",
|
||||
"url": "https://github.com/Jmckenzie84",
|
||||
"commits": 0,
|
||||
"issues": 9,
|
||||
"prs": 0,
|
||||
"total": 27
|
||||
},
|
||||
{
|
||||
"login": "jim2011",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/15848374?v=4",
|
||||
"url": "https://github.com/jim2011",
|
||||
"commits": 0,
|
||||
"issues": 8,
|
||||
"prs": 0,
|
||||
"total": 24
|
||||
@@ -163,6 +172,24 @@
|
||||
"prs": 0,
|
||||
"total": 18
|
||||
},
|
||||
{
|
||||
"login": "greggray24",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/255593097?v=4",
|
||||
"url": "https://github.com/greggray24",
|
||||
"commits": 0,
|
||||
"issues": 6,
|
||||
"prs": 0,
|
||||
"total": 18
|
||||
},
|
||||
{
|
||||
"login": "pinbear-creator",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/194687704?v=4",
|
||||
"url": "https://github.com/pinbear-creator",
|
||||
"commits": 0,
|
||||
"issues": 6,
|
||||
"prs": 0,
|
||||
"total": 18
|
||||
},
|
||||
{
|
||||
"login": "buildmine10",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/33100363?v=4",
|
||||
@@ -191,18 +218,27 @@
|
||||
"total": 15
|
||||
},
|
||||
{
|
||||
"login": "greggray24",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/255593097?v=4",
|
||||
"url": "https://github.com/greggray24",
|
||||
"login": "jeliastam",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/2113009?v=4",
|
||||
"url": "https://github.com/jeliastam",
|
||||
"commits": 0,
|
||||
"issues": 5,
|
||||
"prs": 0,
|
||||
"total": 15
|
||||
},
|
||||
{
|
||||
"login": "jeliastam",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/2113009?v=4",
|
||||
"url": "https://github.com/jeliastam",
|
||||
"login": "Natouille04",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/60348431?v=4",
|
||||
"url": "https://github.com/Natouille04",
|
||||
"commits": 0,
|
||||
"issues": 5,
|
||||
"prs": 0,
|
||||
"total": 15
|
||||
},
|
||||
{
|
||||
"login": "s1lenceSRG",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/340965322?v=4",
|
||||
"url": "https://github.com/s1lenceSRG",
|
||||
"commits": 0,
|
||||
"issues": 5,
|
||||
"prs": 0,
|
||||
@@ -235,6 +271,15 @@
|
||||
"prs": 0,
|
||||
"total": 15
|
||||
},
|
||||
{
|
||||
"login": "freshkleensucks",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/347648558?v=4",
|
||||
"url": "https://github.com/freshkleensucks",
|
||||
"commits": 0,
|
||||
"issues": 4,
|
||||
"prs": 0,
|
||||
"total": 12
|
||||
},
|
||||
{
|
||||
"login": "Loafmeister",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/60628625?v=4",
|
||||
@@ -254,18 +299,18 @@
|
||||
"total": 12
|
||||
},
|
||||
{
|
||||
"login": "Natouille04",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/60348431?v=4",
|
||||
"url": "https://github.com/Natouille04",
|
||||
"login": "nickwilde77555",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/180547421?v=4",
|
||||
"url": "https://github.com/nickwilde77555",
|
||||
"commits": 0,
|
||||
"issues": 4,
|
||||
"prs": 0,
|
||||
"total": 12
|
||||
},
|
||||
{
|
||||
"login": "nickwilde77555",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/180547421?v=4",
|
||||
"url": "https://github.com/nickwilde77555",
|
||||
"login": "pocketpal69",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/339918777?v=4",
|
||||
"url": "https://github.com/pocketpal69",
|
||||
"commits": 0,
|
||||
"issues": 4,
|
||||
"prs": 0,
|
||||
@@ -316,6 +361,15 @@
|
||||
"prs": 0,
|
||||
"total": 12
|
||||
},
|
||||
{
|
||||
"login": "alicecatpaw",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/7423859?v=4",
|
||||
"url": "https://github.com/alicecatpaw",
|
||||
"commits": 6,
|
||||
"issues": 0,
|
||||
"prs": 1,
|
||||
"total": 11
|
||||
},
|
||||
{
|
||||
"login": "AnthonyScola",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/98185049?v=4",
|
||||
@@ -334,6 +388,15 @@
|
||||
"prs": 0,
|
||||
"total": 9
|
||||
},
|
||||
{
|
||||
"login": "Kanobar",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/122025313?v=4",
|
||||
"url": "https://github.com/Kanobar",
|
||||
"commits": 0,
|
||||
"issues": 3,
|
||||
"prs": 0,
|
||||
"total": 9
|
||||
},
|
||||
{
|
||||
"login": "m4ddh7jm7c-bit",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/338352097?v=4",
|
||||
@@ -344,9 +407,27 @@
|
||||
"total": 9
|
||||
},
|
||||
{
|
||||
"login": "pocketpal69",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/339918777?v=4",
|
||||
"url": "https://github.com/pocketpal69",
|
||||
"login": "marcoszaballos",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/44778619?v=4",
|
||||
"url": "https://github.com/marcoszaballos",
|
||||
"commits": 0,
|
||||
"issues": 3,
|
||||
"prs": 0,
|
||||
"total": 9
|
||||
},
|
||||
{
|
||||
"login": "Mitchlett",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/46537377?v=4",
|
||||
"url": "https://github.com/Mitchlett",
|
||||
"commits": 0,
|
||||
"issues": 3,
|
||||
"prs": 0,
|
||||
"total": 9
|
||||
},
|
||||
{
|
||||
"login": "Momofier",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/13684228?v=4",
|
||||
"url": "https://github.com/Momofier",
|
||||
"commits": 0,
|
||||
"issues": 3,
|
||||
"prs": 0,
|
||||
@@ -379,6 +460,15 @@
|
||||
"prs": 0,
|
||||
"total": 6
|
||||
},
|
||||
{
|
||||
"login": "Callamuchi",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/346494602?v=4",
|
||||
"url": "https://github.com/Callamuchi",
|
||||
"commits": 0,
|
||||
"issues": 2,
|
||||
"prs": 0,
|
||||
"total": 6
|
||||
},
|
||||
{
|
||||
"login": "crointer",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/165038970?v=4",
|
||||
@@ -469,6 +559,15 @@
|
||||
"prs": 1,
|
||||
"total": 6
|
||||
},
|
||||
{
|
||||
"login": "IAmFarb",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/342179991?v=4",
|
||||
"url": "https://github.com/IAmFarb",
|
||||
"commits": 0,
|
||||
"issues": 2,
|
||||
"prs": 0,
|
||||
"total": 6
|
||||
},
|
||||
{
|
||||
"login": "konga056",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/67296924?v=4",
|
||||
@@ -479,18 +578,18 @@
|
||||
"total": 6
|
||||
},
|
||||
{
|
||||
"login": "mamasboi2000",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/344123932?v=4",
|
||||
"url": "https://github.com/mamasboi2000",
|
||||
"commits": 0,
|
||||
"issues": 2,
|
||||
"prs": 0,
|
||||
"login": "lucasoskorep",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/17054135?v=4",
|
||||
"url": "https://github.com/lucasoskorep",
|
||||
"commits": 1,
|
||||
"issues": 0,
|
||||
"prs": 1,
|
||||
"total": 6
|
||||
},
|
||||
{
|
||||
"login": "marcoszaballos",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/44778619?v=4",
|
||||
"url": "https://github.com/marcoszaballos",
|
||||
"login": "mamasboi2000",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/344123932?v=4",
|
||||
"url": "https://github.com/mamasboi2000",
|
||||
"commits": 0,
|
||||
"issues": 2,
|
||||
"prs": 0,
|
||||
@@ -505,6 +604,15 @@
|
||||
"prs": 0,
|
||||
"total": 6
|
||||
},
|
||||
{
|
||||
"login": "MayhemMike",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/137106723?v=4",
|
||||
"url": "https://github.com/MayhemMike",
|
||||
"commits": 0,
|
||||
"issues": 2,
|
||||
"prs": 0,
|
||||
"total": 6
|
||||
},
|
||||
{
|
||||
"login": "Minibattle",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/67839290?v=4",
|
||||
@@ -515,18 +623,18 @@
|
||||
"total": 6
|
||||
},
|
||||
{
|
||||
"login": "Momofier",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/13684228?v=4",
|
||||
"url": "https://github.com/Momofier",
|
||||
"login": "peetzweg",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/839848?v=4",
|
||||
"url": "https://github.com/peetzweg",
|
||||
"commits": 0,
|
||||
"issues": 2,
|
||||
"prs": 0,
|
||||
"total": 6
|
||||
},
|
||||
{
|
||||
"login": "peetzweg",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/839848?v=4",
|
||||
"url": "https://github.com/peetzweg",
|
||||
"login": "Puchor",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/46112576?v=4",
|
||||
"url": "https://github.com/Puchor",
|
||||
"commits": 0,
|
||||
"issues": 2,
|
||||
"prs": 0,
|
||||
@@ -550,6 +658,15 @@
|
||||
"prs": 0,
|
||||
"total": 6
|
||||
},
|
||||
{
|
||||
"login": "Veticia",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/668573?v=4",
|
||||
"url": "https://github.com/Veticia",
|
||||
"commits": 1,
|
||||
"issues": 0,
|
||||
"prs": 1,
|
||||
"total": 6
|
||||
},
|
||||
{
|
||||
"login": "yzfsoldier",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/35410319?v=4",
|
||||
@@ -559,15 +676,6 @@
|
||||
"prs": 1,
|
||||
"total": 6
|
||||
},
|
||||
{
|
||||
"login": "alicecatpaw",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/7423859?v=4",
|
||||
"url": "https://github.com/alicecatpaw",
|
||||
"commits": 0,
|
||||
"issues": 0,
|
||||
"prs": 1,
|
||||
"total": 5
|
||||
},
|
||||
{
|
||||
"login": "Agent-Gato",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/141082538?v=4",
|
||||
@@ -685,6 +793,15 @@
|
||||
"prs": 0,
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "Derek-Roberts",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/4860382?v=4",
|
||||
"url": "https://github.com/Derek-Roberts",
|
||||
"commits": 0,
|
||||
"issues": 1,
|
||||
"prs": 0,
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "DolphinOfficial",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/92276540?v=4",
|
||||
@@ -703,6 +820,15 @@
|
||||
"prs": 0,
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "DylanDAG",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/149199149?v=4",
|
||||
"url": "https://github.com/DylanDAG",
|
||||
"commits": 0,
|
||||
"issues": 1,
|
||||
"prs": 0,
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "EdgarJLopez",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/82680990?v=4",
|
||||
@@ -748,6 +874,15 @@
|
||||
"prs": 0,
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "Gei-1",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/102943357?v=4",
|
||||
"url": "https://github.com/Gei-1",
|
||||
"commits": 0,
|
||||
"issues": 1,
|
||||
"prs": 0,
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "Haseo-sudo",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/344139069?v=4",
|
||||
@@ -757,6 +892,15 @@
|
||||
"prs": 0,
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "HaywireAlt",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/347392021?v=4",
|
||||
"url": "https://github.com/HaywireAlt",
|
||||
"commits": 0,
|
||||
"issues": 1,
|
||||
"prs": 0,
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "hokey1981",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/42741984?v=4",
|
||||
@@ -766,6 +910,15 @@
|
||||
"prs": 0,
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "idkAnAlliasYetTbh",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/262686353?v=4",
|
||||
"url": "https://github.com/idkAnAlliasYetTbh",
|
||||
"commits": 0,
|
||||
"issues": 1,
|
||||
"prs": 0,
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "InsideCat02",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/111202797?v=4",
|
||||
@@ -811,15 +964,6 @@
|
||||
"prs": 0,
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "Kanobar",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/122025313?v=4",
|
||||
"url": "https://github.com/Kanobar",
|
||||
"commits": 0,
|
||||
"issues": 1,
|
||||
"prs": 0,
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "LeaPhant",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/14080165?v=4",
|
||||
@@ -839,9 +983,9 @@
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "Mitchlett",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/46537377?v=4",
|
||||
"url": "https://github.com/Mitchlett",
|
||||
"login": "mitch030504",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/40723072?v=4",
|
||||
"url": "https://github.com/mitch030504",
|
||||
"commits": 0,
|
||||
"issues": 1,
|
||||
"prs": 0,
|
||||
@@ -866,9 +1010,9 @@
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "Nikoroq",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/135438574?v=4",
|
||||
"url": "https://github.com/Nikoroq",
|
||||
"login": "nabel0",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/50377455?v=4",
|
||||
"url": "https://github.com/nabel0",
|
||||
"commits": 0,
|
||||
"issues": 1,
|
||||
"prs": 0,
|
||||
@@ -901,24 +1045,6 @@
|
||||
"prs": 0,
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "pinbear-creator",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/194687704?v=4",
|
||||
"url": "https://github.com/pinbear-creator",
|
||||
"commits": 0,
|
||||
"issues": 1,
|
||||
"prs": 0,
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "Puchor",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/46112576?v=4",
|
||||
"url": "https://github.com/Puchor",
|
||||
"commits": 0,
|
||||
"issues": 1,
|
||||
"prs": 0,
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "Rabbitbeam",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/22737155?v=4",
|
||||
@@ -929,9 +1055,45 @@
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "s1lenceSRG",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/340965322?v=4",
|
||||
"url": "https://github.com/s1lenceSRG",
|
||||
"login": "RadFox34",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/36874376?v=4",
|
||||
"url": "https://github.com/RadFox34",
|
||||
"commits": 0,
|
||||
"issues": 1,
|
||||
"prs": 0,
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "rc2189",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/100491666?v=4",
|
||||
"url": "https://github.com/rc2189",
|
||||
"commits": 0,
|
||||
"issues": 1,
|
||||
"prs": 0,
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "ResKohza",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/347285306?v=4",
|
||||
"url": "https://github.com/ResKohza",
|
||||
"commits": 0,
|
||||
"issues": 1,
|
||||
"prs": 0,
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "Runir",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/16932342?v=4",
|
||||
"url": "https://github.com/Runir",
|
||||
"commits": 0,
|
||||
"issues": 1,
|
||||
"prs": 0,
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "stanvill",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/119756631?v=4",
|
||||
"url": "https://github.com/stanvill",
|
||||
"commits": 0,
|
||||
"issues": 1,
|
||||
"prs": 0,
|
||||
@@ -1000,6 +1162,15 @@
|
||||
"prs": 0,
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "Venjjeance",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/34115864?v=4",
|
||||
"url": "https://github.com/Venjjeance",
|
||||
"commits": 0,
|
||||
"issues": 1,
|
||||
"prs": 0,
|
||||
"total": 3
|
||||
},
|
||||
{
|
||||
"login": "WhoPlaysTheFool",
|
||||
"avatar": "https://avatars.githubusercontent.com/u/26016667?v=4",
|
||||
|
||||
@@ -1,6 +1,14 @@
|
||||
{
|
||||
"updated": "2026-10-19",
|
||||
"updated": "2026-10-25",
|
||||
"releases": [
|
||||
{
|
||||
"tag": "dev",
|
||||
"name": "FramePort dev build 1.3.1.dev703",
|
||||
"date": "2026-10-25",
|
||||
"url": "https://github.com/spoopyghosty0/frameport/releases/tag/dev",
|
||||
"dev": true,
|
||||
"notes": "Dev build **1.3.1.dev703** from commit dc98903 (2026-10-25). For testing fixes before\nthe next release; you get that release as a normal update.\n\n## Please test\n\nYouTube and other Quest hybrid apps: new opt-in 'Hybrid app: allow the switch into VR' (Customize) for the VR part (360 videos, full screen) (#484). Also: Windows update fix (#476), expansion file names (#415), Steam library 'Now' installs (#305), Android shared libraries kept (#484).\n\n## Changes since v1.3.0\n\n- Hybrid apps: declare the system feature they check before switching into VR (#484)\n- Windows updates: relative paths from the folders' long names (8.3 install paths)\n- Keep Android's shared libraries OVRPort removes (#484)\n- Steam library (now): later installs no longer hang behind a waiting library update (#305)\n- Expansion files: other kinds get the game's package spelling too (#415)\n- Windows updates never mix two versions (#476)\n- Site: current app and docs; Controller buttons page; clearer wording\n- Docs: name the thing instead of 'it', 'this' or 'that' where the referent was unclear\n- Docs: themes, install button, controller buttons, diagnostics, contributing: tighter wording\n- Docs: install guide and FAQ: shorter, one idea per sentence\n- Docs: README and compatibility: no game count, shorter text\n- Docs: architecture: triage signatures now update from GitHub main too\n- Docs: third-party notices list Cpp2IL and APKEditor, which FramePort downloads on first use\n- Docs: transfer benchmark: remove local report paths, say what the uploader does today\n- Docs: runtime reference: version-neutral title, current Revive-under-Proton facts, no agent versions\n- Docs: playbook: fix the broken first table, current PC VR model, one section for FramePort's own problems\n- Docs: contributor pages: current menu labels, PC VR runs as-is by default, Linux apps, no agent versions\n- Docs: install guide and FAQ follow the new game menu, settings and save backups\n- Docs: README and compatibility pages: current game count, full docs index, Linux apps; regenerate the tested-games list\n- Catalog: Hungry Shark Evolution (#486)\n- Tests: shorter line in the shader-fix triage test\n- Shader fixes: say once when none of a game's configured fixes matched\n- Headset identity: other OVRPort runtimes found by structure, not fixed offsets\n- Just Dance VR local save: no game version check\n- Just Dance VR keeps its progress (#480): frame.justdance_local_save\n- Triage signatures update from GitHub main like the catalog\n- QuestZDoom slowdown (#237): Team Beef ports get gl_error_clear\n- Locales: template with the latest patch texts\n- The Climb 1 starts again: the foveation layer file always ships with FrameBridge, and never interposes libvulkan (#432, #449)\n- Agent v123: the flat-launcher theater exception (#475) ships after v122's diagnostics change; test follows deployment_recipe\n- Apps with a flat launcher before their VR part get the Android window, shown in theater mode (#475)\n- Diagnostics: collect_diag returns the last launch's stop-pause, exit-hook, theater and dashboard logs and plays.log, so a zip shows whether the game was pause\n- UI text: \"for example\" instead of \"e.g.\" in the OBB name warnings\n- Menus: a solid grey left edge and a solid soft highlight instead of the portal gradient (#414)\n- Menus: FramePort's own menu with hover submenus for every context menu and the game page's \"…\" (#414)\n- Menus: long items wrap instead of running past the edge; shorter Library right-click menu (#414)\n- Steam's own Exit game pauses FramePort games first: the launcher's _exit_hook worker hooks SteamClient.Apps.TerminateApp in Steam's UI through CEF devtools an\n- App bundles: .xapk/.apks/.apkm/.apkx files and split APK folders are unpacked and merged into one APK (discussion #482)\n- Installs: OBBs with a download's copy suffix or another case go to the Frame under the name the game looks for (#481)\n- Games are paused before they end: launch.sh, agent stop and End game send the activity home in the container and wait up to 3 s, so saves written on pause run\n"
|
||||
},
|
||||
{
|
||||
"tag": "v1.3.0",
|
||||
"name": "FramePort v1.3.0",
|
||||
@@ -25,14 +33,6 @@
|
||||
"dev": false,
|
||||
"notes": "FramePort v1.2.0: Windows (x64), macOS (Apple Silicon) and Linux (x64, ARM64).\n\n## What's new\n\n- **Run many 32-bit Gear VR, Oculus Go and older Quest games** (experimental, thanks UnicronNL): a built-in 32-bit translator now runs AFFECTED The Manor, Gunjack, Spunky Dungeon, Sports Scramble, Journey of the Gods and Shadow Point.\n- **New working recipes:** Assassin's Creed Nexus, Ghostbusters: Rise of the Ghost Lord, Majora's Mask VR and Plezy.\n- **Game fixes:** Vader Immortal no longer slows down the longer you play, Medal of Honor and other Unreal games get past the invisible data-check screen, and UNDERDOGS and games that crashed on a cube-map (skybox) keep running.\n- **Fixes:** more reliable Steam library shortcuts, \"Add to Steam library\" works again after an older install left duplicate entries, and faster uploads for games with many small files.\n\nAlready have FramePort? It offers this update itself (Library → **Update now**).\n\n## Install\n\nDownload the file for your PC, unpack it and start FramePort. Guide:\n[Install and first steps](https://frameport.app/docs/install/).\n"
|
||||
},
|
||||
{
|
||||
"tag": "dev",
|
||||
"name": "FramePort dev build 1.2.1.dev433",
|
||||
"date": "2026-10-15",
|
||||
"url": "https://github.com/spoopyghosty0/frameport/releases/tag/dev",
|
||||
"dev": true,
|
||||
"notes": "Dev build **1.2.1.dev433** from commit 6cd1eaa (2026-10-15). For testing fixes before\nthe next release; you get that release as a normal update.\n\n## Please test\n\nPreyVR (and other Doom3Quest-based ports with a curved menu): fix for the black menu. The menu is a per-eye cylinder the Frame's runtime rejected as too many layers; this build shows it to both eyes. Install, then rebuild PreyVR on the Frame and launch it from Steam — the menu should appear.\n\n## Changes since v1.2.0\n\n- adapter: show a per-eye cylinder menu to both eyes (fix black curved menus)\n- adapter: log the created swapchain handle in xrCreateSwapchain\n- Catalog: 16 community-verified recipes\n"
|
||||
},
|
||||
{
|
||||
"tag": "v1.1.1",
|
||||
"name": "FramePort v1.1.1",
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
# The FramePort version: the single source (pyproject reads it via hatch; CI checks a release tag matches it).
|
||||
__version__ = "1.3.0"
|
||||
__version__ = "1.4.0"
|
||||
@@ -62,7 +62,9 @@ IL2CPP_METADATA = "assets/bin/Data/Managed/Metadata/global-metadata.dat"
|
||||
# 26: browser_query (the manifest's <queries> look for a web browser: frame.browser_handoff, GitHub #466) (2026-10)
|
||||
# 27: uses_libraries (the original manifest's <uses-library> names, which OVRPort removes:
|
||||
# frame.keep_system_libraries, GitHub #484) (2026-10)
|
||||
ANALYSIS_VERSION = 27 # (cortopia_org_id's TMNT layout, GitHub #422, needed no re-analysis: see the patch)
|
||||
# 28: vr_activity counts an INFO activity as the start activity (a single MAIN + INFO + VR activity was taken for
|
||||
# a VR part behind a flat launcher, GitHub #476) (2026-10)
|
||||
ANALYSIS_VERSION = 28 # (cortopia_org_id's TMNT layout, GitHub #422, needed no re-analysis: see the patch)
|
||||
|
||||
|
||||
# Android versions by API level (for messages); the Frame's Lepton container runs Android 11 (API 30)
|
||||
|
||||
@@ -362,17 +362,23 @@ def component_filters(manifest: bytes) -> list[tuple[str, str, list[tuple[str, i
|
||||
|
||||
|
||||
def vr_activity(manifest: bytes) -> str | None:
|
||||
"""The activity with Meta's VR category when it isn't the launcher activity (a 2D launcher that starts the VR
|
||||
part, e.g. WiiCompiled's LauncherActivity -> QuestActivity)."""
|
||||
"""The activity with Meta's VR category when it isn't the start activity (a 2D launcher that starts the VR
|
||||
part, e.g. WiiCompiled's LauncherActivity -> QuestActivity). The start activity is the LAUNCHER one, else the
|
||||
INFO one (Quest store builds often give their only activity MAIN + INFO + VR, GitHub #476), else the first MAIN."""
|
||||
x = Axml(manifest)
|
||||
names = x.strings()
|
||||
vr = launcher = None
|
||||
vr = None
|
||||
start = {} # category -> first activity
|
||||
for el, name, items in component_filters(manifest):
|
||||
cats = {names[i] for kind, _, i in items if kind == "category" and i < len(names)}
|
||||
if el == "activity" and VR_CATEGORY in cats:
|
||||
vr = vr or name
|
||||
if LAUNCHER in cats:
|
||||
launcher = launcher or name
|
||||
for cat in (LAUNCHER, INFO):
|
||||
if cat in cats:
|
||||
start.setdefault(cat, name)
|
||||
if el == "activity" and any(k == "action" and i < len(names) and names[i] == MAIN for k, _, i in items):
|
||||
start.setdefault(MAIN, name)
|
||||
launcher = start.get(LAUNCHER) or start.get(INFO) or start.get(MAIN)
|
||||
return vr if vr and vr != launcher else None
|
||||
|
||||
|
||||
|
||||
@@ -311,9 +311,23 @@ def java_cmd(*args: str) -> list[str]:
|
||||
return [str(java), "-Djava.awt.headless=true", *args]
|
||||
|
||||
|
||||
def java_env(environ=None) -> dict | None:
|
||||
"""Linux: an environment with a UTF-8 locale when the inherited one isn't (None: inherit it). Java decodes its
|
||||
arguments with the locale's charset, so under C/POSIX (FramePort on the Frame) `LEGO® Bricktales/x.apk` reached
|
||||
OVRPort as `LEGO?? Bricktales/x.apk` and the build failed (GitHub #487). glibc has C.UTF-8 built in."""
|
||||
if not sys.platform.startswith("linux"):
|
||||
return None
|
||||
environ = dict(os.environ if environ is None else environ)
|
||||
locale = environ.get("LC_ALL") or environ.get("LC_CTYPE") or environ.get("LANG") or ""
|
||||
if "utf-8" in locale.lower() or "utf8" in locale.lower():
|
||||
return None
|
||||
environ["LC_ALL"] = "C.UTF-8"
|
||||
return environ
|
||||
|
||||
|
||||
def run_java(args: list[str], cwd: Path | None = None, timeout: float | None = None) -> subprocess.CompletedProcess:
|
||||
kwargs = {}
|
||||
if sys.platform == "win32":
|
||||
kwargs["creationflags"] = 0x08000000 # CREATE_NO_WINDOW
|
||||
return subprocess.run(java_cmd(*args), cwd=cwd, capture_output=True, text=True, errors="replace",
|
||||
timeout=timeout, **kwargs)
|
||||
timeout=timeout, env=java_env(), **kwargs)
|
||||
@@ -134,6 +134,24 @@ def _filters(manifest):
|
||||
for _, n, items in axml.component_filters(manifest)}
|
||||
|
||||
|
||||
def test_a_single_vr_activity_is_not_a_separate_vr_part():
|
||||
"""GitHub #476: Quest store builds give their only activity MAIN + INFO + VR (no LAUNCHER); that activity is
|
||||
the game itself, not a VR part behind a flat launcher."""
|
||||
from conftest import build_axml
|
||||
|
||||
def manifest(*cats):
|
||||
categories = [e for c in cats for e in (("start", "category", [("name", "str", c)]), ("end", "category"))]
|
||||
return build_axml([("start", "manifest", [("package", "str", "org.x.game")]), ("start", "application", []),
|
||||
("start", "activity", [("name", "str", "com.unity3d.player.UnityPlayerActivity")]),
|
||||
("start", "intent-filter", []),
|
||||
("start", "action", [("name", "str", axml.MAIN)]), ("end", "action"),
|
||||
*categories,
|
||||
("end", "intent-filter"), ("end", "activity"), ("end", "application"), ("end", "manifest")])
|
||||
assert axml.vr_activity(manifest(axml.INFO, axml.VR_CATEGORY)) is None
|
||||
assert axml.vr_activity(manifest(axml.VR_CATEGORY)) is None
|
||||
assert axml.vr_activity(manifest(axml.LAUNCHER, axml.VR_CATEGORY)) is None
|
||||
|
||||
|
||||
def test_start_activity_moves_launcher_to_the_vr_activity():
|
||||
m = _two_activity_manifest()
|
||||
assert axml.vr_activity(m) == "org.x.game.QuestActivity"
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
"""GitHub #487: FramePort on the Frame (C/POSIX locale) started Java without UTF-8, so `LEGO® Bricktales/x.apk`
|
||||
reached OVRPort as `LEGO?? Bricktales/x.apk`."""
|
||||
import sys
|
||||
|
||||
import pytest
|
||||
|
||||
from frameport.tools import toolchain
|
||||
|
||||
|
||||
@pytest.mark.skipif(not sys.platform.startswith("linux"), reason="Linux only")
|
||||
def test_java_gets_a_utf8_locale_on_linux():
|
||||
assert toolchain.java_env({"PATH": "/bin"})["LC_ALL"] == "C.UTF-8"
|
||||
assert toolchain.java_env({"LC_ALL": "C", "LANG": "en_US.UTF-8"})["LC_ALL"] == "C.UTF-8"
|
||||
assert toolchain.java_env({"LANG": "en_US.UTF-8"}) is None # already UTF-8: inherited unchanged
|
||||
assert toolchain.java_env({"LC_CTYPE": "de_DE.utf8"}) is None
|
||||
|
||||
|
||||
def test_other_systems_inherit_the_environment(monkeypatch):
|
||||
monkeypatch.setattr(sys, "platform", "win32")
|
||||
assert toolchain.java_env({"LC_ALL": "C"}) is None
|
||||
@@ -1097,9 +1097,8 @@ def test_swapchain_pool_is_opt_in_for_gles_and_vulkan():
|
||||
|
||||
def test_ac_nexus_uses_the_vulkan_panel_pool(monkeypatch):
|
||||
"""GitHub #424: the Vulkan panel pool frees the swapchain slots its Quest 3 eye images need (headless on the dev
|
||||
Frame, 2026-10-23). Until the release with it reaches users the catalog keeps the Quest 2 identity, since 1.3.0
|
||||
apps (GLES-only pool) read the same remote entry: at that release, drop device.headset_model from frame_remove and
|
||||
update this test. device.text_input_window stays off (its Android window took the controllers' input)."""
|
||||
Frame, 2026-10-23), so AC Nexus is a Quest 3 again from 1.4.0 (min_app: 1.3.0 apps have a GLES-only pool).
|
||||
device.text_input_window stays off (its Android window took the controllers' input)."""
|
||||
from pathlib import Path
|
||||
|
||||
import yaml
|
||||
@@ -1110,10 +1109,12 @@ def test_ac_nexus_uses_the_vulkan_panel_pool(monkeypatch):
|
||||
path = Path(__file__).resolve().parents[1] / "catalog/games/com.Ubisoft.ACNexusVR.yaml"
|
||||
entry = yaml.safe_load(path.read_text())
|
||||
assert entry["adapter"] == {"swapchain_pool": 1} and "#424" in entry["notes"]
|
||||
assert entry.get("frame_remove") == ["device.headset_model", "device.text_input_window"]
|
||||
assert entry.get("frame_remove") == ["device.text_input_window"]
|
||||
assert "device.text_input_window" not in (entry.get("device") or [])
|
||||
assert base.get("frame.adapter").revision_for("com.Ubisoft.ACNexusVR") == 3
|
||||
monkeypatch.setattr(frameport, "__version__", "1.3.0") # 1.3.0 knows swapchain_pool: the entry stays usable
|
||||
monkeypatch.setattr(frameport, "__version__", "1.3.0")
|
||||
assert catalog.unusable_reason(entry) == "needs FramePort 1.4.0"
|
||||
monkeypatch.setattr(frameport, "__version__", "1.4.0")
|
||||
assert catalog.unusable_reason(entry) is None
|
||||
|
||||
|
||||
|
||||
@@ -30,10 +30,13 @@ def test_fallback_rate_is_never_zero(tmp_path):
|
||||
def test_the_hook_is_always_installed():
|
||||
src = (ROOT / "native/adapter/frame_adapter.c").read_text()
|
||||
# not behind a per-game setting: every game that asks gets a rate, also where the runtime lacks the function
|
||||
assert re.search(r"\n if \(instance != XR_NULL_HANDLE\) "
|
||||
r"HOOK_AS\(xrGetDisplayRefreshRateFB, hook_get_refresh_rate\)",
|
||||
# and a refused request keeps the current rate (GitHub #336: OutRun quit on DISPLAY_REFRESH_RATE_UNSUPPORTED_FB)
|
||||
assert re.search(r"\n if \(instance != XR_NULL_HANDLE\) \{\n"
|
||||
r" HOOK_AS\(xrGetDisplayRefreshRateFB, hook_get_refresh_rate\)\n"
|
||||
r" HOOK_AS\(xrRequestDisplayRefreshRateFB, hook_request_refresh_rate\)",
|
||||
src)
|
||||
assert "fb_refresh_rate(" in (ROOT / "native/adapter/session_fixes.c").read_text()
|
||||
fixes = (ROOT / "native/adapter/session_fixes.c").read_text()
|
||||
assert "fb_refresh_rate(" in fixes and "result == XR_ERROR_DISPLAY_REFRESH_RATE_UNSUPPORTED_FB" in fixes
|
||||
|
||||
|
||||
def test_a_single_rejected_frame_is_not_an_error():
|
||||
|
||||
Reference in new issue
Block a user