wined3d: Activate a different context if the active render target is destroyed.
This commit is contained in:
parent
762e227994
commit
5e37345b30
|
@ -247,6 +247,38 @@ ULONG WINAPI IWineD3DSurfaceImpl_Release(IWineD3DSurface *iface) {
|
||||||
if (ref == 0) {
|
if (ref == 0) {
|
||||||
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) This->resource.wineD3DDevice;
|
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) This->resource.wineD3DDevice;
|
||||||
TRACE("(%p) : cleaning up\n", This);
|
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 beeing destroyed, setting lastActiveRenderTarget = 0xdeadbabe\n");
|
||||||
|
/* Implicit render target destroyed, that means the device is beeing 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.. */
|
if (This->glDescription.textureName != 0) { /* release the openGL texture.. */
|
||||||
ENTER_GL();
|
ENTER_GL();
|
||||||
TRACE("Deleting texture %d\n", This->glDescription.textureName);
|
TRACE("Deleting texture %d\n", This->glDescription.textureName);
|
||||||
|
@ -269,10 +301,6 @@ ULONG WINAPI IWineD3DSurfaceImpl_Release(IWineD3DSurface *iface) {
|
||||||
if(iface == device->ddraw_primary)
|
if(iface == device->ddraw_primary)
|
||||||
device->ddraw_primary = NULL;
|
device->ddraw_primary = NULL;
|
||||||
|
|
||||||
if(iface == device->lastActiveRenderTarget) {
|
|
||||||
device->lastActiveRenderTarget = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
TRACE("(%p) Released\n", This);
|
TRACE("(%p) Released\n", This);
|
||||||
HeapFree(GetProcessHeap(), 0, This);
|
HeapFree(GetProcessHeap(), 0, This);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue