Am Sonntag 27 August 2006 17:23 schrieb Elie Morisse:
Refcounting fix, Wine devs tell me if I'm wrong as from now on I get something like this w/ The Nomad Soul :
fixme:d3d:IWineD3DDeviceImpl_Release (0x1248028) Device released with resources still bound, acceptable but unexpected fixme:d3d:dumpResources Leftover resource 0x217f988 with type 1,WINED3DRTYPE_SURFACE fixme:d3d:dumpResources Leftover resource 0x1abca8 with type 1,WINED3DRTYPE_SURFACE
Other games I tried aren't affected though, so this one may just be buggy.. Good part is this prevents memory faults in The Nomad Soul at exit and when switching resolution.
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?
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 )