Repository navigation
Releases: athei/mach9
Release list
arm64-11.20-4
- Wine: athei/wine@arm64-patched (00039fa4d4f, wine-11.20-33)
- Scripts: 2adc3e49ae6
- FEX: athei/FEX@macos-patched (e5ac8008928)
- Mesa: athei/mesa@macos-patched (4d597245b76)
- DXMT: athei/dxmt@macos-patched (73cba75ecd2)
- vkd3d-proton: athei/vkd3d-proton@macos-patched (2ce454c8132)
- GStreamer: GStreamer/gstreamer@1.28.8 (1b2a95a1b72)
Changes since arm64-11.20-3
- compatdb
- Rules that name an executable fold after every
*rule: built-in*,WINE_COMPATDB*, built-in exe rules,WINE_COMPATDBexe rules.- Before, every
WINE_COMPATDBrule folded after every built-in rule, so a launcher*rule overrode the built-in rules for single programs. exe=*;dxgi=wined3dnow leaves the Steam web helper on DXMT; a launcher rule that names the helper still changes it.
- Before, every
- New key
metal_hud(true,false,default):truesetsMTL_HUD_ENABLED,MTL_HUD_ALIGNMENTandMTL_HUD_ELEMENTS,falseremoves them.- An
enventry for one of these variables in the same or a later rule wins.
- An
- New list key
debug_channels: compatdb.so only logs it, since Wine readsWINEDEBUGbefore compatdb.so loads. The launcher adds it toWINEDEBUG(Table::winedebug). - The log has a
metal_hudline and adebug_channelsline; the other lines are unchanged. - The built-in Steam web helper and Social Club helper rules set
metal_hud=falseand keepenv=MTL_HUD_ENABLED=0, so a launcher*rule withmetal_hud=truedoes not reach them and the log shows the HUD off. WINE_COMPATDBparsing:- Keys,
true,false,defaultand the legacyv=header are read in any case and written in lowercase. Values such asdxgi=DXMTwere already case-insensitive. %XXescapes decode to UTF-8 bytes (%C3%A9isé), not Latin-1. Escapes that are not UTF-8, or%00, drop the field.- Ignored with a warning: an empty
argumentsentry, adll_overridesentry without=, anenvname that is empty or holds=(%3D), a NUL. - A second field for a matcher or a scalar still replaces the first, now with a warning. A
%without two hex digits is still kept as written, now with a warning.
- Keys,
- Rules that name an executable fold after every
- compatdb-core
- The crate
compatdb-tableis renamedcompatdb-core. Depend on it at the bundle's tag:compatdb-core = { git = "https://github.com/athei/mach9", tag = "arm64-11.20-4" }. - The rustdoc is the spec of the format and the API: https://docs.mach9.app
- Wire compatibility
- The format has no version. A value written with
compatdb-tablefrom arm64-11.20-3 reads the same, except for the parsing changes above. - On an older bundle,
metal_hudanddebug_channelsfields are ignored with a warning and the rest of the rule applies.
- The format has no version. A value written with
- The API is reworked: typed rules, strict and lenient parsing, a settings layer for config text, the built-in rules as a public module, and
Table::previewto show what a program gets. Table::parse,Table::to_env_value,Resolution::origin,Resolution::reset_originandResolution::apply_wined3dare gone, so a launcher built againstcompatdb-tablehas to be ported.- The rustdoc documents every public item.
- The crate
- Repository
- The repository is now github.com/athei/mach9.
- docs.yml publishes the compatdb-core rustdoc on pushes to main that change
compatdb/. release.yml runscargo testandcargo clippy -D warningson both compatdb crates before the build.
arm64-11.20-3
- Wine: athei/wine@arm64-patched (00039fa4d4f, wine-11.20-33)
- Scripts: fce6ba5997a
- FEX: athei/FEX@macos-patched (e5ac8008928)
- Mesa: athei/mesa@macos-patched (4d597245b76)
- DXMT: athei/dxmt@macos-patched (73cba75ecd2)
- vkd3d-proton: athei/vkd3d-proton@macos-patched (2ce454c8132)
- GStreamer: GStreamer/gstreamer@1.28.8 (1b2a95a1b72)
Changes since arm64-11.20-2
- Wine
- The WMA decoder DMO implements
GetInputStreamInfo,GetOutputStreamInfoandGetInputStatus, which were stubs (#33).- Halo 2 called
GetInputStatus, ignored the failure and had no in-game sound.
- Halo 2 called
- Wine loads the bundled GStreamer plugins and keeps its own GStreamer registry (#33).
GST_PLUGIN_SYSTEM_PATH_1_0andGST_REGISTRY_1_0get bundle defaults when unset;GST_PLUGIN_PATHis cleared so a Homebrew GStreamer does not load.
- On a display below 60 Hz, every mode is listed at the display's refresh rate.
- Before, setting the current mode or another size on such a display (59.94 Hz, a 30 Hz panel) failed with
DISP_CHANGE_BADMODE. - Displays in portrait orientation are not fixed.
- Before, setting the current mode or another size on such a display (59.94 Hz, a 30 Hz panel) failed with
- The WMA decoder DMO implements
- FEX
- A zero-length
ReadFileinto a NULL buffer no longer discards all compiled code: NosTale's splash screen takes 4.5 s instead of 112.5 s.
- A zero-length
- Bundle
- winegstreamer is built and bundled, with GStreamer 1.28.8 and FFmpeg's LGPL decoders in
lib/external(#33).wmadmod.dllfailed before becausewinegstreamer.dllwas missing. No system GStreamer is needed.
- mtld3d v0.15.1
- Occlusion queries no longer run out past about 500 per frame, which answered every further query as fully visible (athei/mtld3d#1191).
D3DRS_SRGBWRITEENABLEencodes only the 8-bit RGBA/RGBX formats and writes all others linear, including float targets; fixes the blurred goal cut-scenes in PES 2017 (athei/mtld3d#1185).- Fixed-function sphere-map texgen generates the right coordinates, and fog with equal start and end matches D3D9 (athei/mtld3d#1187).
- A lockable multisampled back buffer is refused with
D3DERR_INVALIDCALL, as on Windows (athei/mtld3d#1184).
- winegstreamer is built and bundled, with GStreamer 1.28.8 and FFmpeg's LGPL decoders in
arm64-11.20-2
- Wine: athei/wine@arm64-patched (9d810534147, wine-11.20-32)
- Scripts: c454191fc21
- FEX: athei/FEX@macos-patched (03f23f60328)
- Mesa: athei/mesa@macos-patched (4d597245b76)
- DXMT: athei/dxmt@macos-patched (73cba75ecd2)
- vkd3d-proton: athei/vkd3d-proton@macos-patched (2ce454c8132)
Changes since arm64-11.20-1
- Wine
- msync: PulseEvent releases the threads that wait on the event at the time of the pulse (#25).
- Before, a waiter the pulse woke usually found the event reset again and kept waiting, and a wait on several objects never saw a pulse.
- The server protocol changed. A wineserver of an earlier bundle that still runs on a prefix has to exit (
wineserver -k) before this bundle uses that prefix.
- msync: PulseEvent releases the threads that wait on the event at the time of the pulse (#25).
- FEX
- Reduced precision x87 honours the precision control of the x87 control word (#25).
- With 24-bit precision a result is the one the x87 gives, computed as a 32-bit float. Results at 53 and 64-bit precision are unchanged.
- Reduced precision is on for every process through a built-in compatdb rule, so the change applies to every 32-bit game.
- 24-bit results have the exponent range of a 32-bit float, and MXCSR's flush to zero also flushes their subnormal results (#28).
- Loading the x87 control word no longer turns on flush to zero.
- Delphi programs load one with the infinity control bit set, which flushed subnormal results of all their SSE and x87 code to zero.
- FLDCW, FLDENV and FNINIT set only the rounding mode; only an MXCSR write changes flush to zero.
- Thread contexts of 32-bit threads carry their MXCSR, and the threads keep their rounding mode and flush to zero across calls out of emulated code.
- Reduced precision x87 honours the precision control of the x87 control word (#25).
- Bundle
- mtld3d v0.15.0
- The resolution list offers every size Wine lists at every refresh rate, smallest first, as a display driver does (athei/mtld3d#1172).
- Before, it offered at most 15 sizes at the panel's refresh rate only; LEGO Indiana Jones found no size 1600 or wider on a display above 85 Hz.
display.maxResolutionsinmtld3d.confbounds the list. The built-in World of Warcraft profile sets 32.
- A 32-bit device switches the creating thread's x87 control word to single precision unless the game passes
D3DCREATE_FPU_PRESERVE, as D3D9 does. - A fullscreen device activates its window, so a game that never activates it has keyboard input from the start (athei/mtld3d#1174).
- The resolution list offers every size Wine lists at every refresh rate, smallest first, as a display driver does (athei/mtld3d#1172).
- LEGO Indiana Jones: The Original Adventures gets past its boot splash and plays (#25).
- It needs this release's FEX and mtld3d changes together.
- The music after New Game no longer loops.
- The
WINE_COMPATDBworkaround from #25 (wined3d with full x87 precision) is no longer needed; remove it to get mtld3d and reduced precision back.
- The symbols archive is compressed at a faster xz preset: 362 MB instead of 305 MB for arm64-11.20-1.
- mtld3d v0.15.0
arm64-11.20-1
- Wine: athei/wine@arm64-patched (9c44ed65ef4, wine-11.20-32)
- Scripts: 3faa496fab9
- FEX: athei/FEX@macos-patched (8be430d406c)
- Mesa: athei/mesa@macos-patched (4d597245b76)
- DXMT: athei/dxmt@macos-patched (73cba75ecd2)
- vkd3d-proton: athei/vkd3d-proton@macos-patched (2ce454c8132)
Changes since arm64-11.19-3
- Wine
- Rebased onto wine-11.20.
- Display modes and window placement (#22)
- A display mode a program sets while it is in the background is reported as the current mode at once (EnumDisplaySettings, monitor and work area, screen metrics). The screen still only switches when the program is activated, as upstream.
- A titled window a program places at the top of the screen stays there; AppKit no longer moves it below the menu bar.
- OpenGL through EGL and Zink (#21)
- DPI-virtualized windows render at their virtual size and are scaled to the window on present.
- sRGB pixel formats are only reported for EGL configs that have an sRGB variant.
- A window moved between a Retina and a non-Retina display keeps the right scale with retina mode off.
- explorer.exe no longer initializes OpenGL, so a new session is ready sooner and uses less memory.
- Crash fixes in win32u's EGL setup, two of them upstream bugs.
- Child windows that draw into their top-level window, such as the chat box of Age of Empires II HD, show above DXMT and mtld3d frames.
- A process no longer crashes or skips its event loop at startup on a loaded machine.
- Fixed an assertion in ntdll when an aligned allocation met a reserved area, a wine-11.20 regression that FEX's allocator hit.
- NtWriteVirtualMemory into read-only memory returns STATUS_PARTIAL_COPY, as on Windows (#11).
- ARM64EC
- The exception dispatcher no longer faults on an unwound address above user space.
- QUEUE_USER_APC_CALLBACK_DATA_CONTEXT is supported.
- FEX
- Rebased onto upstream FEX main as of 2026-10-22.
- A POP to memory that faults leaves RSP unchanged (#9).
- Segment registers
- IRET to a null selector, a selector past the end of its table and a null or code selector in SS raise the access violation Windows raises.
- Writing GS on x86_64 no longer hangs the process.
- INT 0x2D with the kernel debugger services raises no exception on x86_64, as on Windows.
- With a debugger attached, an x64 breakpoint is reported with RIP after the INT3, so the debugger continues at the right address.
- ARM64EC keeps the x87 state across an exception a handler continues from, a syscall and a thread suspend (#13).
- Before, x87 values could be read from the wrong register or rounded to a double afterwards.
- UnmapViewOfFile of memory that is not a mapped view no longer drops the tracking of live code, which crashed 32-bit programs (#10).
- TerminateProcess no longer hangs or crashes on a process with a thread that never ran.
- A store into the page of the running code keeps DF, the MMX registers and the upper YMM halves.
- Fixes "Unable to load function: (KERNEL32.dll)" in the Age of Empires II HD installer and other programs packed with PEtite.
- Memory a program made executable while DEP is off keeps its execute bit in VirtualQuery.
- Mesa (KosmicKrisp and Zink)
- Rebased onto Mesa main as of 2026-10-22.
- Presents no longer stall for up to a second while the window is covered by another app's window or minimized (#17).
- A window that shows nothing is paced at the refresh rate on the CPU (#18).
- Swap intervals 2 to 4 work for OpenGL through Zink (#18).
- More than 32 windows with a swapchain no longer abort on Metal's residency set limit (#18).
- KosmicKrisp adds VK_EXT_non_seamless_cube_map, stippled lines, non-solid fill modes and point size polygon mode.
- Zink draws GL_LINE polygon mode as lines instead of filled, and runs with optimal_keys.
- Alpha to coverage with blending is fixed.
- DXMT
- Rebased onto upstream DXMT main, which adds SwapDeviceContextState and DXGI surfaces (#14).
- Direct2D on DXMT works; before, d2d1 crashed at startup.
- Device teardown no longer hangs at random (#16).
- Direct3D 11
- Deferred contexts execute command lists.
- Render target views of buffers, back buffers other than buffer 0, and staging textures of D24_UNORM_S8_UINT and D32_FLOAT_S8X24_UINT.
- Unbound samplers use the default sampler state.
- CheckFormatSupport, state object descriptions and shader bytecode validation match Windows.
- DXGI: window association, Alt+Enter and output ownership.
- Rebased onto upstream DXMT main, which adds SwapDeviceContextState and DXGI surfaces (#14).
- vkd3d-proton
- The frame latency handle is released when the GPU has completed a present, not when the present is on screen (#20).
- With vsync, a game that waits on it at latency 1 runs at up to the refresh rate instead of half of it on a 120 Hz display, without the extra frame of latency the old rule added.
- Without vsync, such a game runs as fast as upstream, which is slower than with the old rule.
VKD3D_SWAPCHAIN_MIN_LATENCY_FRAMESand the built-in rule that set it are gone.
- Present gives up waiting on the internal latency after 1 s, so it no longer blocks forever behind a queue that waits on a later fence (#19).
- KosmicKrisp is no longer taken for an AMD driver under some
WINEDEBUGsettings.
- The frame latency handle is released when the GPU has completed a present, not when the present is on screen (#20).
- compatdb
- Rules have no names. Every matching rule applies, and
WINE_COMPATDBrules apply after the built-in ones, so their values win.name=andenabled=are ignored with a warning. To undo a built-in rule, set its values.- Every scalar key takes
default, which gives the setting back to upstream Wine; adll_overridesentry takes<names>=default. - The log names the source of every value.
arguments_overridereplaces the arguments earlier rules added; an empty one clears them.force_nxandopenglare now keys instead of theWINE_FORCE_NXandWINE_MAC_OPENGLvariables, which are gone.- Both apply to the process only, not to the programs it starts.
- On a Mac without a Metal 4 GPU, set
WINE_COMPATDBtoexe=*;opengl=cglinstead of exportingWINE_MAC_OPENGL=cgl.
- A new built-in
*rule setsforce_nx, so no-execute stays on in every 32-bit process.- A program that runs code from memory it did not make executable, such as one built with the ATL of Visual Studio 2003, crashes with it. A rule with
force_nx=falsefor that program fixes it.
- A program that runs code from memory it did not make executable, such as one built with the ATL of Visual Studio 2003, crashes with it. A rule with
- 32-bit processes no longer get 4 GB by default; the executable's flag decides, as upstream. A built-in rule gives World of Warcraft 4 GB.
- Age of Empires II HD runs DPI-unaware, so its UI has its intended size.
- Rules have no names. Every matching rule applies, and
- Bundle
- mtld3d v0.14.2
- A game that draws GDI right after its Direct3D 9 device attaches no longer flashes a white window for a frame.
- An empty layer no longer covers a window's GDI drawing before a new device's first frame.
- There are no more compatdb-* releases; compatdb changes ship in arm64-* releases.
- mtld3d v0.14.2
arm64-11.19-3
Wine distribution built from athei/wine@arm64-patched (e07aff5d100, wine-11.19-18) with e1f8349a469.
- FEX: athei/FEX@macos-patched (13e6b754913)
- Mesa: athei/mesa@macos-patched (0b83cb23450)
- DXMT: athei/dxmt@macos-patched (ca8521e0a68)
- vkd3d-proton: athei/vkd3d-proton@macos-patched (cdbfbb7f8ca)
- Homebrew libraries:
- brotli 1.2.0
- freetype 2.15.0
- gettext 1.0
- gmp 6.3.0
- gnutls 3.8.13_2
- libidn2 2.3.8
- libpng 1.6.59
- libtasn1 4.21.0
- libunistring 1.5
- nettle 4.0
- p11-kit 0.26.5
- sdl2-compat 2.32.74
- sdl3 3.4.18
Changes since arm64-11.19-2
- arm64-11.19-2 was built from athei/wine d57b522eea5 and athei/FEX 977affeb7.
- Wine
- Raw mouse input (WM_INPUT and DirectInput) comes from GameController mice in unaccelerated device counts, instead of the accelerated and scaled cursor movement.
- Off in Wine itself; the built-in compatdb rule
gcmouseturns it on for every process. gcmouse=falsein a game's rule, or dropping thegcmouserule, gives back the cursor movement.
- Off in Wine itself; the built-in compatdb rule
- The macOS input method candidate window is placed at the caret, or at the bottom left of the focus window's client area, for programs that never place it, instead of in a corner of the screen.
- The Mac Driver option
IMEFallbackPosition("x,y" in client coordinates of the focus window) replaces that fallback when set.
- The Mac Driver option
- Cmd-Tab away from a full-screen game no longer bounces straight back into it.
ActivateKeyboardLayoutnow selects the layout it is given. Before, every layout selected the first input source (an upstream wine-11.19 bug).- OpenGL can run on Mesa's Zink over KosmicKrisp through EGL: OpenGL 4.6 with the compatibility profile.
WINE_MAC_OPENGL=eglselects EGL;cglor unset selects Apple's OpenGL, as upstream. The built-in compatdb ruleopengl-eglsetsegl.- With
eglthere is no fallback: on a Mac without a Metal 4 GPU a process gets no OpenGL. ExportWINE_MAC_OPENGL=cglthere. - wined3d's OpenGL renderer reaches feature level 11_1 on Zink. The feature level 10 changes for Apple's OpenGL are dropped, so wined3d on Apple's OpenGL is back at 9_3.
- A new prefix finishes booting on a Mac where EGL does not initialize; win32u runs without OpenGL there instead of hanging.
- Steam's store page no longer flickers black: the client views of child windows follow the Win32 z-order.
- GDI drawing over a Direct3D window, such as a chat box with a blinking caret, no longer flashes on every window surface flush.
- Letterboxed full-screen content in an emulated display mode is drawn inside its black bars, also in retina mode, and the bars go away when the window leaves full screen.
- A screen-sized window whose shape leaves most of it empty, such as an InstallShield background, no longer hides the Dock and menu bar.
- wined3d draws table fog with equal start and end correctly.
- Raw mouse input (WM_INPUT and DirectInput) comes from GameController mice in unaccelerated device counts, instead of the accelerated and scaled cursor movement.
- FEX
- Code in the last page of an executable section of an image loaded after startup is executable, as on Windows. Before, it raised a no-execute fault, or an access violation for a write in a writable code section.
- compatdb
- The dxgi and d3d9 defaults come from the built-in
*rulesdxmt(dxgi=dxmt) andmtld3d(d3d9=mtld3d).- Without a rule both families get wined3d, as upstream. Dropping one of the rules by name gives every process wined3d for that family.
- The wined3d dxgi tree has no Direct3D 12.
- The
WINE_COMPATDBformat has no header line any more.- A launcher on the new compatdb-table crate needs this bundle: the compatdb.so of earlier arm64 releases requires a
v=6header and ignores a table without one. - This compatdb.so still accepts a table that starts with a
v=Nline.
- A launcher on the new compatdb-table crate needs this bundle: the compatdb.so of earlier arm64 releases requires a
- An unknown key or a bad value only drops that field, with a warning; the rest of the record applies.
enabledtakes exactlytrueorfalse; another value is ignored and the rule stays enabled.
- The env entries of the built-in
*rules are defaults: a variable exported where the process starts wins over them.- This covers
WINE_MAC_OPENGL,FEX_X87REDUCEDPRECISIONandVKD3D_SWAPCHAIN_MIN_LATENCY_FRAMES. - Entries of
WINE_COMPATDBrules and of built-in rules for one program still replace the variable.
- This covers
- The compatdb log block of a process lists every setting with where its value came from.
- "rule ", with "changed by WINE_COMPATDB" where an override set it, or "unset" with what upstream Wine does instead.
- Each env entry says whether it was set, removed, left alone or replaced, and warnings appear inside the block.
- An override that names a built-in rule can no longer change its matchers (
exe,company,product,original_filename); they are ignored with a warning. - compatdb-table exports
BUILTIN_RULE_NAMESandis_builtin_rule_name, so a launcher can warn about such overrides. x87_sidecaranddxgi=gptkfrom the retired x86_64 Wine are gone; both are now an unknown key and value that only warn.
- The dxgi and d3d9 defaults come from the built-in
- Bundle
- Direct3D 12 through vkd3d-proton (athei/vkd3d-proton), installed in the dxmt tree and presented through DXMT's dxgi.
- The built-in rule
vkd3d-proton-min-latencysetsVKD3D_SWAPCHAIN_MIN_LATENCY_FRAMES=2, which keeps Apple GPUs at a higher clock at the cost of one frame of input latency.
- The built-in rule
- DXMT is built from athei/dxmt, which adds swapchains for vkd3d-proton devices and Direct3D 11 and DXGI fixes.
- Mesa's libEGL and Zink are bundled in
lib/externalnext to KosmicKrisp. - KosmicKrisp always advertises the features Direct3D 12 and Zink need;
MESA_KK_EXPERIMENTALand thekosmickrisp-experimentalrule are gone. - mtld3d v0.14.1.
- A window whose Direct3D 9 device was released no longer keeps showing that device's last frame.
- First release built by CI, with a true macOS 26.4 floor.
- The bundle step ran with
--strict-floor: all 59 Mach-O files meet the floor, the Homebrew libraries included. - The Homebrew libraries are the newest versions Homebrew had at build time, listed above.
- The bundle step ran with
- Direct3D 12 through vkd3d-proton (athei/vkd3d-proton), installed in the dxmt tree and presented through DXMT's dxgi.
Caveats
- The CI runner has no Metal 4 GPU and no accelerated OpenGL renderer, so the smoke test checked Vulkan, Direct3D 12 and Zink only in their no-GPU form there.
arm64-11.19-2
Wine distribution built from athei/wine@arm64-patched (d57b522eea5, wine-11.19-17) with bea504916e4.
Changes since arm64-11.19-1
- mtld3d v0.14.0, whose 64-bit build is ARM64X. x64 games run its
d3d9.dllandmtld3d.dllas native ARM64EC code instead of x86_64 code under FEX; mtld3d's own CPU time per Direct3D 9 call drops by 14 to 21 %. - DXMT is built as ARM64X, so Direct3D 10 and 11 in x64 games run natively too.
- Native ARM64 programs get DXMT for Direct3D 10 and 11 and mtld3d for Direct3D 9 by default, as x86 programs do. A compatdb rule can still give one wined3d.
- Every Direct3D placeholder in
lib/wine/aarch64-windowsis hybrid (ARM64X), so x64 and native ARM64 processes both load it. Wine's winebuild now writes the ARM64EC metadata a hybrid placeholder needs. - The bundle step now refuses any PE file under an
aarch64-windowsdirectory that an x64 process would run under emulation: each one must be ARM64X or ARM64EC. Plain ARM64 is allowed only for programs, files without code and the four WoW64 host DLLs. A Direct3D tree that holds an x86_64 build stops the bundle. lib/wine/tests/VERSIONnames the Wine build the graphics tests were built from.
Caveats
- Requires macOS 26.4, the bundle's declared minimum. This release was built locally, so SDL3, SDL2 and p11-kit carry a macOS 27.0 marking, but they use no macOS 27 API and load on macOS 26; dyld does not enforce that marking.
- No Direct3D 12 yet.
d3d12.dllis not in the bundle, so Direct3D 12 programs andd3d12_test.exedo not start. Direct3D 12 support comes in a later release.
arm64-11.19-1
Wine distribution built from athei/wine@arm64-patched (e2e42653b41, wine-11.19-17) with c0e75582530.
A native arm64 Wine
This is the first release of the arm64 Wine for Apple Silicon. It replaces the x86_64 Wine of the cx-* releases, which ran under Rosetta 2, and is built from upstream Wine 11.19 with our patches instead of CrossOver's sources. x86 programs run through FEX: 32-bit ones through xtajit, 64-bit ones as ARM64EC processes, in which every DLL that ships as ARM64X runs as native code. The cx-* releases are frozen; no new x86_64 Wine is built.
Changes since cx-26.3.0-9
- Wine (athei/wine@arm64-patched, wine-11.19 with 17 commits on top):
- Wine processes run with 4K pages instead of the 16K pages macOS uses on Apple Silicon. The loader gets them through the cross-architecture entitlement by re-executing itself before it maps anything, and ntdll starts child Wine processes with 4K pages directly. Everything in a Wine process, FEX included, then works at the page size Windows programs expect: page protections, guard pages, decommit and FEX's tracking of self-modifying code. Wine therefore runs from the signed wine.app that carries the entitlement; there is no fallback to 16K pages.
- The low 4 GB and the space up to the loader are reserved, so x64 executables built for 0x100000000 without relocations load (DirectX's infinst.exe failed with STATUS_CONFLICTING_ADDRESSES).
- FEX's JIT writes into MAP_JIT memory instead of flipping page protections (a steamclient.dll reload in Portal stalled the main thread for about 250 ms), and FEX sees the CPU's real features, so x86 code gets SSE4.2, PCLMULQDQ, AES and SHA, which Unreal Engine 5 games need.
- CrossOver 26's msync is included and on by default.
WINEMSYNC=0in the environment that starts the wineserver turns it off. WINE_FORCE_NXkeeps no-execute on permanently, so FEX stops recompiling for programs without the NX_COMPAT flag (NosTale's splash screen took about 90 seconds).- winemac exports its functions for DXMT and mtld3d to present into Wine windows, and destroying a window no longer deadlocks against another thread's window changes.
- Cursor: hiding and showing it no longer makes fullscreen presents land a refresh late (rapid clicking dropped 120 Hz to about 107 fps), the arrow no longer flickers over games, and the cursor scales with DPI-unaware windows in Retina mode.
- Fullscreen and displays: fullscreen windows hide the Dock and menu bar instead of rising above them, which keeps Mission Control working on macOS 27; HORZRES and VERTRES are no longer doubled in Retina mode; display modes without the safe flag are accepted on Apple Silicon.
- Hangs and crashes fixed in winemac and win32u: a startup race that left windows ignoring input, a deadlock when a mode change moves a window, hangs after an exception on the main thread, an AppKit crash when releasing a window, repaints waiting on a hung thread's child windows, and a window handle race.
- Glyph metrics match the drawn glyphs, so Team Fortress 2 text no longer loses columns, and Lucida Console falls back to Menlo.
- wined3d reaches feature level 10_1 on Apple's OpenGL, so d2d1 programs such as the Rockstar Games Launcher work on the default renderer. Its Vulkan renderer on KosmicKrisp is fixed for invalid Vulkan usage, P8 and other legacy formats, windowless swapchains and Direct3D 8 vertex shaders.
- Also: PS4 and PS5 controllers rumble over Bluetooth;
WINENCPU=<n>lowers the reported CPU count; microphone capture asks for permission instead of recording silence; vkd3d-proton no longer crashes on drivers with VK_KHR_maintenance7; vcruntime140_1.dll carries its version resource again (Unreal Engine prerequisites check); crash reports go to the program's terminal or log; processes Wine starts carry the wine.app name and icon.
- FEX (athei/FEX@977affeb7, upstream 5285020de with five commits on top):
- AFP is off in ARM64EC processes. Each FPCR write costs about 9 ns, and every call from x64 code into ARM64EC code and back paid for it; such a round trip goes from about 24 ns to about 5 ns. The CRT, kernel32, the Vulkan loader and wined3d are ARM64EC code, so this is the change that makes running them natively pay off. RCPSS and RSQRTSS now return exact results.
FEX_HOSTFEATURES=enableafpturns AFP back on; 32-bit processes keep it. - Hardware TSO per thread on macOS, on by default (
FEX_HARDWARE_TSO=0turns it off), so the JIT no longer emits the barriers that emulate x86 memory ordering. - JIT code buffers use MAP_JIT, which removes two faults and two
mprotectcalls per JIT write. FEX's own allocations move above 8 GB, leaving the low 4 GB to x64 games, and threads no longer commit 272 MB of lookup cache each. - A hang in about a third of process exits, suspend deadlocks and an out-of-bounds read of per-CPU data are fixed.
- x87 64-bit integer copies stay exact under reduced precision (Delphi's
System.Move, NosTale). compatdb turns FEX's reduced-precision x87 mode on by default.
- AFP is off in ARM64EC processes. Each FPCR write costs about 9 ns, and every call from x64 code into ARM64EC code and back paid for it; such a round trip goes from about 24 ns to about 5 ns. The CRT, kernel32, the Vulkan loader and wined3d are ARM64EC code, so this is the change that makes running them natively pay off. RCPSS and RSQRTSS now return exact results.
- Vulkan through KosmicKrisp (athei/mesa@46416db6940). The Vulkan loader and winevulkan ship as ARM64X, KosmicKrisp as a native arm64 driver. wined3d stays on OpenGL by default; a compatdb rule with
wined3d=vulkanmoves a game onto KosmicKrisp. - Backends per process, chosen by compatdb: x86 programs get DXMT (e86484e) for Direct3D 10 and 11 and mtld3d v0.13.0 for Direct3D 9; Direct3D 8 and DirectDraw use wined3d, which ships as ARM64X. D3DMetal is no longer bundled, and
dxgi=gptkis read asdxmt. - The bundle carries Wine's graphics tests for i386 and x86_64 under
lib/wine/tests: ddraw, d3d8 (i386 only), d3d9, d3d10, d3d10_1, d3d10core, d3d11, d3d12, dxgi, d2d1, opengl32 and vulkan-1. - A symbols archive ships beside the bundle.
Caveats
- Requires macOS 26.4, the bundle's declared minimum. This release was built locally, so SDL3, SDL2 and p11-kit carry a macOS 27.0 marking, but they use no macOS 27 API and load on macOS 26 (checked on a macOS 26.6 machine); dyld does not enforce that marking. A release built in CI drops it.
- No Direct3D 12 yet.
d3d12.dllis not in the bundle, so Direct3D 12 programs andd3d12_test.exedo not start. Direct3D 12 support comes in a later release. - The Windows side of DXMT and of mtld3d is still x86_64 code run by FEX; their unix sides are native. arm64-11.19-2 ships mtld3d and DXMT as ARM64X, so Direct3D 9, 10 and 11 games call into them as native ARM64EC code.
cx-26.3.0-9
Wine distribution built from athei/wine@cx-26-patched (93429c6e7c8) with 218222f183c.
Changes since cx-26.3.0-8
- The minimum macOS is 15 again (was 26)
- Below macOS 26.4, where GPTK's D3DMetal cannot load, a 64-bit process that would get D3DMetal gets DXMT instead, so D3D12 is not available there
- This also covers a compatdb rule with
dxgi=gptk - The process's compatdb block logs it, for example
dxgi = gptk not available on macOS 15.7.1 (needs macOS 26.4), using dxmt
- The Steam web helper uses DXMT instead of D3DMetal (built-in compatdb rule
steam-web-helper)- The Social Club UI helper (
rockstar-social-club-ui), which embeds its browser the same way, is pinned to DXMT too
- The Social Club UI helper (
- The Metal HUD is off in the Steam and Social Club browser helpers (
MTL_HUD_ENABLED=0in the same two rules)- steam.exe and the Rockstar Games Launcher get no such entry, so games started from them are not affected
- A compatdb rule's
envis now set before the process is exec'd, soX87_*entries reach that process's own x87sidecar (fixes #8)- Each query that returns entries logs a
compatdb: env queryline
- Each query that returns entries logs a
- The NosTale client is DPI-unaware (built-in compatdb rule
nostale), so at 192 DPI its text no longer clips in its glyph atlas or overflows its UI boxes- Wine gives it 96 DPI fonts and scales its window, as Windows does at 200%
- compatdb reads version strings by walking the VS_VERSIONINFO tree
- A field an executable leaves empty, such as NosTale's ProductName, now reads as empty
- It used to read as the next entry's key, which a rule's substring match could hit
- The mouse cursor scales with the window's DPI factor, so a DPI-unaware program's cursor at 192 DPI is no longer shown at half its size
- Wine no longer prints
x87 coop:error lines, including the onesX87_LOGSturned on- The "RUNNING WITHOUT X87 ACCELERATION" warning still names the reason
- mtld3d v0.12.0 -> v0.13.0
Direct3DCreate9Exhands out a workingIDirect3D9Ex, so games with a D3D9Ex path take it- Half-Life 2 and Team Fortress 2 run on their D3D9Ex path, and
-nod3d9exon their command line keeps them on plain D3D9 - NosTale plays (32-bit, windowed and DPI-unaware)
Presentwaits while more presented frames than the maximum frame latency (3 by default) are outstanding, so a GPU-bound game no longer runs dozens of frames ahead of the GPU- The new
present.maxFrameLatencykey (1 to 30) replaces the game's value unless it is left atauto, the default present.maxFpsand vsync hold in a hidden, minimised or covered window and behind a locked screencursor.softwaredefaults tofalse, so the hardware cursor is used- With
cursor.softwareset toauto, the software cursor is used only under HDR - On macOS 27 the Metal HUD shows live mtld3d figures
- The HUD domain is now lowercase
mtld3dand is added to whatever listMTL_HUD_STATE_REPORTER_DOMAINSholds, so a hand-setMTLD3Dno longer matches and is not needed - Every
d3d9.dllexport starts with a prologue the Steam overlay can hook - A crash before the first
Direct3DCreate9is logged tomtld3d-logs/<exe>-<pid>.lognext to the executable - No configuration key was renamed or removed
- x87sidecar v1.8.0 -> v1.9.0
- x87 registers stay in Rosetta's native 80-bit format between replies, so a value on the x87 stack is no longer rounded by unrelated floating-point work
X87_NATIVE_SLOTS=0restores the v1.8.0 conversion- Across 207 x87 microbenchmarks on an M5 Max, the geometric mean time is 0.68 of the time with
X87_NATIVE_SLOTS=0 - fild/fistp m64 and fld/fstp m80 copies are exact, so Delphi's
System.Moveno longer corrupts 8-byte chunks of 2^53 or more - Blocks with fbld or fbstp go to stock Rosetta by default
X87_STOCK_BCD=0keeps the inline translators for them- The "no temporary FPR available to allocate" abort that NosTale hit is fixed
- A block whose scratch register allocation still fails goes to stock Rosetta instead of aborting
- New opt-in
X87_PRECISE_FAULTS=1lets a guest memory fault at the start of a reply reach the game's own handler - New opt-in
X87_IGNORE_FTZ_DAZ=1keeps x87 denormals when the game sets FTZ or DAZ - A compatdb
envrule can now set either one for a single game
- The
cx-26-patchedseries was rewritten and every hash changed (still 13 patches)- The two winemac cursor commits were merged into one, and the EDR screen notification filter moved out of them into its own commit
- The x87sidecar commit now sits above the self-contained bundle commit
- The bundled sidecar lookup and the per-executable compatdb decision moved from the bundle commit into the x87sidecar commit, which also carries the rule env
- The check that an alternate loader exists moved from the x87sidecar commit into the bundle commit
- The x87sidecar commit no longer applies on its own to stock CrossOver 26.3
cx-26.3.0-8
Wine distribution built from athei/wine@cx-26-patched (d23b3977452) with b1f9a66bc34.
Changes since cx-26.3.0-7
- The minimum macOS is now 26 (was 15)
- GPTK's D3DMetal, the default for 64-bit D3D10 to D3D12, needs macOS 26.4
- The bundle ships x87sidecar v1.8.0 as
bin/x87sidecarand starts every i386 process under Rosetta with itROSETTA_X87_PATHset to a path uses that sidecar instead, and set to an empty value turns the sidecar off for the whole launch- A compatdb rule with
x87_sidecar=falsekeeps it away from one executable
- x87sidecar no longer stops a game from launching when it cannot hook the installed Rosetta
- The game runs without x87 acceleration and a "RUNNING WITHOUT X87 ACCELERATION" warning is printed to stderr, also with
WINEDEBUG=-all
- The game runs without x87 acceleration and a "RUNNING WITHOUT X87 ACCELERATION" warning is printed to stderr, also with
- 32-bit programs get the 4 GB address space by default (built-in compatdb rule
large-address-aware)- A rule with
large_address_aware=falsestops forcing it for one executable,name=large-address-aware;enabled=falsefor every process
- A rule with
- Every process is system DPI-aware by default (built-in compatdb rule
dpi-aware), so window and mouse coordinates match the display modes on a scaled desktop- Programs that ask for per-monitor awareness are capped at system-aware
- A rule with
dpi_aware=falsemakes one executable unaware again,name=dpi-aware;enabled=falserestores upstream behaviour
- Wine no longer prompts to install Mono and Gecko (built-in compatdb rule
no-mono-gecko, which addsmscoree,mshtml=)- This disables both modules, including a wine-mono, Gecko or native .NET installed in the prefix
name=no-mono-gecko;enabled=falseor a rule that addsmscoree=n,bbrings them back
- The Vulkan loader is disabled for every process (built-in compatdb rule
no-vulkan), so a game that ships its ownvulkan-1.dlluses another renderer- Re-enabling it for one game takes a compatdb rule,
WINEDLLOVERRIDESdoes not override it
- Re-enabling it for one game takes a compatdb rule,
WINE_COMPATDBtables now start withv=5, and a table with an older header is ignored as a whole- New keys
dpi_aware,large_address_awareandx87_sidecar, eachtrueorfalse
- New keys
- mtld3d v0.7.0 -> v0.12.0
- Each process logs to
mtld3d-logs/<exe>-<pid>.lognext to the executable instead of Wine's output,log.dirmoves the directory - The frame dump and GPU capture hotkey is Ctrl+Shift+P, F12 no longer triggers it
- Shaders and pipelines a game uses for the first time compile on worker threads,
shader.asyncCompileturns this off - A fullscreen game gets the display mode it picked, modes that fill the display come first and other aspect ratios are letterboxed
- A query polled with FLUSH now waits as D3D9 specifies (
query.flushImmediatedefaults to false) - An EVENT query reports completion only once the GPU has finished the work,
query.eventImmediateanswers at once - Built-in profiles for GTA IV and WoW apply first,
mtld3d.confandMTLD3D_CONFIGoverride them - No configuration key was renamed or removed
- Each process logs to
- compatdb changes can now ship as
compatdb-*releases, which put a newcompatdb.sointo the latestcx-*tarball without rebuilding Wine - The PE side is built with llvm-mingw 20261006 (LLVM 23.1.3, was 22.1.8)
- In the
cx-26-patchedseries the x87sidecar commit moved below the self-contained bundle commit, which now also carries the compatdb hooks- Every hash from the x87sidecar commit up changed
- The x87sidecar commit still applies on its own to stock CrossOver 26.3
cx-26.3.0-7
Wine distribution built from athei/wine@cx-26-patched (3562fea11d1).
Changes since cx-26.3.0-6
- Text in Source games renders again: narrow glyphs such as
lno longer come out empty or clipped (#6)- Glyph metrics for non-antialiased and fake-bold fonts now match the glyphs as they are drawn
- Lucida Console is substituted with Menlo, so the TF2 console font is readable
- Minimizing a fullscreen game while the Dock and menu bar are hidden works again (#4)
- dbghelp no longer crashes on a division by zero in DWARF location expressions (#4)
- Retina mode no longer doubles
HORZRES/VERTRES, so games see the real desktop size (#5)