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.me...@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.mohrh...@googlemail.com> Tested-by: Markus Mohrhard <markus.mohrh...@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(); } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits