Henri Verbeet : wined3d: Release the previous render target only after replacing it in IWineD3DDeviceImpl_SetRenderTarget ().
Alexandre Julliard
julliard at winehq.org
Wed Aug 18 12:09:53 CDT 2010
Module: wine
Branch: master
Commit: 35b9d3dbd82944d0a0b4b708087489d8cd003e3a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=35b9d3dbd82944d0a0b4b708087489d8cd003e3a
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Tue Aug 17 19:03:27 2010 +0200
wined3d: Release the previous render target only after replacing it in IWineD3DDeviceImpl_SetRenderTarget().
---
dlls/wined3d/device.c | 12 +++++++-----
1 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index d615004..9651b51 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -5704,6 +5704,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface,
DWORD render_target_idx, IWineD3DSurface *render_target, BOOL set_viewport)
{
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)iface;
+ IWineD3DSurfaceImpl *prev;
TRACE("iface %p, render_target_idx %u, render_target %p, set_viewport %#x.\n",
iface, render_target_idx, render_target, set_viewport);
@@ -5714,7 +5715,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface,
return WINED3DERR_INVALIDCALL;
}
- if (render_target == (IWineD3DSurface *)device->render_targets[render_target_idx])
+ prev = device->render_targets[render_target_idx];
+ if (render_target == (IWineD3DSurface *)prev)
{
TRACE("Trying to do a NOP SetRenderTarget operation.\n");
return WINED3D_OK;
@@ -5733,11 +5735,11 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface,
return WINED3DERR_INVALIDCALL;
}
- if (render_target)
- IWineD3DSurface_AddRef(render_target);
- if (device->render_targets[render_target_idx])
- IWineD3DSurface_Release((IWineD3DSurface *)device->render_targets[render_target_idx]);
+ if (render_target) IWineD3DSurface_AddRef(render_target);
device->render_targets[render_target_idx] = (IWineD3DSurfaceImpl *)render_target;
+ /* Release after the assignment, to prevent device_resource_released()
+ * from seeing the surface as still in use. */
+ if (prev) IWineD3DSurface_Release((IWineD3DSurface *)prev);
/* Render target 0 is special. */
if (!render_target_idx && set_viewport)
More information about the wine-cvs
mailing list