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

Michael Meeks michael.meeks at collabora.com
Wed Sep 2 14:49:28 PDT 2015


 include/vcl/opengl/OpenGLContext.hxx |    3 +++
 vcl/generic/app/geninst.cxx          |    2 +-
 vcl/osx/salinst.cxx                  |    2 +-
 vcl/source/opengl/OpenGLContext.cxx  |   14 ++++++++++++++
 vcl/source/opengl/OpenGLHelper.cxx   |    2 +-
 vcl/win/source/app/salinst.cxx       |    5 ++++-
 6 files changed, 24 insertions(+), 4 deletions(-)

New commits:
commit acbf98d6f1af77510bd0fbe0a47fba97080c1bbc
Author: Michael Meeks <michael.meeks at collabora.com>
Date:   Wed Sep 2 22:14:10 2015 +0100

    tdf#93867 - clear current GL context before thread switch.
    
    Fixes regression from otherwise a nice cleanup in:
        d20092259c7ea63885a539f911788715f8147ee9
    
    Also get polarity of debug logging only with a context right.
    
    Change-Id: Id322471f01e5656e758aefc57b0d4d5ad073ec54
    Reviewed-on: https://gerrit.libreoffice.org/18282
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
    Tested-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/include/vcl/opengl/OpenGLContext.hxx b/include/vcl/opengl/OpenGLContext.hxx
index 5aa318e..259222a 100644
--- a/include/vcl/opengl/OpenGLContext.hxx
+++ b/include/vcl/opengl/OpenGLContext.hxx
@@ -212,7 +212,10 @@ public:
 
     /// Is this GL context the current context ?
     bool isCurrent();
+    /// release bound resources from the current context
     static void clearCurrent();
+    /// release contexts etc. before (potentially) allowing another thread run.
+    static void prepareForYield();
     /// Is there a current GL context ?
     static bool hasCurrent();
     /// make this GL context current - so it is implicit in subsequent GL calls
diff --git a/vcl/generic/app/geninst.cxx b/vcl/generic/app/geninst.cxx
index 327d880..d73b72e 100644
--- a/vcl/generic/app/geninst.cxx
+++ b/vcl/generic/app/geninst.cxx
@@ -55,7 +55,7 @@ void SalYieldMutex::release()
     {
         if ( mnCount == 1 )
         {
-            OpenGLContext::clearCurrent();
+            OpenGLContext::prepareForYield();
             mnThreadId = 0;
         }
         mnCount--;
diff --git a/vcl/osx/salinst.cxx b/vcl/osx/salinst.cxx
index cec89e8..58a52d5 100644
--- a/vcl/osx/salinst.cxx
+++ b/vcl/osx/salinst.cxx
@@ -271,7 +271,7 @@ void SalYieldMutex::release()
     {
         if ( mnCount == 1 )
         {
-            // TODO: add OpenGLContext::clearCurrent with vcl OpenGL support
+            // TODO: add OpenGLContext::prepareForYield with vcl OpenGL support
             mnThreadId = 0;
         }
         mnCount--;
diff --git a/vcl/source/opengl/OpenGLContext.cxx b/vcl/source/opengl/OpenGLContext.cxx
index ad31a36..e217690 100644
--- a/vcl/source/opengl/OpenGLContext.cxx
+++ b/vcl/source/opengl/OpenGLContext.cxx
@@ -1424,6 +1424,20 @@ void OpenGLContext::clearCurrent()
         pCurrentCtx->ReleaseFramebuffers();
 }
 
+void OpenGLContext::prepareForYield()
+{
+    ImplSVData* pSVData = ImplGetSVData();
+
+    SAL_INFO("vcl.opengl", "Unbinding contexts in preparation for yield");
+    // release all framebuffers from the old context so we can re-attach the
+    // texture in the new context
+    OpenGLContext* pCurrentCtx = pSVData->maGDIData.mpLastContext;
+    if( pCurrentCtx && pCurrentCtx->isCurrent() )
+        pCurrentCtx->resetCurrent();
+
+    assert (!hasCurrent());
+}
+
 void OpenGLContext::makeCurrent()
 {
     ImplSVData* pSVData = ImplGetSVData();
diff --git a/vcl/source/opengl/OpenGLHelper.cxx b/vcl/source/opengl/OpenGLHelper.cxx
index d2a917f..c4302eb 100644
--- a/vcl/source/opengl/OpenGLHelper.cxx
+++ b/vcl/source/opengl/OpenGLHelper.cxx
@@ -698,7 +698,7 @@ void OpenGLHelper::debugMsgPrint(const char *pArea, const char *pFormat, ...)
     vsnprintf(pStr, sizeof(pStr), pFormat, aArgs);
     pStr[sizeof(pStr)-20] = '\0';
 
-    bool bHasContext = !OpenGLContext::hasCurrent();
+    bool bHasContext = OpenGLContext::hasCurrent();
     if (!bHasContext)
         strcat(pStr, "- no GL context");
 
diff --git a/vcl/win/source/app/salinst.cxx b/vcl/win/source/app/salinst.cxx
index 1ef22b2..d2fbb52 100644
--- a/vcl/win/source/app/salinst.cxx
+++ b/vcl/win/source/app/salinst.cxx
@@ -153,7 +153,7 @@ void SalYieldMutex::release()
         {
             if ( mnCount == 1 )
             {
-                OpenGLContext::clearCurrent();
+                OpenGLContext::prepareForYield();
 
                 // If we don't call these message, the Output from the
                 // Java clients doesn't come in the right order
@@ -176,7 +176,10 @@ void SalYieldMutex::release()
         else
         {
             if ( mnCount == 1 )
+            {
                 mnThreadId = 0;
+                OpenGLContext::prepareForYield();
+            }
             mnCount--;
             m_mutex.release();
         }


More information about the Libreoffice-commits mailing list