From 40565211fb70bff4b1622570a6b11edd646c00bd Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Mon, 29 Jun 2009 10:11:23 +0200 Subject: [PATCH] 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 file changed, 22 insertions(+), 14 deletions(-) diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index e2bce21309..d8cc87680c 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(); -- 2.32.0.93.g670b81a890