Ivan Gyurdiev wrote:
Karsten Elfenbein wrote:
- don't prevent IUnknown_Release of pDecl in the exit section and fix
This seems wrong, d3d9 does not keep an internal reference of the vdecl. Try the attached patch instead, let me know if it works...
...better yet, try this one
--- dlls/d3d9/d3d9_private.h | 4 ++++ dlls/d3d9/device.c | 3 +++ dlls/d3d9/vertexdeclaration.c | 6 +++++- 3 files changed, 12 insertions(+), 1 deletions(-)
diff --git a/dlls/d3d9/d3d9_private.h b/dlls/d3d9/d3d9_private.h index 2d6397e..c5cef9f 100644 --- a/dlls/d3d9/d3d9_private.h +++ b/dlls/d3d9/d3d9_private.h @@ -176,6 +176,10 @@ typedef struct IDirect3DDevice9Impl /* IDirect3DDevice9 fields */ IWineD3DDevice *WineD3DDevice;
+ /* A vertex declaration was converted from setFVF. + * Keep track of it, so it can be properly freed */ + IDirect3DVertexDeclaration9 *convertedDecl; + } IDirect3DDevice9Impl;
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index 6eeaceb..5a836b9 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -60,6 +60,8 @@ static ULONG WINAPI IDirect3DDevice9Impl if (ref == 0) { IWineD3DDevice_Uninit3D(This->WineD3DDevice); IWineD3DDevice_Release(This->WineD3DDevice); + if (This->convertedDecl != NULL) + IUnknown_Release(This->convertedDecl); HeapFree(GetProcessHeap(), 0, This); } return ref; @@ -731,6 +733,7 @@ HRESULT WINAPI IDirect3DDevice9Impl_Se
hr = IDirect3DDevice9Impl_SetVertexDeclaration(iface, pDecl); if (hr != S_OK) goto exit; + This->convertedDecl = pDecl; pDecl = NULL;
exit: diff --git a/dlls/d3d9/vertexdeclaration.c b/dlls/d3d9/vertexdeclaration.c index 246b52f..88f5909 100644 --- a/dlls/d3d9/vertexdeclaration.c +++ b/dlls/d3d9/vertexdeclaration.c @@ -300,8 +300,12 @@ HRESULT WINAPI IDirect3DDevice9Impl_Se IDirect3DVertexDeclaration9Impl *pDeclImpl = (IDirect3DVertexDeclaration9Impl *)pDecl; HRESULT hr = D3D_OK;
- TRACE("(%p) : Relay\n", iface); + if (This->convertedDecl && This->convertedDecl != pDecl) { + IUnknown_Release(This->convertedDecl); + This->convertedDecl = NULL; + }
+ TRACE("(%p) : Relay\n", iface); hr = IWineD3DDevice_SetVertexDeclaration(This->WineD3DDevice, pDeclImpl == NULL ? NULL : pDeclImpl->wineD3DVertexDeclaration);
return hr;