AlpyneDreams / d8vk

Direct3D 8 to Vulkan translation for DXVK! Merged into dxvk: https://github.com/doitsujin/dxvk
zlib License
483 stars 6 forks source link

Empires: Dawn of the Modern World - broken main menu #111

Closed WinterSnowfall closed 1 year ago

WinterSnowfall commented 1 year ago

It's one of those games that doesn't work properly even with WineD3D, but I noticed something off in a trace I took, which I think is worth investigating at least.

When starting the game you can hear the main menu background music, but nothing is rendered except for the mouse cursor. There are multiple failed calls to IDirect3DDevice8::BeginScene in the trace.

Software information

Empires: Dawn of the Modern World (GOG)

System information

Apitrace file(s)

Empires_DMW.trace.tar.xz - captured with d8vk Empires_DMW.1.trace.tar.xz - captured with WineD3D

Log files

WinterSnowfall commented 1 year ago

I'm not sure how to fix this properly, but long story short, doing:

HRESULT STDMETHODCALLTYPE BeginScene() { GetD3D9()->BeginScene(); return D3D_OK; }

makes it work just fine. Of course that's not very API conformant, since it looks like it's calling BeginScene() repeatedly and that's supposed to fail.

Since this game has been unplayable on Linux since like forever AFAIK, that's both great news and... surprisingly dumb with regards to what the game is doing.

WinterSnowfall commented 1 year ago

So, thanks to @Blisto91, we now have a trace of the game on Windows native. It seems to be doing the same thing (see frames 106 & 107), namely calling BeginScene() twice with no EndScene() in between, but on native this WORKS and returns D3D_OK in both cases. Æææææ...

Since it's probably the first recorded case of a game doing this and because it technically breaks spec, I guess my workaround approach is fine???

AlpyneDreams commented 1 year ago

Looks like it's calling Reset() between the BeginScene() calls.