TMNT: Splintered Fate

Not about video: it guards one D3D12 call that ends the process instead of returning an error.

GPL-3.0-or-laterThis fix in MacGameFix

What you see

Opens a window, then closes about three seconds later. No dialog, no error, nothing in any log

Why it happens

D3D12CreateRootSignatureDeserializer ends the process instead of returning an error

What the fix changes

Look in the container first, and answer for it when there is nothing to find

The code

A shader container with no root signature is answered E_INVALIDARG, as Windows does, instead of letting D3DMetal read past the part it did not find.

fixes/d3d12-guards.c ยท my_deserialize, lines 207โ€“220
c
static HRESULT WINAPI my_deserialize(const void *blob, SIZE_T len, REFIID iid, void **out)
{
    if (!has_root_signature(blob, len))
    {
        if (InterlockedIncrement(&refused) <= 8)
            logf_("no RTS0 in a %llu byte container -- answering E_INVALIDARG "
                  "instead of letting it be dereferenced",
                  (unsigned long long)len);
        if (out) *out = NULL;
        return E_INVALIDARG;
    }
    InterlockedIncrement(&passed);
    return real_deserialize(blob, len, iid, out);
}

Details

Needs
D3DMetal, D3D12
Installer
install-tmnt-fix.sh
Executable
TMNTSF.exe
Built from
d3d12-guards.c
Verified on
Stable 26.3, on a copy of it carrying this project's winegstreamer (2026-08-31)

The full story, with the measurements and the wrong turns