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...
--- dlls/d3d9/d3d9_private.h | 4 ++++ dlls/d3d9/device.c | 1 + dlls/d3d9/vertexdeclaration.c | 6 +++++- 3 files changed, 10 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..185a7ef 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -731,6 +731,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;