http://bugs.winehq.org/show_bug.cgi?id=21361
Summary: Segmentation fault (NULL dereference) while trying to run Tony Hawk 2 Product: Wine Version: 1.1.36 Platform: x86 OS/Version: Linux Status: UNCONFIRMED Severity: normal Priority: P2 Component: directx-d3d AssignedTo: wine-bugs@winehq.org ReportedBy: lmage11@twcny.rr.com
Created an attachment (id=25722) --> (http://bugs.winehq.org/attachment.cgi?id=25722) Messages and backtrace that wine produces
I'm trying to relive my prepubescent life by playing Tony Hawk 2, and wine is not making it easy. :)
At first I got this, and nothing else happened (I got a black screen):
fixme:mixer:ALSA_MixerInit No master control found on VirMIDI, disabling mixer fixme:ddraw:DirectDrawEnumerateExA flags 0x00000007 not handled fixme:d3d_caps:init_driver_info Unhandled vendor 8086. fixme:win:EnumDisplayDevicesW ((null),0,0x32ea78,0x00000000), stub! fixme:x11drv:X11DRV_desktop_SetCurrentMode Cannot change screen BPP from 32 to 16 fixme:d3d:WineD3D_ChoosePixelFormat Add OpenGL context recreation support to SetDepthStencilSurface fixme:dsalsa:IDsDriverBufferImpl_SetVolumePan (0x13a618,0x1cd290): stub err:ddraw:PixelFormat_WineD3DtoDD Can't translate this Pixelformat 58 err:ddraw:PixelFormat_WineD3DtoDD Can't translate this Pixelformat 64
I then changed X11's screen depth to 16, and got some different errors and a segfault. This bug is about the segfault, even though I suspect that the segfault wouldn't happen if the previous errors were resolved. Backtraces from wine and gdb are attached.
I pretty much know how the segfault happens on a low level, but I don't know what the correct resolution is because I don't know anything about D3D or 3D in general, let alone how wine implements that stuff. Here's the "flow" of code which causes the segfault to happen:
IDirectDrawImpl_CreateSurface is called IDirectDrawImpl_AttachD3DDevice is called IWineD3DDevice_Init3D is called IWineD3DDeviceParent_CreateSwapChain call fails Jumps to err_out label, This->swapchains is never allocated Error handling causes stuff to return until we're in IDirectDrawImpl_CreateSurface again ... and you can see the rest from the backtraces