http://bugs.winehq.org/show_bug.cgi?id=10758
Jim Cameron jim_24601@btinternet.com changed:
What |Removed |Added ---------------------------------------------------------------------------- CC| |jim_24601@btinternet.com
--- Comment #5 from Jim Cameron jim_24601@btinternet.com 2008-10-01 17:27:44 --- It is caused by a surface being freed where it shouldn't be ... I encountered an interesting comment within IWineD3DDeviceImpl_SetDepthStencilSurface() (file dlls/wined3d/device.c):
/* should we be calling the parent or the wined3d surface? */
followed by an AddRef of the wined3d surface. If I change the code to get the parent and AddRef it instead, Revelations does not crash, and I could play the game (although it crashed on exit). That would seem to answer the original developer's question. Of course, we'll need a conformance test to confirm. Patch follows.
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 409c7a1..0546f00 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -6648,7 +6648,12 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetDepthStencilS tmp = This->stencilBufferTarget; This->stencilBufferTarget = pNewZStencil; /* should we be calling the parent or the wined3d surface? */ - if (NULL != This->stencilBufferTarget) IWineD3DSurface_AddRef(This->ste + if (NULL != This->stencilBufferTarget) + { + IUnknown* parent; + IWineD3DSurface_GetParent(This->stencilBufferTarget, &parent); + IUnknown_AddRef(parent); + } if (NULL != tmp) IWineD3DSurface_Release(tmp); hr = WINED3D_OK;