[PATCH 5/5] wined3d: Properly destroy contexts not owned by the implcit swapchain.
Henri Verbeet
hverbeet at codeweavers.com
Mon Jun 27 19:26:20 CDT 2011
In particular, set num_contexts to 0 in the swapchain that owns the contexts.
---
dlls/wined3d/device.c | 4 ++--
dlls/wined3d/swapchain.c | 11 +++++++++++
dlls/wined3d/wined3d_private.h | 1 +
3 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 6314372..180fd49 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -5547,11 +5547,11 @@ static void delete_opengl_contexts(struct wined3d_device *device, struct wined3d
while (device->context_count)
{
- context_destroy(device, device->contexts[0]);
+ swapchain_destroy_contexts(device->contexts[0]->swapchain);
}
+
HeapFree(GetProcessHeap(), 0, swapchain->context);
swapchain->context = NULL;
- swapchain->num_contexts = 0;
}
/* Do not call while under the GL lock. */
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index fb09ccf..a64c0db 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -1164,6 +1164,17 @@ static struct wined3d_context *swapchain_create_context(struct wined3d_swapchain
return ctx;
}
+void swapchain_destroy_contexts(struct wined3d_swapchain *swapchain)
+{
+ unsigned int i;
+
+ for (i = 0; i < swapchain->num_contexts; ++i)
+ {
+ context_destroy(swapchain->device, swapchain->context[i]);
+ }
+ swapchain->num_contexts = 0;
+}
+
struct wined3d_context *swapchain_get_context(struct wined3d_swapchain *swapchain)
{
DWORD tid = GetCurrentThreadId();
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index e96b7ad..a3e12ff 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2493,6 +2493,7 @@ struct wined3d_swapchain
void x11_copy_to_screen(struct wined3d_swapchain *swapchain, const RECT *rect) DECLSPEC_HIDDEN;
struct wined3d_context *swapchain_get_context(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
+void swapchain_destroy_contexts(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
#define DEFAULT_REFRESH_RATE 0
--
1.7.3.4
More information about the wine-patches
mailing list