Module: wine Branch: master Commit: 40565211fb70bff4b1622570a6b11edd646c00bd URL: http://source.winehq.org/git/wine.git/?a=commit;h=40565211fb70bff4b1622570a6...
Author: Henri Verbeet hverbeet@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();