doitsujin / dxvk

Vulkan-based implementation of D3D8, 9, 10 and 11 for Linux / Wine
zlib License
13.18k stars 849 forks source link

Crysis.exe 32bit crashes after loading level in dx10 mode #1777

Closed AlexanderWKoenig closed 4 years ago

AlexanderWKoenig commented 4 years ago

Hello,

the GOG Version of Crysis is crashing for me after a level loaded. Since I am running an AMD CPU, i had to use this fix to get crysis 32bit running but just in dx9 mode: https://www.pcgamingwiki.com/wiki/Crysis#Game_crashes_on_machines_with_AMD_CPUs

The 64bit version of this game does crash on start for me, with or without the fixed dll mentionen in pcgamingwiki.

I've also followed the instructions from this issue: https://github.com/doitsujin/dxvk/issues/783

So i've created a clean wineprefix, installed dxvk and used winetricks d3dx10_43 d3dcompiler_43

System information

Log files

Crysis_d3d9.log Crysis_d3d11.log Crysis_dxgi.log Game.log

Terminal output: 0024:fixme:d3dcompiler:d3d10_shader_reflection_GetDesc iface 2F59699C, desc 0031DB9C partial stub! 0024:fixme:d3dcompiler:skip_dword_unknown Skipping 4 unknown DWORDs: 0024:fixme:d3dcompiler:skip_dword_unknown 0x85ca1431 0024:fixme:d3dcompiler:skip_dword_unknown 0x9145a899 0024:fixme:d3dcompiler:skip_dword_unknown 0x5646c808 0024:fixme:d3dcompiler:skip_dword_unknown 0x1ab12d53 0024:fixme:d3dcompiler:skip_dword_unknown Skipping 1 unknown DWORDs: 0024:fixme:d3dcompiler:skip_dword_unknown 0x00000001 0024:fixme:d3dcompiler:skip_dword_unknown Skipping 1 unknown DWORDs: 0024:fixme:d3dcompiler:skip_dword_unknown 0x00000008 0024:fixme:d3dcompiler:skip_dword_unknown Skipping 1 unknown DWORDs: 0024:fixme:d3dcompiler:skip_dword_unknown 0x00000008 0024:fixme:d3dcompiler:skip_dword_unknown Skipping 1 unknown DWORDs: 0024:fixme:d3dcompiler:skip_dword_unknown 0x00000000 0024:fixme:d3dcompiler:skip_dword_unknown Skipping 1 unknown DWORDs: 0024:fixme:d3dcompiler:skip_dword_unknown 0x00000000 0024:fixme:d3dcompiler:skip_dword_unknown Skipping 1 unknown DWORDs: 0024:fixme:d3dcompiler:skip_dword_unknown 0x00000000 0024:fixme:d3dcompiler:skip_dword_unknown Skipping 1 unknown DWORDs: 0024:fixme:d3dcompiler:skip_dword_unknown 0x00000000 0024:fixme:d3dcompiler:skip_dword_unknown Skipping 2 unknown DWORDs: 0024:fixme:d3dcompiler:skip_dword_unknown 0x00000000 0024:fixme:d3dcompiler:skip_dword_unknown 0x00000000 0024:fixme:d3dcompiler:d3d10_shader_reflection_GetDesc iface 2F59699C, desc 0031D830 partial stub! 0024:fixme:faultrep:ReportFault 0031DC68 0x0 stub

unic0rn commented 4 years ago

having the same problem on A8-7600. i've even added all the d3dcompiler* dlls found in system32 in winecfg and set them to disabled except _42, _43 and _47 installed using winetricks (game supposedly requires _43, but dxvk requires _47, with _47 disabled it falls back to dx9), and it still throws that built-in d3dcompiler error. how, i have no idea.

unic0rn commented 4 years ago

it honestly makes no sense. i've checked it with winedebug to see all dll/loaddll traces, both d3dcompiler_43 and d3dcompiler_47 are installed using winetricks and set to native, and those are the only d3dcompiler dlls that are being loaded at all. d3d10 is built-in as it should be i guess, it loads native _47, then _43 gets loaded. yet either when launching the 32bit version, or when loading save in the 64bit version with graphics set to very high, the game crashes with all the d3dcompiler fixme messages, suggesting it's using built-in d3dcompiler. how, when it's not loading it at all?

64bit with high settings works... for a moment. it crashes after a few minutes or sooner, hard to pinpoint what's triggering it. on very high it actually loads, you can make a few steps if you're lucky, then it crashes. 32bit crashes at the start. no idea what's going on.

unic0rn commented 4 years ago

