Repository navigation
Releases
FH6 FEX 1.2
FH6 FEX 1.2
In-world frame rate roughly doubles over 1.1. The environment variables below are part of the install — the package on its own is not the whole setup.
Read this first: the variables are required
Without them the game still boots and runs, but it stalls for about half a second roughly once a second, all the way through the world. That is not the package failing; it is the setup being incomplete.
Set the game's profile on the Components page:
| Setting | Value |
|---|---|
| Proton | DroidDeck-Proton 11-12.3 or newer (tested on 11-12.5) |
| FEX | FH6-1.2 |
| FEX preset | Denuvo |
| Custom FEX variables | the block below |
Paste this whole block into the game's Custom FEX variables field. Copy it as-is; this is the exact set the result was measured with.
FEX_TSOENABLED=1
FEX_HALFBARRIERTSOENABLED=1
FEX_VECTORTSOENABLED=0
FEX_MEMCPYSETTSOENABLED=0
FEX_SMCCHECKS=full
FEX_POOL_CLONE=1
FEX_FH6_FASTUD=1
FEX_DYNAMICL1CACHE=0
FEX_PROFILESTATS=0
FEX_SILENTLOG=1
FEX_DISKCACHEMAXFILESIZE=8589934592
FEX_SKIP_SRA_FLUSH=0
FEX_FH6_STATS=0
FEX_FH6_UDINPROC=0
PROTON_NO_NTSYNC=1
PROTON_NO_ESYNC=1
PROTON_NO_FSYNC=0
WINE_FAST_YIELD=1
WINEDEBUG=-all
TU_DEBUG=startup
The ones that matter most:
| Variable | Value | Why |
|---|---|---|
FEX_TSOENABLED |
1 |
The Denuvo preset sets it to 0. Without it the game stalls on the splash or loading screen. |
FEX_HALFBARRIERTSOENABLED |
1 |
Same reason. |
FEX_DYNAMICL1CACHE |
0 |
Keeps FEX's lookup table a fixed size, so it cannot grow mid-drive. |
FEX_PROFILESTATS |
0 |
Proton defaults it on, and it puts a clock read around FEX's own locks. |
PROTON_NO_NTSYNC / PROTON_NO_ESYNC |
1 |
Steps around a sync path that can block a frame. |
WINEDEBUG |
-all |
Otherwise Wine logs every call and the frame rate collapses. |
A DroidDeck .wcp only carries files, and the FEX preset is applied underneath it, so the per-game field is the only place that can override the preset. The package cannot set these for you.
Results
Measured at 1590x720 on a cool device (Snapdragon 8 Elite / Adreno 830):
| 1.1 baseline | 1.2 | |
|---|---|---|
| mean in-world | 30.3 fps | 48.5 / 44.5 fps over two holds |
| last in-world sample | — | 56.3 fps |
| 550 ms frames | once per second | none |
The 1.2 re-measurement was done on stock DroidDeck-Proton 11-12.5 with its own ntdll, importing only fh6-fex-droiddeck.wcp from this release. No custom Wine.
What changed in the runtime
- A growing code buffer keeps its chain. It used to be freed as soon as threads migrated to the larger one, while exit links and lookup entries still pointed into its code. That was the crash.
- Any live code buffer counts as JIT. A thread that moved to a newer chain is still recognised when a signal lands in an older one.
- SMC invalidations are batched, with a gap between batches so readers get the lock. One acquisition per event used to park every reader.
Notes
- The phone gets hot. Expect throttling after 6-8 minutes without a cooler; the figures above are on a cool device.
wine/arm64ec-frame-regs.patchin the repo is optional and not needed for the result above. It is there if a session ends with the game vanishing at a suspend.- DroidDeck-Proton 11-12.5 must be selected for the game, not Proton Experimental (ARM64).
- Package details: FEX DLL sha256
694c52e72aef7aef5bb3bb818ab604e856cdaac2b4238df95343b045c3e1f6a0, built fromTimmyTurner51/FEXfh6-devat3fe750d85. The four patches infex/reproduce it from FEXmainat14c92681.
These remain compatibility fixes, not anti-cheat bypasses.
FH6 FEX 1.1
Patched FEX for Forza Horizon 6 on ARM64 Android.
DroidDeck users: download fh6-fex-droiddeck.wcp and follow the 5 steps in the README. Import it as FEX FH6-1.1.
1.1 fixes a hard halt when entering the garage / world: FEX's dynamic L1 lookup table is now recommitted when it grows, so Windows does not leave those pages decommitted.
Highway overlay on Snapdragon 8 Elite / Adreno 830 at 1590x720: about 31 AVG FPS, 1% low around 12 when city buildings stream in.
Keep FEX_TSOENABLED=1, FEX_HALFBARRIERTSOENABLED=1, and FEX_POOL_CLONE=1. Optional: FEX_FH6_FASTUD=1.
FEX DLL sha256: fabe72ddd2366b9cdb82bc102f3528e03c373565b727d9b72c3c77e837797679
FH6 FEX 1.0
Patched FEX for Forza Horizon 6 on ARM64 Android.
DroidDeck users: download fh6-fex-droiddeck.wcp and follow the 5 steps in the
README:
- Install DroidDeck-Proton 11-12.3 or newer from Setup (Valve's Proton Experimental won't work).
- Components → Import .wcp → this file.
- Forza Horizon 6's profile: Proton DroidDeck-Proton, FEX FH6-1.0, preset Denuvo,
plus the custom FEX variablesFEX_TSOENABLED=1andFEX_HALFBARRIERTSOENABLED=1. - Launch.
fh6-fex-gamenative.wcp is the same FEX in the GameNative/Winlator FEXCore format (untested).
FEX DLL sha256: 67dc9fda8eba55accd7c952f873e68b01ac021618e4efcb44ace85d735e045eb