Teardown handles the old behaviour correctly: it checks the returned signature for NULL and falls back to issuing those draws from the CPU, which is why 2.14.1 looks right.
Seems more like a workaround than anything, but sure. If actively failing the call fixes Teardown we can add a config option and app-opt. Is that something you can do on your own?
Yeah, it's a workaround — the real fix is Turnip implementing DGC. The MR for that (mesa!31388) is a stale draft from 2024 and only enables the extension on a750+ (a7xx.load_shader_consts_via_preamble), so nothing is coming for a6xx soon.
Failing the call is enough, I checked rather than guessed: I patched the DLL locally to set an error and jump to err: instead of falling through to out:, and the game renders correctly again. It still uses ExecuteIndirect for the signatures that don't need a state template, so this isn't just "indirect draws off".
Happy to do the PR. Shape I had in mind: a config flag checked in that branch plus an application_override entry for teardown.exe.
Two things I'd rather you decide before I write it:
requires_state_template = false; goto out;. Should the flag cover it too, or leave it alone?fail_unsupported_state_template, but I have no attachment to it.flag should cover RT too, noone uses DGC RT so I don't really care. Sure, fail_unsupported_state_template is fine.
VKD3D_CONFIG='force_raw_va_cbv'x1 2026-08VKD3D_PIPELINE_TYPE_GRAPHICSx1 2026-08VKD3D_PIPELINE_TYPE_MESH_GRAPHICSx1 2026-08
Teardown renders with large parts of the world missing on 3.x: buildings don't draw at all, and surfaces that should be opaque show whatever is behind them. Same game, same GPU, same driver renders correctly on 2.14.1.
Turnip doesn't implement
VK_EXT_device_generated_commands, so the command signatures this game creates that change vertex/index buffer views and root CBVs between commands can't be backed by a state template. On 2.14.1 thoseCreateCommandSignaturecalls simply failed:Since 3.0 the same path returns success instead (
libs/vkd3d/command.c,d3d12_command_signature_create, unchanged in master):So the application gets S_OK and a signature that has quietly dropped the state template it needs. It then calls ExecuteIndirect,
requires_state_templateis false, the plain path runs, the per-command binding changes are ignored, and those draws produce nothing. Nothing reports an error — the log only contains the FIXME, 11 times in my case.Teardown handles the old behaviour correctly: it checks the returned signature for NULL and falls back to issuing those draws from the CPU, which is why 2.14.1 looks right.
I patched the DLL to restore the old behaviour (set hr to a failure code and jump to
err:instead ofout:) and the game renders correctly again, while still using indirect draws for the signatures that don't need a state template.The ray tracing branch a few lines below does the same thing (
requires_state_template = false; goto out;), so it probably has the same problem.Software information
Teardown 2.1.0, 640x480, default graphics settings.
System information
Not Proton — this is Winlator on Android, so vkd3d-proton runs under Wine on aarch64. The
command.cin the build I used is byte-identical to current master, and v3.0.1 has the same code, so the analysis above isn't specific to that build.Log files
This isn't Proton, so there's no
steam-xxxxx.log. The vkd3d log for the run with the missing geometry (stock game binary, unpatched vkd3d) is 106 lines and contains nothing but the usual startup chatter plus this:11 FIXMEs and no errors or warnings anywhere — that's the point, the failure is completely silent. I can attach the full file if it's useful.
force_raw_va_cbvis unrelated, it's needed on this GPU becausemaxBoundDescriptorSetsis 4.