Skip to content

Releases

FH6 FEX 1.2

Choose a tag to compare

@TimmyTurner51 TimmyTurner51 released this 13 Nov 01:07

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.patch in 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 from TimmyTurner51/FEX fh6-dev at 3fe750d85. The four patches in fex/ reproduce it from FEX main at 14c92681.

These remain compatibility fixes, not anti-cheat bypasses.

FH6 FEX 1.1

Choose a tag to compare

@TimmyTurner51 TimmyTurner51 released this 07 Nov 18:16

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

Choose a tag to compare

@TimmyTurner51 TimmyTurner51 released this 07 Nov 05:28

Patched FEX for Forza Horizon 6 on ARM64 Android.

DroidDeck users: download fh6-fex-droiddeck.wcp and follow the 5 steps in the
README:

  1. Install DroidDeck-Proton 11-12.3 or newer from Setup (Valve's Proton Experimental won't work).
  2. Components → Import .wcp → this file.
  3. Forza Horizon 6's profile: Proton DroidDeck-Proton, FEX FH6-1.0, preset Denuvo,
    plus the custom FEX variables FEX_TSOENABLED=1 and FEX_HALFBARRIERTSOENABLED=1.
  4. Launch.

fh6-fex-gamenative.wcp is the same FEX in the GameNative/Winlator FEXCore format (untested).

FEX DLL sha256: 67dc9fda8eba55accd7c952f873e68b01ac021618e4efcb44ace85d735e045eb