mirror of
https://github.com/Droid-Deck/DroidDeck.git
synced 2026-11-12 19:41:10 +00:00
The default FEX preset (Performance + TSO) is fine for Unity. But when the Default profile is switched to a preset that turns TSO off (Performance, Extreme, Extreme-gn, Denuvo), Unity players break. DroidDeck already keeps full TSO for .NET games (`coreclr.dll`) whatever the preset; this gives Unity players the same safety net for TSO. Tested on a Pixel 10 Pro Fold (PowerVR DXT-48-1536), shared preset Performance (TSO off): | Game | Build | TSO off | TSO on | | --- | --- | --- | --- | | Megabonk | Unity 2023.2 IL2CPP, native Linux, "Linux x86 (FEX)" | froze on about half of launches (every thread parked on a futex) | 5 of 5 starts, played run stayed responsive | | Crab Game | Unity IL2CPP, Windows, Proton arm64 | 9 of 10 starts; 1 access violation in `UnityPlayer.dll` (read of a garbage pointer) | 10 of 10 starts | Measured cost of TSO on Megabonk: none (+2% fps with TSO on, within noise). What changes: - `droiddeck-game-env`: `unity_memory_ordering` sets `FEX_TSOENABLED=1` when `UnityPlayer.dll`, `UnityPlayer.so` or `GameAssembly.so` sits next to the executable (or one folder below). A FEX preset chosen for the game still wins (fixes sit between the shared preset and the per-game entry, as for .NET). - `droiddeck-fex`: the FEX tool now applies the environment half of these game-file fixes, so native Linux Unity builds get it too. Launch arguments some fixes add stay Proton-only. - Docs paragraph in `docs/development/game-environment.md`; tests in `test_game_environment.py` and `test_droiddeck_fex.py`. Device check of the change itself: with the session's `droiddeck-game-env` patched, shared TSO off and no per-game entry, Crab Game started with `FEX_TSOENABLED=1`. Related to #1386, but not a fix for its Risk of Rain 2 crash: that game is Unity Mono, which with the default preset already has TSO on; the report points at multiblock instead (as the .NET fix turns off). Both games tested here are IL2CPP, so this PR doesn't change multiblock. #1386's other points (`steam_appid.txt`, `device.txt`) aren't covered. Tests (WSL, on main `16bedf36` with the patch): `test_game_environment` + `test_droiddeck_fex` 119 OK. Full `tools/tests`: 1114 tests, one failure, `test_appimage_run…test_a_failed_program_shows_the_log_it_wrote`, which fails the same way without the patch.