static void swapchain_cleanup(struct wined3d_swapchain *swapchain) { HRESULT hr; UINT i; TRACE("Destroying swapchain %p.\n", swapchain); wined3d_swapchain_set_gamma_ramp(swapchain, 0, &swapchain->orig_gamma); /* Release the swapchain's draw buffers. Make sure swapchain->back_buffers[0] * is the last buffer to be destroyed, FindContext() depends on that. */ if (swapchain->front_buffer) { wined3d_texture_set_swapchain(swapchain->front_buffer, NULL); if (wined3d_texture_decref(swapchain->front_buffer)) WARN("Something's still holding the front buffer (%p).\n", swapchain->front_buffer); swapchain->front_buffer = NULL; } if (swapchain->back_buffers) { i = swapchain->desc.backbuffer_count; while (i--) { wined3d_texture_set_swapchain(swapchain->back_buffers[i], NULL); if (wined3d_texture_decref(swapchain->back_buffers[i])) WARN("Something's still holding back buffer %u (%p).\n", i, swapchain->back_buffers[i]); } HeapFree(GetProcessHeap(), 0, swapchain->back_buffers); swapchain->back_buffers = NULL; } for (i = 0; i < swapchain->num_contexts; ++i) { context_destroy(swapchain->device, swapchain->context[i]); } HeapFree(GetProcessHeap(), 0, swapchain->context); /* Restore the screen resolution if we rendered in fullscreen. * This will restore the screen resolution to what it was before creating * the swapchain. In case of d3d8 and d3d9 this will be the original * desktop resolution. In case of d3d7 this will be a NOP because ddraw * sets the resolution before starting up Direct3D, thus orig_width and * orig_height will be equal to the modes in the presentation params. */ if (!swapchain->desc.windowed && swapchain->desc.auto_restore_display_mode) { if (FAILED(hr = wined3d_set_adapter_display_mode(swapchain->device->wined3d, swapchain->device->adapter->ordinal, &swapchain->original_mode))) ERR("Failed to restore display mode, hr %#x.\n", hr); } if (swapchain->backup_dc) { TRACE("Destroying backup wined3d window %p, dc %p.\n", swapchain->backup_wnd, swapchain->backup_dc); wined3d_release_dc(swapchain->backup_wnd, swapchain->backup_dc); DestroyWindow(swapchain->backup_wnd); } }
/* Do not call while under the GL lock. */ static void swapchain_cleanup(struct wined3d_swapchain *swapchain) { struct wined3d_display_mode mode; UINT i; TRACE("Destroying swapchain %p.\n", swapchain); wined3d_swapchain_set_gamma_ramp(swapchain, 0, &swapchain->orig_gamma); /* Release the swapchain's draw buffers. Make sure swapchain->back_buffers[0] * is the last buffer to be destroyed, FindContext() depends on that. */ if (swapchain->front_buffer) { surface_set_container(swapchain->front_buffer, WINED3D_CONTAINER_NONE, NULL); if (wined3d_surface_decref(swapchain->front_buffer)) WARN("Something's still holding the front buffer (%p).\n", swapchain->front_buffer); swapchain->front_buffer = NULL; } if (swapchain->back_buffers) { i = swapchain->desc.backbuffer_count; while (i--) { surface_set_container(swapchain->back_buffers[i], WINED3D_CONTAINER_NONE, NULL); if (wined3d_surface_decref(swapchain->back_buffers[i])) WARN("Something's still holding back buffer %u (%p).\n", i, swapchain->back_buffers[i]); } HeapFree(GetProcessHeap(), 0, swapchain->back_buffers); swapchain->back_buffers = NULL; } for (i = 0; i < swapchain->num_contexts; ++i) { context_destroy(swapchain->device, swapchain->context[i]); } HeapFree(GetProcessHeap(), 0, swapchain->context); /* Restore the screen resolution if we rendered in fullscreen. * This will restore the screen resolution to what it was before creating * the swapchain. In case of d3d8 and d3d9 this will be the original * desktop resolution. In case of d3d7 this will be a NOP because ddraw * sets the resolution before starting up Direct3D, thus orig_width and * orig_height will be equal to the modes in the presentation params. */ if (!swapchain->desc.windowed && swapchain->desc.auto_restore_display_mode) { mode.width = swapchain->orig_width; mode.height = swapchain->orig_height; mode.refresh_rate = 0; mode.format_id = swapchain->orig_fmt; wined3d_device_set_display_mode(swapchain->device, 0, &mode); } if (swapchain->backup_dc) { TRACE("Destroying backup wined3d window %p, dc %p.\n", swapchain->backup_wnd, swapchain->backup_dc); ReleaseDC(swapchain->backup_wnd, swapchain->backup_dc); DestroyWindow(swapchain->backup_wnd); } }