[Libreoffice-commits] core.git: Branch 'libreoffice-5-0' - include/vcl vcl/source

Miklos Vajna vmiklos at collabora.co.uk
Tue Sep 1 00:22:36 PDT 2015


 include/vcl/opengl/OpenGLContext.hxx |    1 +
 vcl/source/opengl/OpenGLContext.cxx  |   29 ++++++++++++++++++++++-------
 2 files changed, 23 insertions(+), 7 deletions(-)

New commits:
commit 20c92dc6b772a6016501499bb1ecc53686dba1fb
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Fri Aug 14 09:57:53 2015 +0200

    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().
    
    Conflicts:
    	vcl/source/opengl/OpenGLContext.cxx
    
    Change-Id: I6b77e0c06fd85fdae0386a0801f1de1838524586
    Reviewed-on: https://gerrit.libreoffice.org/17750
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    Tested-by: Miklos Vajna <vmiklos at collabora.co.uk>
    Reviewed-on: https://gerrit.libreoffice.org/18219
    Reviewed-by: Jan Holesovsky <kendy at collabora.com>
    Tested-by: Jan Holesovsky <kendy at collabora.com>

diff --git a/include/vcl/opengl/OpenGLContext.hxx b/include/vcl/opengl/OpenGLContext.hxx
index 2d2ce8f..73434a0 100644
--- a/include/vcl/opengl/OpenGLContext.hxx
+++ b/include/vcl/opengl/OpenGLContext.hxx
@@ -238,6 +238,7 @@ public:
 
 private:
     SAL_DLLPRIVATE bool InitGLEW();
+    SAL_DLLPRIVATE void InitGLEWDebugging();
     SAL_DLLPRIVATE bool initWindow();
     SAL_DLLPRIVATE bool ImplInit();
 #if defined( UNX ) && !defined MACOSX && !defined IOS && !defined ANDROID && !defined(LIBO_HEADLESS)
diff --git a/vcl/source/opengl/OpenGLContext.cxx b/vcl/source/opengl/OpenGLContext.cxx
index d4c2a83..388a1a0 100644
--- a/vcl/source/opengl/OpenGLContext.cxx
+++ b/vcl/source/opengl/OpenGLContext.cxx
@@ -869,7 +869,9 @@ bool OpenGLContext::ImplInit()
         }
     }
 
-    return InitGLEW();
+    bool bRet = InitGLEW();
+    InitGLEWDebugging();
+    return bRet;
 }
 
 #elif defined( _WIN32 )
@@ -978,7 +980,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");
@@ -987,6 +996,7 @@ bool OpenGLContext::ImplInit()
     }
 
     wglMakeCurrent(NULL, NULL);
+    InitGLEWDebugging();
     wglDeleteContext(hTempRC);
 
     if (!wglMakeCurrent(m_aGLWin.hDC, m_aGLWin.hRC))
@@ -1016,7 +1026,9 @@ bool OpenGLContext::ImplInit()
     NSOpenGLView* pView = getOpenGLView();
     OpenGLWrapper::makeCurrent(pView);
 
-    return InitGLEW();
+    bool bRet = InitGLEW();
+    InitGLEWDebugging();
+    return bRet;
 }
 
 #else
@@ -1047,6 +1059,13 @@ bool OpenGLContext::InitGLEW()
             bGlewInit = true;
     }
 
+    VCL_GL_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)
@@ -1068,10 +1087,6 @@ bool OpenGLContext::InitGLEW()
     // Test hooks for inserting tracing messages into the stream
     VCL_GL_INFO("vcl.opengl", "LibreOffice GLContext initialized: " << this);
 #endif
-
-    VCL_GL_INFO("vcl.opengl", "OpenGLContext::ImplInit----end");
-    mbInitialized = true;
-    return true;
 }
 
 void OpenGLContext::setWinPosAndSize(const Point &rPos, const Size& rSize)


More information about the Libreoffice-commits mailing list