[Libreoffice-commits] core.git: include/vcl vcl/source vcl/win

Miklos Vajna vmiklos at collabora.co.uk
Thu Sep 10 23:56:17 PDT 2015


 include/vcl/opengl/OpenGLContext.hxx |    2 ++
 vcl/source/opengl/OpenGLContext.cxx  |   13 +++++++++++--
 vcl/win/source/app/salinst.cxx       |    1 +
 3 files changed, 14 insertions(+), 2 deletions(-)

New commits:
commit 29ec512e8c00984e13cf24accf81ad7c24d8e877
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Thu Sep 10 17:25:27 2015 +0200

    windows opengl: make sure mpLastContext is indeed the current context
    
    There were two problems here:
    
    1) The OpenGLContext ctor registered the instance on the list of
    contexts, but platform-specific call (e.g. wglMakeCurrent()) was only
    made later. Add a registerAsCurrent() member function that helps
    ensuring that the last item in the context list is indeed the current
    context.
    
    2) OpenGLContext::prepareForYield() is called without the solar mutex
    being locked, but it still assumes that the last context in the context
    list is the thread's current context, which may not be true.  The result
    is that during JunitTest_sd_unoapi, we end up in a situation like:
    
    debug:4640:5240: OpenGLContext::registerAsCurrent: wglGetCurrentContext() is 00010001, pSVData->maGDIData.mpLastContext is 00FA65F8
    debug:4640:7944: OpenGLContext::registerAsCurrent: wglGetCurrentContext() is 000D0003, pSVData->maGDIData.mpLastContext is 00FA6C70
    debug:4640:5240: OpenGLContext::prepareForYield: start, wglGetCurrentContext() is 00010001, pSVData->maGDIData.mpLastContext is 00FA6C70
    
    I.e. one thread registers as current, an other registers as current, too (while
    the other thread has the solar mutex), then once the original thread wants to
    release the solar mutex, the real current context and the last item in the
    context list won't match, so the assert at the end of prepareForYield() will
    fail.
    
    Fix this by releasing the GL context in WinSalInstance::DestroyFrame().
    
    With this, JunitTest_sd_unoapi passes on Windows with GL enabled.
    
    Change-Id: Icfb9c65c871586b5df69b5a2ab3aa91843dfc799
    Reviewed-on: https://gerrit.libreoffice.org/18473
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
    Tested-by: Michael Meeks <michael.meeks at collabora.com>

diff --git a/include/vcl/opengl/OpenGLContext.hxx b/include/vcl/opengl/OpenGLContext.hxx
index fbe1238..74fab27 100644
--- a/include/vcl/opengl/OpenGLContext.hxx
+++ b/include/vcl/opengl/OpenGLContext.hxx
@@ -217,6 +217,8 @@ public:
     static bool hasCurrent();
     /// make this GL context current - so it is implicit in subsequent GL calls
     void makeCurrent();
+    /// Put this GL context to the end of the context list.
+    void registerAsCurrent();
     /// reset the GL context so this context is not implicit in subsequent GL calls.
     void resetCurrent();
     void swapBuffers();
diff --git a/vcl/source/opengl/OpenGLContext.cxx b/vcl/source/opengl/OpenGLContext.cxx
index b8e6e31..91573eb 100644
--- a/vcl/source/opengl/OpenGLContext.cxx
+++ b/vcl/source/opengl/OpenGLContext.cxx
@@ -784,6 +784,8 @@ bool OpenGLContext::ImplInit()
 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
 
+    registerAsCurrent();
+
     return bRet;
 }
 
@@ -925,6 +927,8 @@ bool OpenGLContext::ImplInit()
 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
 
+    registerAsCurrent();
+
     return true;
 }
 
@@ -1347,8 +1351,6 @@ void OpenGLContext::prepareForYield()
 
 void OpenGLContext::makeCurrent()
 {
-    ImplSVData* pSVData = ImplGetSVData();
-
     if (isCurrent())
         return;
 
@@ -1383,6 +1385,13 @@ void OpenGLContext::makeCurrent()
     }
 #endif
 
+    registerAsCurrent();
+}
+
+void OpenGLContext::registerAsCurrent()
+{
+    ImplSVData* pSVData = ImplGetSVData();
+
     // move the context to the end of the contexts list
     static int nSwitch = 0;
     VCL_GL_INFO("vcl.opengl", "******* CONTEXT SWITCH " << ++nSwitch << " *********");
diff --git a/vcl/win/source/app/salinst.cxx b/vcl/win/source/app/salinst.cxx
index 7458efa..3927630 100644
--- a/vcl/win/source/app/salinst.cxx
+++ b/vcl/win/source/app/salinst.cxx
@@ -941,6 +941,7 @@ SalFrame* WinSalInstance::CreateFrame( SalFrame* pParent, sal_uLong nSalFrameSty
 
 void WinSalInstance::DestroyFrame( SalFrame* pFrame )
 {
+    OpenGLContext::prepareForYield();
     SendMessageW( mhComWnd, SAL_MSG_DESTROYFRAME, 0, (LPARAM)pFrame );
 }
 


More information about the Libreoffice-commits mailing list