here's the log from WINEPREFIX=/home/uni/games/crysis WINEESYNC=1 DXVK_HUD=fps,api,version,devinfo,drawcalls,memory,gpuload WINEDEBUG=+loaddll,+dll,+d3dcompiler,+d3d10 wine Crysis.exe >test.log 2>&1. 64bit version, c1-launcher (opensource, makes no difference except 32bit works just like 64bit instead of crashing right away), very high settings. the game launches, loading a save ends up in a crash more or less one-two seconds into the gameplay. as mentioned, d3dcompiler_* dlls were installed using winetricks. up to date manjaro kde, wine-staging, all versions in the log.

i've just noticed that it's loading not only d3dcompiler_43 and _47 (both native) at the beginning, but also _34 at some point (perhaps because of d3dx10_34). set d3dcompiler_34 to disabled, that prevents loading it, changes nothing otherwise, still the same behaviour.

test.log

unic0rn commented 4 years ago

fixed. in the most counterintuitive way possible.

set d3dx10_34.dll to built-in, problem solved. those shader reflection partial stub fixmes are not the problem, those still appear, but the game works, both 32bit and 64bit (using c1-launcher if it makes a difference), with everything set to very high. i still have d3dcompiler_34.dll set to disabled if that matters, didn't bother to check without that.

AlexanderWKoenig commented 4 years ago

fixed. in the most counterintuitive way possible.

Hi unic0rn, thanks for looking into this, but i have no success following your instructions. Here is what i did: Create a clean wineprefix, execute setup_dxvk.sh, execute winetricks d3dx10_43 d3dcompiler_43 d3dcompiler_47 d3dcompiler_42, set d3dcompiler_34 to disabled and d3dx10_34 to built-in. So I end up with the following overrides: Bildschirmfoto_2020-09-24_18-27-38

But the 32bit and 64bit version keeps crashing when loading. With or without c1-launcher (I didnt know this, guess it has fixed 64bit for me)

Here is the terminal output with dx10: test32bit.log test64bit.log

And here is a working one with -dx9 argument: test_dx9_32bit.log

unic0rn commented 4 years ago

try winetricks d3dx9 d3dx10 vcrun2005, then check the overrides (d3dx10_34 and so on). also, no need to set windows version to 10, got it at 7 (default). my prefix is honestly a mess, i was testing everything including gallium nine, but this should give you identical config afaik. to be clear, the above will install whole bunch of dlls, only d3dx10_34 should be set to built-in as far as d3dx* goes.

if all else fails, try disabling mango perhaps? DXVK_HUD is enough for quick diagnostics. i don't think those logs can help in this case, maybe some heavy wine trace. in general i'm not sure if it's related to dxvk at all, assuming your case is identical as mine. something somewhere goes haywire, i figured since it's loading that dll and it's not a compiler - so doesn't have to be native - i'll check what happens when i'll set it to built-in (had d3dx9 and d3dx10 installed via winetricks already) - and amazingly, it worked.

let me know how it goes, if it won't help i may try reinstalling the game in a fresh prefix later to check the exact steps to reproduce my setup. sidenote: i've installed dxvk using winetricks, not manually.

K0bin commented 4 years ago

Create a clean wineprefix, execute setup_dxvk.sh, execute winetricks d3dx10_43 d3dcompiler_43 d3dcompiler_47 d3dcompiler_42, set d3dcompiler_34 to disabled and d3dx10_34 to built-in. So I end up with the following overrides:

This makes absolutely no sense. First of all, winetricks d3dx10_43 installs Microsofts d3dx10 implementation and sets it to native so Wine actually picks that up. Then you set it back to builtin to reverse that. So the winetricks install had no effect.

set *d3dcompiler_34 to disabled

DXVK uses d3dcompiler_43 internally to implement D3D10 shader reflection. If Crysis uses D3D10 shader reflection, you need some implementation of that dll. Setting it to disabled is a terrible idea. Wine's implementation has been very problematic in the past.

What you should do is use the Microsoft implementation of both d3dx10 and d3dcompiler_43.

unic0rn commented 4 years ago

you're confusing _43 with _34.

long story short, d3dcompiler_47 gets loaded, d3dcompiler_43 gets loaded, and both of those should be native, but for whatever reason it tried loading d3dcompiler_34 as well for me when crashing, that's why i've set it to disabled. and since the game was loading d3dx10_34, i figured it may be connected, so i've changed d3dx10_34 from native to built-in, and at that point it stopped crashing.

why, no idea. it's a mess.

AlexanderWKoenig commented 4 years ago

try winetricks d3dx9 d3dx10 vcrun2005, then check the overrides (d3dx10_34 and so on)

Big thanks guys! Its way easier than expected: All I did was a clean wineprefix, run setup_dxvk.sh and winetricks vcrun2015

So I guess this is not a dxvk issue. Can it run Crysis? YES!!! :)