Henri Verbeet : wined3d: Prevent GL calls from DestroyContext() if we failed to make the GL context current.
Module: wine Branch: master Commit: 40565211fb70bff4b1622570a6b11edd646c00bd URL: http://source.winehq.org/git/wine.git/?a=commit;h=40565211fb70bff4b1622570a6... Author: Henri Verbeet <hverbeet(a)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();
participants (1)
-
Alexandre Julliard