Henri Verbeet : wined3d: Prevent GL calls from DestroyContext() if we failed to make the GL context current.

Alexandre Julliard julliard at winehq.org
Mon Jun 29 09:17:44 CDT 2009


Module: wine
Branch: master
Commit: 40565211fb70bff4b1622570a6b11edd646c00bd
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=40565211fb70bff4b1622570a6b11edd646c00bd

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Mon Jun 29 10:11:23 2009 +0200

wined3d: Prevent GL calls from DestroyContext() if we failed to make the GL context current.

This can happen if the window is destroyed before the device is released.

---

 dlls/wined3d/context.c |   36 ++++++++++++++++++++++--------------
 1 files changed, 22 insertions(+), 14 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index e2bce21..d8cc876 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -1158,30 +1158,38 @@ static void RemoveContextFromArray(IWineD3DDeviceImpl *This, WineD3DContext *con
  *****************************************************************************/
 void DestroyContext(IWineD3DDeviceImpl *This, WineD3DContext *context) {
     struct fbo_entry *entry, *entry2;
+    BOOL has_glctx;
 
     TRACE("Destroying ctx %p\n", context);
 
     /* The correct GL context needs to be active to cleanup the GL resources below */
-    if(pwglGetCurrentContext() != context->glCtx){
-        pwglMakeCurrent(context->hdc, context->glCtx);
-        last_device = NULL;
-    }
+    has_glctx = pwglMakeCurrent(context->hdc, context->glCtx);
+    last_device = NULL;
+
+    if (!has_glctx) WARN("Failed to activate context. Window already destroyed?\n");
 
     ENTER_GL();
 
     LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &context->fbo_list, struct fbo_entry, entry) {
+        if (!has_glctx) entry->id = 0;
         context_destroy_fbo_entry(This, context, entry);
     }
-    if (context->src_fbo) {
-        TRACE("Destroy src FBO %d\n", context->src_fbo);
-        context_destroy_fbo(This, &context->src_fbo);
-    }
-    if (context->dst_fbo) {
-        TRACE("Destroy dst FBO %d\n", context->dst_fbo);
-        context_destroy_fbo(This, &context->dst_fbo);
-    }
-    if(context->dummy_arbfp_prog) {
-        GL_EXTCALL(glDeleteProgramsARB(1, &context->dummy_arbfp_prog));
+    if (has_glctx)
+    {
+        if (context->src_fbo)
+        {
+            TRACE("Destroy src FBO %d\n", context->src_fbo);
+            context_destroy_fbo(This, &context->src_fbo);
+        }
+        if (context->dst_fbo)
+        {
+            TRACE("Destroy dst FBO %d\n", context->dst_fbo);
+            context_destroy_fbo(This, &context->dst_fbo);
+        }
+        if (context->dummy_arbfp_prog)
+        {
+            GL_EXTCALL(glDeleteProgramsARB(1, &context->dummy_arbfp_prog));
+        }
     }
 
     LEAVE_GL();




More information about the wine-cvs mailing list