diff options
author | Michael Meeks <michael.meeks@collabora.com> | 2015-09-02 22:14:10 +0100 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2015-09-02 22:46:48 +0100 |
commit | 16b0e217c1f67948374ff050496e5d4ffb8ceb90 (patch) | |
tree | 4ac841f030ae1868ff544ae6e5320d6d847f3a5b /vcl | |
parent | 75eb5a5cae3276fff4eee17af24916bdf5e7381b (diff) |
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
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/generic/app/geninst.cxx | 2 | ||||
-rw-r--r-- | vcl/osx/salinst.cxx | 2 | ||||
-rw-r--r-- | vcl/source/opengl/OpenGLContext.cxx | 14 | ||||
-rw-r--r-- | vcl/source/opengl/OpenGLHelper.cxx | 2 | ||||
-rw-r--r-- | vcl/win/source/app/salinst.cxx | 5 |
5 files changed, 21 insertions, 4 deletions
diff --git a/vcl/generic/app/geninst.cxx b/vcl/generic/app/geninst.cxx index eeb2a574f714..ef7bec0ed0d9 100644 --- a/vcl/generic/app/geninst.cxx +++ b/vcl/generic/app/geninst.cxx @@ -54,7 +54,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 9d8f80e17e48..b92c6ba8a4ff 100644 --- a/vcl/osx/salinst.cxx +++ b/vcl/osx/salinst.cxx @@ -276,7 +276,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 49feb75368b4..3c305d523d98 100644 --- a/vcl/source/opengl/OpenGLContext.cxx +++ b/vcl/source/opengl/OpenGLContext.cxx @@ -1336,6 +1336,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 6019850c88fe..62cb91887d4e 100644 --- a/vcl/source/opengl/OpenGLHelper.cxx +++ b/vcl/source/opengl/OpenGLHelper.cxx @@ -694,7 +694,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 8726814548b3..7458efa20214 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 @@ -178,7 +178,10 @@ void SalYieldMutex::release() else { if ( mnCount == 1 ) + { mnThreadId = 0; + OpenGLContext::prepareForYield(); + } mnCount--; m_mutex.release(); } |