Hey everyone,
I wanted to give a technical update on the attempts to get God of War III Remastered (CUSA01715) running on macOS (M1/M2/M3) using shadPS4. The short version: we've hit a hard architectural wall with Apple's Metal API, and the game is unplayable for now.
For those who have been following the testing or trying to compile it on their own, here's a breakdown of what we achieved and why we're hard-stopped.
The Good: The game engine is actually running in the background
We spent quite a bit of time patching the shadPS4 source code to bypass the initial crashes. We managed to:
- Bypass dialogs and trophies: Injected code to skip the
libSceMsgDialog hangs and the infamous red np_trophy error.
- macOS Swapchain: Forced the swapchain creation to
VK_FORMAT_B8G8R8A8_SRGB (since Metal doesn't play well with UNORM in this context).
- Memory Management: The game reserves virtual memory correctly (
EnsureResident works).
In fact, if you check the terminal logs, the game is running at full speed. The ATRAC9 audio decoder initializes, and the engine spits out its internal memory stats (WAD_Poseidon00, WAD_Zeus00, WAD_TitanFight, etc.). Kratos is in there, but the screen stays 100% black.
The Wall: Why the black screen?
After cranking up the debug level (MVK_CONFIG_LOG_LEVEL=3), MoltenVK finally spat out the real culprit right before compiling the graphics pipeline:
[mvk-warn] VK_ERROR_FEATURE_NOT_PRESENT: Metal does not support disabling primitive restart.
The technical explanation: The God of War III engine draws its 3D models using Triangle Strips with index buffers, and in its compiled shaders, it strictly demands that primitive restart is disabled (primitiveRestartEnable = false). The game uses values like 0xFFFF as actual coordinates.
The problem is that Apple designed the Metal API in a way that physically forbids disabling primitive restart. It is hard-forced by the hardware/API. When MoltenVK tries to translate the Vulkan instruction to Metal, Metal outright rejects it, aborts the frame, and leaves us with a black screen.
We tried doing a deep clean (using sed) across the entire video_core of shadPS4 to force the value to true, but we found out that the instruction is hardcoded directly inside the game's compiled shaders (.SPV). It’s not a simple emulator toggle we can flip.
What is needed to fix this?
This isn't a configuration issue that end-users can fix. For GOW3 to show an image on a Mac, the shadPS4 (or MoltenVK) devs would have to implement a heavy GPU-level workaround:
- Write a Compute Shader that intercepts all geometry milliseconds before it gets drawn.
- Read the memory, find the index cuts, and mathematically convert the "Triangle Strips" into pure "Triangle Lists" (since this topology doesn't suffer from Apple's forced restart restriction).
This is a massive engineering task and would consume a lot of performance overhead.
I'm leaving this report and our documented logs here in case any shadPS4 dev wants to take on the challenge in the future. For now, save yourselves the trouble of compiling a thousand times looking for the magic config; the wall is Apple's doing.
Thanks to those who helped in the process!