Repository navigation
Releases
MacGameVideoFix 5.6.0
Beast of Reincarnation plays on CrossOver Preview 27 with only its game-folder fix. On stable CrossOver 26.3 its video stalls after two frames unless the engine carries a change from winevideo. Preview's own H.264 decoder already behaves that way, so the console variable the fix sets by name is all it needs there. The fix now also sets the decoder's MF_SA_D3D_AWARE and MF_SA_D3D11_AWARE to 0, as that winevideo change does inside the engine; that was not run on a 26.3 without it. Measured on Preview 27 through NotProton: the startup video plays.
Nioh 3 decodes its own VP9. On CrossOver Preview 27 its cutscenes played with magenta blocks in their bright areas. The video is VP9 in WebM, which Preview decodes through VideoToolbox; the same video is clean with a software decoder. The fix's decoder (mgvf-asf-reader.dll) now also reads WebM, with FFmpeg's VP9, VP8, Opus and Vorbis decoders, and Nioh 3 uses it before CrossOver's decoder. Measured on Preview 27: clean and smooth.
The apps now say which fixes Game Porting Toolkit 4.0b3 makes unnecessary. CONTROL Resonant, RESONANCE, both Life is Strange titles and Mortal Shell 2 were played without their fix on D3DMetal 4.0b3. Their fixes stay, for 4.0b2 and earlier, and the apps mark them as not needed from 4.0b3 on.
Fixes: the Unreal Engine and Nioh 3 installers updated nothing when the fix was already installed, which left an older DLL in place. They now replace our own DLL with the current one.
Install Beast of Reincarnation's and Nioh 3's fixes again to get these changes.
MacGameFix 1.3.0 adds Beast of Reincarnation, for CrossOver Preview 27, and the same toolkit notes.
MacGameVideoFix 5.5.0
Seven titles stop needing a codec in the engine. Persona 5 Strikers, Devil May Cry 5, RESIDENT EVIL 2 and 3, NieR Replicant, Nioh and Nioh 2 used to need a decoder staged into CrossOver's GStreamer, because no CrossOver decodes their Windows Media video (VC-1, WMV2, WMV3) or audio (WMA Pro, WMA v2). Their fixes now carry mgvf-asf-reader.dll, a decoder built on FFmpeg 9.0.2. It is static and LGPL, and contains only the ASF demuxer and those decoders. Its notice is installed with it.
It is used only when CrossOver refuses the video, so where the codec is staged nothing changes. It covers both routes these games use:
- Media Foundation. A source reader the game's bridge hands out when
MFCreateSourceReaderFromByteStreamfails. It delivers D3D9 surfaces when the game passes a Direct3D 9 device manager, which Persona 5 Strikers and Nioh 2 do; otherwise it delivers frames in system memory. - DirectShow, for Nioh. Wine's prefixes have no
.wmvmapping, so the game's graph gets the WM ASF Reader as Windows would give it. Behind it, a reader of ours opens the file when wine's cannot.
Measured on 2026-10-14 on CrossOver Preview 27 through NotProton, with nothing staged. The videos of all seven play: picture, and sound in sync where the video has it. Persona 5 Strikers, Nioh and Nioh 2 still need DXMT; with a Steam Play tool, set CX_GRAPHICS_BACKEND=dxmt %command%. Stable CrossOver 26.3 without the staged codec was not run.
New installers and changes:
install-re-vc1-fix.shserves Devil May Cry 5 and RESIDENT EVIL 2 and 3. It replaces the codec-only route, so the app now offers these three.install-nier-bridge.shalso takes a Steam Play prefix (compatdata/<appid>/pfx).- The Persona 5 Strikers, Nioh and NieR installers ship the decoder and refresh an older install.
DYNASTY WARRIORS: ORIGINS plays on CrossOver Preview 27 with only its bridge in the game folder. Preview's own GStreamer opens the WebM and VideoToolbox decodes the VP9; no .webm registry key is needed there.
Install each of these fixes again to get the decoder.
MacGameFix 1.2.0 now carries all eight.
MacGameVideoFix 5.4.0
NINJA GAIDEN 4 renders on Game Porting Toolkit 4.0b3.
On D3DMetal 4 the game ran with sound and never drew a frame. The cause is two faults in how D3DMetal 4 handles D3D12 fences, and the fix's dstorage.dll now repairs both:
- A fence reset to 0 loses a signal. The game resets fences to 0 every frame, which D3D12 allows, and the reset races with the next signal. The repair makes the fences monotonic and translates every value.
- A queue's wait on another queue is never woken. The value arrives later and the waiting queue does not see it. The repair bridges every wait that is not met yet through the CPU.
Measured on 4.0b3: the game renders with Metal 4 on and off. On CrossOver Preview 27 through NotProton, the intro video plays and the menu comes up with nothing staged. Preview's own GStreamer opens the WebM, and VideoToolbox decodes the VP9. 4.0b2 with the repair was not run, so 3.0 remains the toolkit launchers select for this title.
Install the NINJA GAIDEN 4 fix again to get the repair. It is on by default. ng4-no-fence-fix.txt beside the game turns it off.
MacGameFix 1.1.0 carries NINJA GAIDEN 4, for CrossOver Preview 27, which ships the codec its videos need. On stable CrossOver 26.3 the codec still has to be staged, which this app does.
MacGameVideoFix 5.3.2
Spider-Man 2: reinstalling the fix after removing it works again.
Removing the fix also removes sm2fix.ini, and a later install stopped silently right after copying the shaders: the DLL was not placed and the ini not written, so the game ran without the fix while the installer reported nothing. The fix's DLL does nothing without that ini. The installer now handles a missing ini. Measured: remove, then install, with the DLL, its original, the four shaders and sm2fix.ini all back in place.
If you removed and reinstalled the Spider-Man 2 fix with 5.3.1, install it again with this release.
KINGDOM HEARTS: the fix can go into a Steam Play prefix. Besides a CrossOver bottle, the installer now accepts a plain Wine prefix such as NotProton's steamapps/compatdata/<appid>/pfx, writing the DLL overrides into its user.reg while nothing runs in it. Tested on a prefix -- install, check, remove, and Wine reading the key back -- but not yet with the game itself running from one.
New: MacGameFix. A separate app with only the fixes that live in a game's folder and need nothing of the engine -- fourteen titles -- so they work with CrossOver as it ships, CrossOver Preview and Steam Play tools such as NotProton. Built from app-gamefix/ in this repository.
Wiki: with Game Porting Toolkit 4.0b3, CONTROL Resonant draws its windows correctly without the fix. The fix stays for 4.0b2.
MacGameVideoFix 5.3.1
Two new games.
Marvel's Spider-Man 2: no more T-pose or broken symbiote. This is macprotips' fix, plus one improvement of ours.
On M1-M4 Macs, D3DMetal returns 0 for typed buffer reads past element 2^28 and drops typed writes past it. The game reads and writes its 2 GB character mesh pool exactly that way, so characters stay in a T-pose and the symbiote shows up as spikes, a flat black sheet, or not at all. macprotips found this and fixed it: the wide views are made raw, and four shaders are rebuilt raw on your Mac from your own copy of the game. Their code ships here unchanged in what it does.
What this release adds to their fix:
- No DLL override. The fix rides on a DLL the game already loads, so it works under CrossOver, RaccoonBot or NotProton with nothing set in the bottle or the launch options.
- No more black blocks in the sandstorm stage. These are a different fault: a missing barrier after the volumetric fog copy, which vkd3d-proton also adds for this game. With the barrier, the copy ran 8030 times in one session and no blocks were seen. Without it they flashed now and then. That is one clean session, so it is evidence rather than proof.
The first install downloads macprotips' release once (sha256 pinned) to take Microsoft's shader tools from it. Each rebuilt shader must match the one macprotips verified, or nothing is installed.
God of War: no more white specks on characters.
The game tests depth with EQUAL against a depth prepass, and the translated shaders do not match the prepass to the last bit, so specks appear all over Kratos in dim light. A r/macgaming poster found the cause. The fix creates that one depth test as GREATER_EQUAL, without a DLL override and without copying anything from CrossOver, so a DXMT update needs nothing done.
- Measured on DXMT in CrossOver Preview 27, under Rosetta and under FEX: specks without the fix, none with it. D3DMetal not measured.
Both games were measured on CrossOver Preview 27 through NotProton, and the wiki says so on their rows. Their fixes need nothing from the engine.
In the app, "Shader fix" is now Rendering fix, since it covers a depth test as well as shaders.
MacGameVideoFix 5.3.0
The Witcher 3: DLSS is offered again after the game's 2026-10-08 update.
The game switches NVIDIA Streamline off when it finds Wine, and the fix answers that one check "no Wine". It recognises the check by the instructions that follow it. The update changed one register in them (r14 became r13), so the fix stopped matching and the menu said DLSS was unsupported again. The rule now accepts any register.
- Measured on the updated game (build 25773555, D3DMetal 4.0b2): DLSS is offered and runs. The game played past two minutes with exactly one stream-output pipeline refused, as before.
- Every Wine check the fix does not answer is now logged with its offset, so the next update that moves the code can be diagnosed from the log alone.
Updating is now one step. Running the installer over an older build of this fix replaces it in place. Before, it reported "already installed" and kept the old one.
Ray tracing stays off, on purpose. After the update the game turns ray tracing off when it finds Wine. Answering that check too brings the options back, but the game then cannot run: one of its ray-tracing shaders uses a 64-bit atomic compare-exchange that Metal refuses to compile (measured on an M4 Max), and D3DMetal aborts. The wiki page has the measurements.
Nothing else changes.
MacGameVideoFix 5.2.1
CONTROL Resonant: the window fix works again after the game's 2026-10-01 update.
The update recompiled the shader that draws the lit rooms behind the windows, interiorPS. The fix found that shader by a hash of its bytes, so after the update it matched nothing. The coloured windows came back, and the fix's log said 0 pipelines hidden.
The fix now finds the shader by its entry-point name, read from the string table inside the shader. A recompile no longer breaks it; only a rename would.
- Checked against the fifteen candidate shaders from the original investigation: it matches
interiorPSalone. - Measured on the updated game: it hid all four of the new pipelines, and no coloured window was seen.
Nothing else changes.
If the fix is already installed, remove it first, then install it again. Run install-ctl-fix.sh <folder> --restore and then install-ctl-fix.sh <folder>, or Revert then Apply in the app. A plain re-run finds the old DLL and reports "already installed". RaccoonBot sees that the fix changed and does both steps itself.
MacGameVideoFix 5.2.0
One new title: The Witcher 3: Wild Hunt (patch 5.00b) on D3DMetal. One DLL fixes two separate faults.
The black screen
Since 5.00b the game stopped on a black window at full CPU. At startup it builds one stream-output pipeline, a geometry shader with no pixel shader. D3DMetal's shader converter crashes compiling it, and the game's crash handler then deadlocks. The fix refuses that pipeline before D3DMetal sees it, and the game carries on without it. The diagnosis and the rule come from tholtman1-del/witcher3-crossover-fix (MIT).
DLSS
Once past the black screen, the menu said DLSS was not supported. The cause was the game, not D3DMetal: it switches NVIDIA Streamline off when it finds Wine. The fix tells only that one check that there is no Wine, and the game's four other Wine checks are left alone. With that, Streamline initialises and DLSS runs through D3DMetal's MetalFX path. Frame generation does not work.
bin/x64
When bin/x64 is missing, install-w3-fix.sh links it to x64_dx12. The launch can still ask for the old DX11 path, and it did here. A hand-made copy there runs the game's original DLL instead of the fix, so the installer reports it rather than touching it.
Measured on an M4 Max with D3DMetal 4.0b2 and Metal 4 on: 60 fps and smooth, with DLSS and ray tracing on and the launcher's frame cap at 70. Recommended in game: HDR, Reflex, frame generation and VSync off.
Run the installer again after a game update or a file verification, because either one puts the original DLL back. Wiki page.
MacGameVideoFix 5.1.0
A new title, one engine-wide fix, and the controller work of the past three weeks. The controller work is the bulk of this release.
CONTROL Resonant
On D3DMetal 4.0b2 the lit rooms behind the city's windows render as flat violet, cyan and yellow, and the colours spread to neighbouring windows as the camera moves. One pixel shader draws them, interiorPS. D3DMetal runs its non-uniform Texture2D[] read as if the index were uniform. A rebuilt shader that serves each index on its own drew the rooms correctly, but only for about a minute. After that a second fault, outside the shaders, brought the colours back.
So the fix does what measured clean for a whole session: pipelines built with interiorPS are created writing nothing. The windows show as dark glass and the rest of the frame is unchanged. The DLL rides on PxFoundation_x64.dll (install-ctl-fix.sh), and the app lists it under a new mode, Shader fix.
Turn Metal 4 off for this title (D3DM_MTL4=0). With it on, faces and hair render as black boxes. Keep ray tracing and path tracing off in the game's settings. Wiki page.
Engine: the Visual C++ dialog on Unreal titles
Unreal 5.6's bootstrapper asks for the Visual C++ runtime on every launch (seen on Silent Hill: Townfall). It checks the file version of msvcp140_2.dll and vcruntime140_1.dll for at least 14.42.34438, and CrossOver 26.3's builtins report 14.42.34433. install-engine-vcruntime.sh rewrites only the version resource of the five builtins that carry one, to 14.51.36247.0. The originals are kept as .mgvf-stock, and make-engine-copy.sh applies it as step 4b.
Controllers
- DualSense on Bluetooth rumbles. The engine can say a pad is on Bluetooth. The motors ride the game's own output packet, because the link carries about 65 reports a second and the game already uses most of them. Most motor updates move a motor by under 4 of 255, so those are dropped at the pad. That keeps the rumble without costing frames.
- XInput rumble on a DualSense without it stopping being a DualSense (the pad's own descriptor). Titles that import Sony's own library are detected from their import table and left alone. Mortal Shell 2 starts with XInput rumble on.
- The lights you choose are sent to the pad and sent again when macOS repaints them.
- The pad is shared with macOS by default (no exclusive seize).
- An idle DualSense on Bluetooth that wine holds is asked to turn off when nobody uses it (
set-pad-option.sh,IdlePowerOffMinutes). - winebus is built with SDL, and the library it dlopens is reachable.
- The controller set ships as an optional engine set, stripped and stamped.
check-builds.shnow compares all ten of its binaries, not four.
Also
- Beast of Reincarnation's fix finds its cvar by name and no longer depends on addresses.
- RESONANCE's black screen was HDR10, not the display shape.
- NINJA GAIDEN 4 on D3DMetal 4.0b2 is closed: nothing is ever presented there. 3.0 works.
- Persona 4 Golden is Denuvo. The other explanations were each measured and ruled out.
- An installer's
--statusreads the bottle's registry file when wine is not running.
MacGameVideoFix 5.0.5
A caller can now name the engine, and being named wrongly is an error rather
than a shrug.
MGVF_CX
The three installers that write per-application overrides through reg.exe —
Kingdom Hearts, NieR and NINJA GAIDEN 3 — resolve the engine from the bottle as
of 5.0.4. That is correct on its own, and it is inference. A launcher knows which
engine it built.
Set MGVF_CX to a CrossOver directory — the one holding bin/wine, not the
.app — and that is the engine those installers use. Three behaviours, all
exercised:
MGVF_CX |
what happens |
|---|---|
| unset | resolved from the bottle, as in 5.0.4 |
| set, valid | that engine is used |
| set, wrong | prints what it was given and refuses |
The third is the deliberate one. A caller that names an engine and is silently
ignored is the worst of the three outcomes: it believes it chose, and the wrong
engine does not fail loudly — which is the whole reason this resolution was
rewritten in 5.0.4. Falling back would have reintroduced the bug the flag exists
to let a caller avoid.
This was promised to the RaccoonBot project and then not written. They found it
by grepping the shipped 5.0.4 bundle before wiring anything against it — zero
occurrences — and asked rather than assuming. Without that check it would have
been a variable set on one side and read by nobody on the other.
A coupling recorded where it will be read
RaccoonBot 0.2.0 no longer carries its own copy of the twelve codec binaries: it
reads them out of this app's Resources and verifies all twelve against a sha256
table of its own before it will build an engine. Rebuilding those binaries
without that table moving in the same release stops their build — a failure that
appears on their side for a change made here.
That now sits at the top of runtime/engine-payload/CODEC-LICENCES.md, the file
holding the checksum table and the file whoever rebuilds them will open. They
told us unprompted about a coupling they had created and we had not agreed to.
Not changed
No title's behaviour changed. 5.0.4 is the release that closed the engine
mismatch; this one adds the explicit override over it.