Skip to content

Releases: fladnaG86/FH2-Port-AppleSilicon

FH2 Port 0.1.9

Choose a tag to compare

@fladnaG86 fladnaG86 released this 01 Nov 10:57

New

  • Forza Horizon 3 starts and is playable (1.0.125.0): played here on an M1 Max with Azimuth 1.0.2. FH3 uses Azimuth's private VC14 runtime, which Wine replaced with its builtin DLLs, so Azimuth stopped with Private VC14 runtime was overridden. The install now sets vcruntime140, vcruntime140_1, msvcp140 and concrt140 to native for azimuth.exe.

Fixed

  • The app now reinstalls whenever its version changes, not only when the layer DLLs differ. The layer DLLs in this release are the same as in 0.1.8.

Still open

  • MSAA (anti-aliasing 2x/4x in Azimuth's settings) still draws dashes in the sky on D3DMetal. Keep anti-aliasing off and use a render height above your screen's ("supersampled") for smooth edges.
  • #14: hitches and input delay above 30 fps on some Macs, under investigation.

Update

Download FH2-Port-0.1.9.dmg, replace the app in /Applications and open it: the overrides are applied on the first launch. To add FH3, pick its folder in Azimuth (the package folder containing Mount, e.g. Opus_1.0.125.0_x64__8wekyb3d8bbwe). If it sits on an exFAT disk, remove the ._ files first with dot_clean -m <folder>.

Tested on MacBook Pro M1 Max, macOS 27.2, CrossOver (Wine 11.0) with GPTK 4.0b3, Azimuth 1.0.2.

SHA-256 FH2-Port-0.1.9.dmg: 2c2acb3f4449a3009b46c245a0a9a3920ab787e01746feb61d79084a71a9189d

FH2 Port 0.1.8

Choose a tag to compare

@fladnaG86 fladnaG86 released this 28 Oct 20:49

Fixed

  • Car customisation, purchase and upgrade screens with anti-aliasing on no longer stop the game with Azimuth stopped: … the host takes no 8 samples of format 10 (#15). The showroom renders into 8x MSAA targets; Apple GPUs take at most 4x, so D3DMetal offers no 8x. The layer now creates those targets and their pipelines with 4 samples. FH2_MSAA8=0 turns this off.

New

  • The fiber fix finds the game's inline fiber reads at run time and also knows Forza Horizon 2 Presents Fast & Furious, Forza Horizon 3, Forza Motorsport 5 and Forza Motorsport 6 (#3, thanks @danielgpinheiro). Forza Motorsport 6 is playable: started and played here on an M1 Max with Azimuth 1.0.2 (without this layer it crashes on the splash, reading 0x8ff). The other titles were tested by the PR author on Azimuth 1.0.2.

Still open

  • MSAA (anti-aliasing 2x/4x in Azimuth's settings) still draws dashes in the sky on D3DMetal. Keep anti-aliasing off and use a render height above your screen's ("supersampled") for smooth edges.
  • #14: hitches and input delay above 30 fps on some Macs, under investigation.

Update

Download FH2-Port-0.1.8.dmg, replace the app in /Applications, open it and press Install again so the new d3d12.dll is copied into your Azimuth folder. data\logs\fh2port.log then shows MSAA: the host takes no 8 samples, 8x targets and pipelines are made 4x.

Tested on MacBook Pro M1 Max, macOS 27.2, CrossOver (Wine 11.0) with GPTK 4.0b3, Azimuth 1.0.2.

SHA-256 FH2-Port-0.1.8.dmg: 73adcad7d948a6295fcf4fead8f0736112d5e9d9831048d5fcd7c4121be44a5a

FH2 Port 0.1.7

Choose a tag to compare

@fladnaG86 fladnaG86 released this 27 Oct 15:59

Azimuth 1.0.x works again, and the stutter near buildings is gone.

Fixes

  • Azimuth 1.0.x freeze (#14, #13): the game froze after a few seconds to a few minutes, with Azimuth's GPU watchdog reporting all work executed but the fence stuck. Azimuth 1.0 drives two GPU queues at once; the layer held every queue's signals with one fence and one worker thread, so one queue could end up waiting for a signal only the other's later work would set. Each queue now has its own fence, list and worker.
  • Stutter in busy places (#12; the buildings around Place Masséna, for example): near busy places Azimuth reserves memory with VirtualAlloc2, asking for an address between 4 GB and 1 TB. Wine looks for room from the bottom of that range, trying every 64 KB with mach_vm_map, and right above 4 GB macOS keeps Wine, Rosetta, D3DMetal and Metal: thousands of failed tries, 40–170 ms per call, 2–7 s of every 10 s while driving there. The layer now picks a free address in the upper half of the range and asks for exactly that one. Measured on an M1 Max: allocations went from 2–7 s per 10 s to 0–34 ms, worst call from 174 ms to under 1 ms.
  • FlushProcessWriteBuffers no longer reads every thread's registers: one page protection change (macOS mprotect, called directly) drains the other cores' write buffers. About 17 µs instead of 1.8 ms per call, and it cannot hang inside thread_get_state (seen once with a single caller on 1.0.2).

Updating

Download the DMG, replace the app and open it: it reinstalls the layer by itself. Your saves are not touched.

If you move to Azimuth 1.0.2: saves live in each Azimuth folder (data/titles/1A96545B/saves). Unzip the new Azimuth over the old folder, or copy data/titles from the old folder into the new one before the first start; then open FH2 Port with Option held and pick the new folder if it changed.

Switches

FH2_PLACE=0 leaves address placement to Wine, FH2_FLUSH=real restores the 0.1.5–0.1.6 flush, FH2_VMSTATS=12 logs virtual memory calls every 10 s (count, cost, call shapes, callers).

Tested on a MacBook Pro M1 Max (32 GB), macOS 27.2, CrossOver (Wine 11), GPTK 4.0b3, with Azimuth 1.0.2. Azimuth 0.9.10 starts with this layer too, but this release was played on 1.0.2 only: 1.0.2 is the recommended version.

FH2 Port 0.1.6

Choose a tag to compare

@fladnaG86 fladnaG86 released this 23 Oct 18:05

FH2 Port 0.1.6

About half the stutter in busy places (for example the buildings around Place Masséna in Nice).

Wine on macOS gives threads of normal Windows priority Mach priority 26, below the 31 native apps get. Azimuth's worker, queue, DMA engines and many of the game's threads run there, so in heavy scenes they wait for a core and frames come late. The layer now raises them every 2 s to above-normal, which Wine maps to 31.

Measured on screen recordings of the same route (late frames per minute):

over 30 ms over 50 ms over 100 ms
0.1.5 230 72 21
0.1.6 145 36 12

Going higher (highest, Mach 35) gave nothing more. What is left is the game's own code running short of CPU under Rosetta.

FH2_PRIO=0 turns it off, FH2_PRIO=<n> picks another target priority. Includes the freeze fix from 0.1.5.

Install: download FH2-Port-0.1.6.dmg, replace the old app, open it and press Install again so the new d3d12.dll is copied into your Azimuth folder. data\logs\fh2port.log then shows priorities: … raised to 1 lines.

SHA-256: dc1f4f4a76c63c9f770e8ff66aa0f5dd2f71578c97e3d6fb4d7c305f829b6af3

FH2 Port 0.1.5

Choose a tag to compare

@fladnaG86 fladnaG86 released this 23 Oct 17:19

FH2 Port 0.1.5

Fixes the random freeze (picture stops, Azimuth's watchdog reports "the immediate context's worker at operation X of Y") that could hit after anything from 1 to 30 minutes, in the intro movie or in game — issues #5, #6, #7.

Cause: Wine on macOS implements FlushProcessWriteBuffers by reading the registers of every thread; under Rosetta two threads doing that at the same time wait on each other forever. Azimuth calls it very often from several threads. The layer now hooks ntdll's NtFlushProcessWriteBuffers in memory and lets one call through at a time (Azimuth and the game files stay untouched).

Also: new diagnostic switches FH2_FLUSH=0|nolock|skip, FH2_QUIET=1, and slow: log lines for D3DMetal calls over 4 ms.

Known: stutter in busy places (e.g. Place Masséna in Nice) is the game's own threads running short of CPU under Rosetta, not the GPU or the layer.

Install: download FH2-Port-0.1.5.dmg, replace the old app, open it and press Install again so the new d3d12.dll is copied into your Azimuth folder.

SHA-256: eeb544fc4295af0b7e3d2ddcd0cd59358980dcd33675112275946cc8ced48bcb

FH2 Port 0.1.4

Choose a tag to compare

@fladnaG86 fladnaG86 released this 21 Oct 09:05

Fixes

  • CrossOver Preview is detected: the launcher only accepted /Applications/CrossOver.app. It now finds CrossOver or CrossOver Preview in /Applications or ~/Applications and runs the game with it (Preview uses the same bottles folder).
  • Heap / DX12 error before choosing the game folder: the install steps said to start azimuth.exe from CrossOver first. Without this layer Azimuth stops at its D3D12 checks before it asks for the game folder. Don't do that: open FH2 Port, choose the bottle and the folder with azimuth.exe; the app installs the layer and starts Azimuth, which then asks for your game folder. Open the app once more afterwards so it applies its settings.
  • README and "READ ME FIRST" updated accordingly. d3dcompiler_47.dll goes in the same folder as azimuth.exe.

Includes 0.1.3 (bottles in a custom Bottles folder, e.g. an external SSD, plus Other bottle folder…).

Updating: open the new app once; it replaces the installed DLLs by itself.

Download: FH2-Port-0.1.4.dmg (arm64, macOS 15+, ad-hoc signed: "Open Anyway" in Privacy & Security the first time).
sha256 39dd2eb33533b483f8aa0a362dc40b2462aa2b6bf5ce680d6b57db17b891f9ff

Not affiliated with Microsoft, Playground Games, Almost There Games, CodeWeavers or Apple. Do not send reports about this setup to Almost There Games.

FH2 Port 0.1.3

Choose a tag to compare

@fladnaG86 fladnaG86 released this 21 Oct 07:30

Fix

  • "No CrossOver bottle found" with bottles outside the default folder (#4): the launcher only looked in ~/Library/Application Support/CrossOver/Bottles. It now also finds bottles in the Bottles folder chosen in CrossOver's preferences (for example on an external SSD), in BottlePath from CrossOver.conf and in CX_BOTTLE_PATH. If a bottle is still not listed, pick Other bottle folder… and choose the bottle's folder (the one with drive_c).
  • scripts/install.sh and scripts/run.sh accept a full path in BOTTLE as well as a name.

Updating: open the new app once. Existing setups in the default folder keep working without choosing again.

Download: FH2-Port-0.1.3.dmg (arm64, macOS 15+, ad-hoc signed: "Open Anyway" in Privacy & Security the first time).
sha256 586716ec8c35265dac3c1b0066a946cc8bf26a8f9a53c151102b68036ff14726

Not affiliated with Microsoft, Playground Games, Almost There Games, CodeWeavers or Apple. Do not send reports about this setup to Almost There Games.

FH2 Port 0.1.2

Choose a tag to compare

@fladnaG86 fladnaG86 released this 20 Oct 19:37

Fixes

  • Startup crash in d3d12.dll ("reading 0x1ff0000"): the thread that looks for the game image read memory the wrapper was remapping. It now reads through ReadProcessMemory, which fails instead of crashing.
  • Startup crash at game+0x1088444 (fiber read): when the game started running within a second of being loaded, a fiber read could run before the in-memory patch. A vectored exception handler now catches that case, corrects the registers, applies the patch and resumes.

With 0.1.1's command-list fix and these, a 31-minute session at 60 fps ran without crash or hang (it used to stop after 8–20 minutes). Please report it if it still happens.

Video: see the video release — a race at about 60 fps on an M1 Max with the Metal HUD.

Updating: open the new app once; it replaces the installed DLLs by itself.

Download: FH2-Port-0.1.2.dmg (arm64, macOS 15+, ad-hoc signed: "Open Anyway" in Privacy & Security the first time).
sha256 67fa7381f35c416ab1e444f9ed8df2dfcadcfe781a77eda804f1512e78141624

Not affiliated with Microsoft, Playground Games, Almost There Games, CodeWeavers or Apple. Do not send reports about this setup to Almost There Games.

FH2 Port 0.1.1

Choose a tag to compare

@fladnaG86 fladnaG86 released this 20 Oct 17:53

Fix: the D3D12 layer kept the immediate writes of each command list in a table that never freed its entries. After the game had created 4096 command lists, the writes of new lists were silently lost and the game could wait forever for those values. Entries are now freed when a list is destroyed, the table is larger, and a full table is logged.

Diagnostics for the remaining hang: FH2_LABEL=<address> traces a GPU-written value through record → execute → signal → completion, and the stacks control command logs the Windows-side call stack of every thread.

Still open: after some minutes the game can still stop waiting for a GPU-written value (Azimuth's "the GPU passed the work that writes the value …" or its watchdog). Azimuth's worker appears blocked inside a graphics call; investigation continues.

Updating: open the new app once; it replaces the installed DLLs by itself.

Download: FH2-Port-0.1.1.dmg (arm64, macOS 15+, ad-hoc signed: "Open Anyway" in Privacy & Security the first time).
sha256 879404e9990dc72905a3742dc139b0c9b7b3b170cb3699970b7b26e1743a46b8

Not affiliated with Microsoft, Playground Games, Almost There Games, CodeWeavers or Apple. Do not send reports about this setup to Almost There Games.

FH2 Port 0.1.0

Choose a tag to compare

@fladnaG86 fladnaG86 released this 20 Oct 17:08

First release. Runs Azimuth 0.9.10 (Forza Horizon 2 for Xbox One, 1.0.0.64) on Apple Silicon Macs through CrossOver + D3DMetal, without modifying Azimuth or the game files.

Download: FH2-Port-0.1.0.dmg (arm64, macOS 15+, ad-hoc signed: use "Open Anyway" in Privacy & Security the first time). Read READ ME FIRST.txt in the DMG.

You need your own copy of the game, Azimuth from https://almost-there-games.itch.io/azimuth, a Windows 10 64-bit CrossOver bottle and Microsoft's d3dcompiler_47.dll (see the README). Almost There Games does not support setups with third-party layers: report problems here, not to them.

  • D3D12 layer: heap/immediate-write emulation, feature reports, fix for D3DMetal's APPEND_ALIGNED_ELEMENT offsets (phantom walls, broken trees), in-memory fiber fix for the game
  • Keyboard + controller as one virtual gamepad
  • Launcher app: picks bottle and Azimuth folder, installs, sets anti-aliasing off and 1440 supersampling, starts the game

Known issues: GPU-reset crash after ~8–20 minutes ("the GPU passed the work that writes the value …"), rare hang, MSAA must stay off, intro movies play.

sha256 1488dedf141c66c91f6fa951421405fda044198a645ab21163dcb5305d7a67fb

Not affiliated with Microsoft, Playground Games, Almost There Games, CodeWeavers or Apple.