wined3d: Release the previous render target only after replacing it in IWineD3DDevice...
authorHenri Verbeet <hverbeet@codeweavers.com>
Tue, 17 Aug 2010 17:03:27 +0000 (19:03 +0200)
committerAlexandre Julliard <julliard@winehq.org>
Wed, 18 Aug 2010 07:41:26 +0000 (09:41 +0200)
dlls/wined3d/device.c

index d615004a6460e57b1c28f34ce82420e2ab25fb14..9651b51a2e243e4502d3a24e69ee3b21954bf92e 100644 (file)
@@ -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)