https://bugs.winehq.org/show_bug.cgi?id=39277
Bug ID: 39277 Summary: Enhance error diagnosis for DX10/11 games crashing due to missing support for Mesa OpenGL >= 3.2 core profiles, Shader Model 4, GLSL 1.50 Product: Wine Version: 1.7.51 Hardware: x86-64 OS: Linux Status: NEW Severity: enhancement Priority: P2 Component: directx-d3d Assignee: wine-bugs@winehq.org Reporter: focht@gmx.net Distribution: ---
Hello folks,
this is an improvement request for better error diagnosis.
People using Mesa/Intel/Nouveau/foo encounter crashes with various DirectX10/11 games where the cause is not obvious from pure terminal output/backtrace.
An example (don't mind disabling of builtin 'd3d10_1.dll' here, it's another issue):
--- snip --- $ WINEDLLOVERRIDES=d3d10_1=d wine ./AssassinsCreed_Dx10.exe ... fixme:gameux:GameExplorerImpl_VerifyAccess (0x13b750, L"C:\Program Files\Ubisoft\Assassin's Creed\AssassinsCreed_Dx10.exe", 0x33f778) fixme:win:EnumDisplayDevicesW ((null),0,0x386e314,0x00000000), stub! fixme:dxgi:dxgi_output_GetDisplayModeList iface 0x18cb28, format DXGI_FORMAT_R8G8B8A8_UNORM, flags 0x1, mode_count 0x386e8d4, desc (nil) partial stub! fixme:dxgi:dxgi_output_GetDisplayModeList iface 0x18cb28, format DXGI_FORMAT_R8G8B8A8_UNORM, flags 0x1, mode_count 0x386e8d4, desc 0x3084758 partial stub! fixme:dxgi:dxgi_output_FindClosestMatchingMode iface 0x18cb28, mode 0x386e884, closest_match 0x386e8a0, device (nil) stub! fixme:d3d11:D3D11CoreCreateDevice Ignoring feature levels. fixme:dxgi:dxgi_device_init Ignoring adapter type. fixme:dxgi:dxgi_factory_MakeWindowAssociation iface 0x18c988, window (nil), flags 0 stub! wine: Unhandled page fault on read access to 0x00000000 at address 0x8754ba (thread 002a), starting debugger... Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x008754ba). Register dump: CS:0023 SS:002b DS:002b ES:002b FS:0063 GS:006b EIP:008754ba ESP:0386e830 EBP:0b67ba34 EFLAGS:00010202( R- -- I - - - ) EAX:00000000 EBX:0386e8d4 ECX:0386e8a8 EDX:031a0114 ESI:7fc5dfc8 EDI:0b678450 ... Backtrace: =>0 0x008754ba in assassinscreed_dx10 (+0x4754ba) (0x0b67ba34) 1 0x00000000 (0x0167f09c) 2 0x008763c0 in assassinscreed_dx10 (+0x4763bf) (0x00875960) 3 0x06c74c4e (0x8df18b56) ... --- snip ---
It becomes apparent with additional debug channels:
--- snip --- ... 002c:Call d3d10.D3D10CreateDeviceAndSwapChain(001a5010,00000000,00000000,00000001,0000001d,0b67845c,0b678458,0386e8ec) ret=007d9641 002c:trace:d3d10:D3D10CreateDeviceAndSwapChain adapter 0x1a5010, driver_type D3D10_DRIVER_TYPE_HARDWARE, swrast (nil), flags 0x1, sdk_version 29, swapchain_desc 0xb67845c, swapchain 0xb678458, device 0x386e8ec 002c:trace:d3d10:D3D10CreateDevice adapter 0x1a5010, driver_type D3D10_DRIVER_TYPE_HARDWARE, swrast (nil), flags 0x1, sdk_version 29, device 0x386e8ec ... 002c:Call d3d10core.D3D10CoreCreateDevice(001a65b0,001a5010,00000001,00000000,0386e8ec) ret=7e378d9b 002c:Call d3d11.D3D11CoreCreateDevice(001a65b0,001a5010,00000001,0386e5fc,00000001,0386e5f8) ret=7e35a837 002c:fixme:d3d11:D3D11CoreCreateDevice Ignoring feature levels. ... 002c:Call dxgi.DXGID3D10CreateDevice(7e310000,001a65b0,001a5010,00000001,00000000,0386e534) ret=7e315759 002c:trace:dxgi:DXGID3D10CreateDevice d3d10core 0x7e310000, factory 0x1a65b0, adapter 0x1a5010, flags 0x1, unknown0 (nil), device 0x386e534. ... 002c:Call d3d11.D3D11CoreRegisterLayers() ret=7e2e6151 ... 002c:Ret d3d11.D3D11CoreRegisterLayers() retval=00000000 ret=7e2e6151 ... 002c:Call wined3d.wined3d_get_device_caps(001a9e08,00000000,00000001,0386e1c0) ret=7e2e5ae7 002c:trace:d3d:wined3d_get_device_caps wined3d 0x1a9e08, adapter_idx 0, device_type WINED3D_DEVICE_TYPE_HAL, caps 0x386e1c0. 002c:Ret wined3d.wined3d_get_device_caps() retval=00000000 ret=7e2e5ae7 002c:warn:dxgi:dxgi_device_init Direct3D 10 is not supported on this GPU with the current shader backend. ... 002c:warn:dxgi:DXGID3D10CreateDevice Failed to initialize device, hr 0x80004005. ... 002c:Ret dxgi.DXGID3D10CreateDevice() retval=80004005 ret=7e315759 002c:Ret d3d11.D3D11CoreCreateDevice() retval=80004005 ret=7e35a837 002c:Ret d3d10core.D3D10CoreCreateDevice() retval=80004005 ret=7e378d9b ... 002c:warn:d3d10:D3D10CreateDevice Failed to create a device, returning 0x80004005 002c:warn:d3d10:D3D10CreateDeviceAndSwapChain Failed to create a device, returning 0x80004005 002c:Ret d3d10.D3D10CreateDeviceAndSwapChain() retval=80004005 ret=007d9641 002c:trace:dxgi:dxgi_adapter_GetDesc iface 0x1a5010, desc 0xb678498. 002c:trace:dxgi:dxgi_adapter_GetDesc1 iface 0x1a5010, desc 0x386e77c. 002c:Call wined3d.wined3d_get_adapter_identifier(001a9e08,00000000,00000000,0386e6c0) ret=7e2e40bb 002c:trace:d3d:wined3d_get_adapter_identifier wined3d 0x1a9e08, adapter_idx 0, flags 0, identifier 0x386e6c0. 002c:Ret wined3d.wined3d_get_adapter_identifier() retval=00000000 ret=7e2e40bb ... --- snip ---
Telling users to run with 'warn+dxgi' is not an option for me.
I suggest to turn "Direct3D 10 is not supported on this GPU with the current shader backend." WARN into an ERR or FIXME.
One problem with ERR could be that games probe for DX11/10 first and might fall back to DX9 mode hence the failure would not be considered critical (still works through DX9 fallback). Maybe a FIXME just to appear in terminal by default without any debug channels/classes given.
$ wine --version wine-1.7.51-102-ga7e294c
Regards