From: apl Date: Fri, 28 Mar 2014 07:34:27 +0000 (+0400) Subject: 0024747: TKOpenGl - Mesa fails to destroy context if it set to current thread X-Git-Tag: V6_8_0_beta~447 X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=544da5a47701659482b3482ec90147f0ad1f85d3;p=occt-copy.git 0024747: TKOpenGl - Mesa fails to destroy context if it set to current thread --- diff --git a/src/OpenGl/OpenGl_Window.cxx b/src/OpenGl/OpenGl_Window.cxx index 9f390636f2..ba9643585b 100644 --- a/src/OpenGl/OpenGl_Window.cxx +++ b/src/OpenGl/OpenGl_Window.cxx @@ -592,19 +592,18 @@ OpenGl_Window::~OpenGl_Window() } // release "GL" context if it is owned by window + // Mesa implementation can fail to destroy GL context if it set for current thread. + // It should be safer to unset thread GL context before its destruction. #if defined(_WIN32) HWND aWindow = (HWND )myGlContext->myWindow; HDC aWindowDC = (HDC )myGlContext->myWindowDC; HGLRC aWindowGContext = (HGLRC )myGlContext->myGContext; - HGLRC aThreadGlContext = wglGetCurrentContext(); + HGLRC aThreadGContext = wglGetCurrentContext(); myGlContext.Nullify(); - if (aThreadGlContext != NULL) + if (aThreadGContext != NULL) { - // Mesa implementation can fail to reset this thread's context if wglDeleteContext() - // called without this step. This might lead to crash when using newly created - // context if wglMakeCurrent() is not forced right after the wglCreateContext(). - if (aThreadGlContext == aWindowGContext) + if (aThreadGContext == aWindowGContext) { wglMakeCurrent (NULL, NULL); } @@ -613,15 +612,21 @@ OpenGl_Window::~OpenGl_Window() } ReleaseDC (aWindow, aWindowDC); #else - Display* aDisplay = (Display* )myGlContext->myDisplay; - GLXContext aGContext = (GLXContext )myGlContext->myGContext; + Display* aDisplay = (Display* )myGlContext->myDisplay; + GLXContext aWindowGContext = (GLXContext )myGlContext->myGContext; + GLXContext aThreadGContext = glXGetCurrentContext(); myGlContext.Nullify(); if (aDisplay != NULL) { + if (aThreadGContext == aWindowGContext) + { + glXMakeCurrent (aDisplay, None, NULL); + } + // FSXXX sync necessary if non-direct rendering glXWaitGL(); - glXDestroyContext (aDisplay, aGContext); + glXDestroyContext (aDisplay, aWindowGContext); } #endif }