From 3f0ea3d082342d62ede57383bf896751d4353c20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20D=C3=B6singer?= Date: Mon, 17 Sep 2007 14:55:08 +0200 Subject: [PATCH] wined3d: Move lastActiveRenderTarget cleanup to the device. --- dlls/wined3d/device.c | 31 +++++++++++++++++++++++++++++++ dlls/wined3d/surface.c | 31 ------------------------------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 729acf7b8f0..30b80cd5ab6 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -6869,6 +6869,37 @@ static void WINAPI IWineD3DDeviceImpl_ResourceReleased(IWineD3DDevice *iface, IW /* Cleanup any FBO attachments if d3d is enabled */ if(This->d3d_initialized) { + if((IWineD3DSurface *)resource == This->lastActiveRenderTarget) { + IWineD3DSwapChainImpl *swapchain = This->swapchains ? (IWineD3DSwapChainImpl *) This->swapchains[0] : NULL; + + TRACE("Last active render target destroyed\n"); + /* Find a replacement surface for the currently active back buffer. The context manager does not do NULL + * checks, so switch to a valid target as long as the currently set surface is still valid. Use the + * surface of the implicit swpchain. If that is the same as the destroyed surface the device is destroyed + * and the lastActiveRenderTarget member shouldn't matter + */ + if(swapchain) { + if(swapchain->backBuffer && swapchain->backBuffer[0] != (IWineD3DSurface *)resource) { + TRACE("Activating primary back buffer\n"); + ActivateContext(This, swapchain->backBuffer[0], CTXUSAGE_RESOURCELOAD); + } else if(!swapchain->backBuffer && swapchain->frontBuffer != (IWineD3DSurface *)resource) { + /* Single buffering environment */ + TRACE("Activating primary front buffer\n"); + ActivateContext(This, swapchain->frontBuffer, CTXUSAGE_RESOURCELOAD); + } else { + TRACE("Device is being destroyed, setting lastActiveRenderTarget = 0xdeadbabe\n"); + /* Implicit render target destroyed, that means the device is being destroyed + * whatever we set here, it shouldn't matter + */ + This->lastActiveRenderTarget = (IWineD3DSurface *) 0xdeadbabe; + } + } else { + /* May happen during ddraw uninitialization */ + TRACE("Render target set, but swapchain does not exist!\n"); + This->lastActiveRenderTarget = (IWineD3DSurface *) 0xdeadcafe; + } + } + for (i = 0; i < GL_LIMITS(buffers); ++i) { if (This->fbo_color_attachments[i] == (IWineD3DSurface *)resource) { bind_fbo(iface, GL_FRAMEBUFFER_EXT, &This->fbo); diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 6675f4ea953..e42c80b2de7 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -343,37 +343,6 @@ ULONG WINAPI IWineD3DSurfaceImpl_Release(IWineD3DSurface *iface) { renderbuffer_entry_t *entry, *entry2; TRACE("(%p) : cleaning up\n", This); - if(iface == device->lastActiveRenderTarget) { - IWineD3DSwapChainImpl *swapchain = device->swapchains ? (IWineD3DSwapChainImpl *) device->swapchains[0] : NULL; - - TRACE("Last active render target destroyed\n"); - /* Find a replacement surface for the currently active back buffer. The context manager does not do NULL - * checks, so switch to a valid target as long as the currently set surface is still valid. Use the - * surface of the implicit swpchain. If that is the same as the destroyed surface the device is destroyed - * and the lastActiveRenderTarget member shouldn't matter - */ - if(swapchain) { - if(swapchain->backBuffer && swapchain->backBuffer[0] != iface) { - TRACE("Activating primary back buffer\n"); - ActivateContext(device, swapchain->backBuffer[0], CTXUSAGE_RESOURCELOAD); - } else if(!swapchain->backBuffer && swapchain->frontBuffer != iface) { - /* Single buffering environment */ - TRACE("Activating primary front buffer\n"); - ActivateContext(device, swapchain->frontBuffer, CTXUSAGE_RESOURCELOAD); - } else { - TRACE("Device is being destroyed, setting lastActiveRenderTarget = 0xdeadbabe\n"); - /* Implicit render target destroyed, that means the device is being destroyed - * whatever we set here, it shouldn't matter - */ - device->lastActiveRenderTarget = (IWineD3DSurface *) 0xdeadbabe; - } - } else { - /* May happen during ddraw uninitialization */ - TRACE("Render target set, but swapchain does not exist!\n"); - device->lastActiveRenderTarget = (IWineD3DSurface *) 0xdeadcafe; - } - } - if (This->glDescription.textureName != 0) { /* release the openGL texture.. */ /* Need a context to destroy the texture. Use the currently active render target, but only if