Le 27.08.2006 21:55:29, Stefan Dösinger a écrit :
Just asking, does this game hit the This->first_attached != This case? This shouldn't happen, I suspect that the refcounting issue is somewhere else. Also the This->first_complex == This check should always return true in theory.
Can you send me a +ddraw,+d3d7 trace of the game, with and without your
patch?
The patch is 2 week-old, but now I remember, look :-o :
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index 587a3e9..764621c 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -300,7 +300,19 @@ IDirectDrawSurfaceImpl_Release(IDirectDr */ if( (This->first_complex != This) && !(This->surface_desc.ddsCaps.dwCaps & DDSCAPS_TEXTURE)) { + static BOOL ADDREF = TRUE; FIXME("(%p) Destroying a surface which is a attached to a complex root %p\n", This, This->first_complex); + if (ADDREF) { + ADDREF = FALSE; + IDirectDrawSurface_AddRef(iface); + IDirectDrawSurface_AddRef(iface); + IDirectDrawSurface_AddRef(iface); + IDirectDrawSurface_AddRef(iface); + IDirectDrawSurface_AddRef(iface); + IDirectDrawSurface_AddRef(iface); + IDirectDrawSurface_AddRef(iface); + return This->ref; + } } ddraw = This->ddraw;
With this hack I get :
trace:ddraw:IDirectDrawSurfaceImpl_Release (0x1ab828) : Releasing from 2 trace:ddraw:IDirectDrawSurfaceImpl_Release (0x1ab828) : Releasing from 1 fixme:ddraw:IDirectDrawSurfaceImpl_Release (0x1ab828) Destroying a surface which is a attached to a complex root 0x158170 trace:ddraw:IDirectDrawSurfaceImpl_AddRef (0x1ab828) : AddRef increasing from 0 trace:ddraw:IDirectDrawSurfaceImpl_AddRef (0x1ab828) : AddRef increasing from 1 trace:ddraw:IDirectDrawSurfaceImpl_AddRef (0x1ab828) : AddRef increasing from 2 trace:ddraw:IDirectDrawSurfaceImpl_AddRef (0x1ab828) : AddRef increasing from 3 trace:ddraw:IDirectDrawSurfaceImpl_AddRef (0x1ab828) : AddRef increasing from 4 trace:ddraw:IDirectDrawSurfaceImpl_AddRef (0x1ab828) : AddRef increasing from 5 trace:ddraw:IDirectDrawSurfaceImpl_AddRef (0x1ab828) : AddRef increasing from 6 trace:ddraw:IDirectDrawSurfaceImpl_Release (0x1ab828) : Releasing from 7 trace:ddraw:IDirectDrawSurfaceImpl_Release (0x1ab828) : Releasing from 6 trace:ddraw:IDirectDrawSurfaceImpl_Release (0x1ab828) : Releasing from 5 trace:ddraw:IDirectDrawSurfaceImpl_Release (0x1ab828) : Releasing from 4 trace:ddraw:IDirectDrawSurfaceImpl_Release (0x1ab828) : Releasing from 3 trace:ddraw:IDirectDrawSurfaceImpl_Release (0x1ab828) : Releasing from 2 trace:ddraw:IDirectDrawSurfaceImpl_Release (0x1ab828) : Releasing from 1 fixme:ddraw:IDirectDrawSurfaceImpl_Release (0x1ab828) Destroying a surface which is a attached to a complex root 0x158170
0x1ab828 is the backbuffer, and the Release calls are externals :
Backtrace: =>1 0x7ea29a2e IDirectDrawSurfaceImpl_Release+0x9e(iface=0x1ab828) [/home/elie/Projets/wine/wine-git/dlls/ddraw/surface.c:401] in ddraw (0x7ea29a2e) 2 0x00432881 in runtime (+0x32881) (0x00432881) 3 0x00410b38 in runtime (+0x10b38) (0x00410b38)
This is indeed a weird behaviour but afaiu we should not destroy the backbuffer ( or at least detach it from the complex root, but I don't think this is necessary )