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