summaryrefslogtreecommitdiff
path: root/vcl/source/opengl
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2015-08-14 09:57:53 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2015-08-14 09:58:15 +0000
commita00df90e1838ac66587376cffb5780f80b0af94b (patch)
tree320beac753f8bd0209828b38cae05eb83db216ed /vcl/source/opengl
parentfcd4c6dabecb348096ed8eb7ffe16c7ec059df31 (diff)
vcl opengl: fix setting up debug context on Windows
At least with my AMD card, in case of SAL_FORCEGL=1 the startup crashes quite early. DrMemory says: ~~Dr.M~~ Error #1: UNADDRESSABLE ACCESS: writing 0x00001414-0x00001415 1 byte(s) ~~Dr.M~~ # 0 atioglxx.dll!DrvPresentBuffers +0xd6ea6 (0x09a248f6 <atioglxx.dll+0x1248f6>) ~~Dr.M~~ # 1 atioglxx.dll!DrvPresentBuffers +0x3c069c (0x09d0e0ed <atioglxx.dll+0x40e0ed>) ~~Dr.M~~ # 2 vcllo.dll!OpenGLContext::InitGLEW [c:\lo\master\vcl\source\opengl\openglcontext.cxx:949] ~~Dr.M~~ # 3 vcllo.dll!OpenGLContext::ImplInit [c:\lo\master\vcl\source\opengl\openglcontext.cxx:866] ~~Dr.M~~ # 4 vcllo.dll!OpenGLContext::init [c:\lo\master\vcl\source\opengl\openglcontext.cxx:786] ~~Dr.M~~ # 5 vcllo.dll!WinOpenGLSalGraphicsImpl::CreateWinContext [c:\lo\master\vcl\opengl\win\gdiimpl.cxx:36] Turns out that in order to enable the GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB extension, the GL context must be created with WGL_CONTEXT_DEBUG_BIT_ARB set. It seems that other drivers did not enforce this so far, but in this case the driver just crashes without this. Fix the problem by splitting out the debug setup part of InitGLEW() into a new InitGLEWDebugging(), and at least on Windows call it only after wglCreateContextAttribsARB() and wglMakeCurrent(). Additionally make sure that in the debug case the necessary flag is passed to wglCreateContextAttribsARB(). Change-Id: I6b77e0c06fd85fdae0386a0801f1de1838524586 Reviewed-on: https://gerrit.libreoffice.org/17750 Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk> Tested-by: Miklos Vajna <vmiklos@collabora.co.uk>
Diffstat (limited to 'vcl/source/opengl')
-rw-r--r--vcl/source/opengl/OpenGLContext.cxx29
1 files changed, 22 insertions, 7 deletions
diff --git a/vcl/source/opengl/OpenGLContext.cxx b/vcl/source/opengl/OpenGLContext.cxx
index c106067dbc2b..051b151e8cef 100644
--- a/vcl/source/opengl/OpenGLContext.cxx
+++ b/vcl/source/opengl/OpenGLContext.cxx
@@ -771,7 +771,9 @@ bool OpenGLContext::ImplInit()
}
}
- return InitGLEW();
+ bool bRet = InitGLEW();
+ InitGLEWDebugging();
+ return bRet;
}
#elif defined( _WIN32 )
@@ -875,7 +877,14 @@ bool OpenGLContext::ImplInit()
// now setup the shared context; this needs a temporary context already
// set up in order to work
- m_aGLWin.hRC = wglCreateContextAttribsARB(m_aGLWin.hDC, hSharedCtx, NULL);
+ int attribs [] =
+ {
+#ifdef DBG_UTIL
+ WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_DEBUG_BIT_ARB,
+#endif
+ 0
+ };
+ m_aGLWin.hRC = wglCreateContextAttribsARB(m_aGLWin.hDC, hSharedCtx, attribs);
if (m_aGLWin.hRC == 0)
{
ImplWriteLastError(GetLastError(), "wglCreateContextAttribsARB in OpenGLContext::ImplInit");
@@ -884,6 +893,7 @@ bool OpenGLContext::ImplInit()
}
wglMakeCurrent(NULL, NULL);
+ InitGLEWDebugging();
wglDeleteContext(hTempRC);
if (!wglMakeCurrent(m_aGLWin.hDC, m_aGLWin.hRC))
@@ -911,7 +921,9 @@ bool OpenGLContext::ImplInit()
NSOpenGLView* pView = getOpenGLView();
OpenGLWrapper::makeCurrent(pView);
- return InitGLEW();
+ bool bRet = InitGLEW();
+ InitGLEWDebugging();
+ return bRet;
}
#else
@@ -940,6 +952,13 @@ bool OpenGLContext::InitGLEW()
bGlewInit = true;
}
+ SAL_INFO("vcl.opengl", "OpenGLContext::ImplInit----end");
+ mbInitialized = true;
+ return true;
+}
+
+void OpenGLContext::InitGLEWDebugging()
+{
#ifdef DBG_UTIL
// only enable debug output in dbgutil build
if( GLEW_ARB_debug_output)
@@ -957,10 +976,6 @@ bool OpenGLContext::InitGLEW()
}
#endif
-
- SAL_INFO("vcl.opengl", "OpenGLContext::ImplInit----end");
- mbInitialized = true;
- return true;
}
void OpenGLContext::setWinPosAndSize(const Point &rPos, const Size& rSize)