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

Michael Meeks michael.meeks at collabora.com
Wed Sep 16 05:29:58 PDT 2015


 vcl/inc/opengl/win/gdiimpl.hxx      |    1 +
 vcl/opengl/gdiimpl.cxx              |    9 +++++++--
 vcl/opengl/win/gdiimpl.cxx          |   19 ++++++++++++++++++-
 vcl/source/opengl/OpenGLContext.cxx |    3 +++
 vcl/source/window/paint.cxx         |    8 ++++++++
 vcl/win/source/window/salframe.cxx  |    4 ++--
 6 files changed, 39 insertions(+), 5 deletions(-)

New commits:
commit b62f83c88b725d936b09cdd28a5ab625ac7c6d3e
Author: Michael Meeks <michael.meeks at collabora.com>
Date:   Mon Sep 14 18:09:25 2015 +0100

    tdf#94213 - defer glFlushing until we've re-rendered after a re-size.
    
    Avoids a rather horrible flickering problem in GL mode.
    
    Squashing:
    
    tdf#94213 - release offscreen texture properly on re-size.
    
    We need to ensure that we use an initialized context, and that
    (when we re-parent) we DeInit and so reset the previous OpenGLContext.
    Make UseContext more paranoid as well for good measure.
    
    Squashing:
    
    tdf#94213 - cleanup associated GL contexts properly when DCs released.
    
    Change-Id: I6b9fb899777d8e460999ac3ff038a1302e434bb5
    Reviewed-on: https://gerrit.libreoffice.org/18607
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Tor Lillqvist <tml at collabora.com>

diff --git a/vcl/inc/opengl/win/gdiimpl.hxx b/vcl/inc/opengl/win/gdiimpl.hxx
index 04bb151..5c91727 100644
--- a/vcl/inc/opengl/win/gdiimpl.hxx
+++ b/vcl/inc/opengl/win/gdiimpl.hxx
@@ -34,6 +34,7 @@ protected:
     virtual bool UseContext( const rtl::Reference<OpenGLContext> &pContext ) SAL_OVERRIDE;
 
 public:
+    virtual void Init() SAL_OVERRIDE;
     virtual void copyBits( const SalTwoRect& rPosAry, SalGraphics* pSrcGraphics ) SAL_OVERRIDE;
 
 
diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 85c3a3a..37b21f3 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -115,7 +115,8 @@ void OpenGLSalGraphicsImpl::Init()
     // check if we can simply re-use the same context
     if( mpContext.is() )
     {
-        if( !UseContext( mpContext ) )
+        if( !mpContext->isInitialized() ||
+            !UseContext( mpContext ) )
             ReleaseContext();
     }
 
@@ -124,8 +125,12 @@ void OpenGLSalGraphicsImpl::Init()
         maOffscreenTex.GetWidth()  != GetWidth() ||
         maOffscreenTex.GetHeight() != GetHeight() )
     {
-        if( mpContext.is() ) // valid context
+        if( maOffscreenTex && // don't work to release empty textures
+            mpContext.is() )  // valid context
+        {
+            mpContext->makeCurrent();
             mpContext->ReleaseFramebuffer( maOffscreenTex );
+        }
         maOffscreenTex = OpenGLTexture();
     }
 }
diff --git a/vcl/opengl/win/gdiimpl.cxx b/vcl/opengl/win/gdiimpl.cxx
index 30088a9..517cff1 100644
--- a/vcl/opengl/win/gdiimpl.cxx
+++ b/vcl/opengl/win/gdiimpl.cxx
@@ -43,7 +43,24 @@ bool WinOpenGLSalGraphicsImpl::UseContext( const rtl::Reference<OpenGLContext> &
         return false;
     if( IsOffscreen() )
         return true;
-    return pContext->getOpenGLWindow().hWnd == mrParent.mhWnd;
+    return pContext->getOpenGLWindow().hWnd == mrParent.mhWnd &&
+           pContext->getOpenGLWindow().hDC == mrParent.mhLocalDC;
+}
+
+void WinOpenGLSalGraphicsImpl::Init()
+{
+    if ( !IsOffscreen() && mpContext.is() && mpContext->isInitialized() &&
+         ( mpContext->getOpenGLWindow().hWnd != mrParent.mhWnd ||
+           mpContext->getOpenGLWindow().hDC == mrParent.mhLocalDC ) )
+    {
+        // This can legitimiately happen, SalFrame keeps 2x
+        // SalGraphics which share the same hWnd and hDC.
+        // The shape 'Area' dialog does reparenting to trigger this.
+        SAL_WARN("vcl.opengl", "Unusual: Windows handle / DC changed without DeInit");
+        DeInit();
+    }
+
+    OpenGLSalGraphicsImpl::Init();
 }
 
 namespace
diff --git a/vcl/source/opengl/OpenGLContext.cxx b/vcl/source/opengl/OpenGLContext.cxx
index ea9664e..2502a83 100644
--- a/vcl/source/opengl/OpenGLContext.cxx
+++ b/vcl/source/opengl/OpenGLContext.cxx
@@ -1690,6 +1690,9 @@ void OpenGLContext::ReleaseFramebuffer( const OpenGLTexture& rTexture )
 {
     OpenGLZone aZone;
 
+    if (!rTexture) // no texture to release.
+        return;
+
     OpenGLFramebuffer* pFramebuffer = mpLastFramebuffer;
 
     while( pFramebuffer )
diff --git a/vcl/source/window/paint.cxx b/vcl/source/window/paint.cxx
index 80de1a4..ae846ae 100644
--- a/vcl/source/window/paint.cxx
+++ b/vcl/source/window/paint.cxx
@@ -651,6 +651,8 @@ IMPL_LINK_NOARG_TYPED(Window, ImplHandlePaintHdl, Idle *, void)
         return;
     }
 
+    BeginPaint();
+
     // save paint events until resizing or initial sizing done
     if (!ImplDoTiledRendering() && mpWindowImpl->mbFrame &&
         (mpWindowImpl->mpFrameData->maResizeIdle.IsActive() ||
@@ -662,12 +664,16 @@ IMPL_LINK_NOARG_TYPED(Window, ImplHandlePaintHdl, Idle *, void)
     {
         ImplCallOverlapPaint();
     }
+
+    EndPaint();
 }
 
 IMPL_LINK_NOARG_TYPED(Window, ImplHandleResizeTimerHdl, Idle *, void)
 {
     if( mpWindowImpl->mbReallyVisible )
     {
+        BeginPaint();
+
         ImplCallResize();
         if( ImplDoTiledRendering() )
         {
@@ -678,6 +684,8 @@ IMPL_LINK_NOARG_TYPED(Window, ImplHandleResizeTimerHdl, Idle *, void)
             mpWindowImpl->mpFrameData->maPaintIdle.Stop();
             mpWindowImpl->mpFrameData->maPaintIdle.GetIdleHdl().Call( NULL );
         }
+
+        EndPaint();
     }
 }
 
diff --git a/vcl/win/source/window/salframe.cxx b/vcl/win/source/window/salframe.cxx
index f8e0b69..0a6fb73 100644
--- a/vcl/win/source/window/salframe.cxx
+++ b/vcl/win/source/window/salframe.cxx
@@ -1048,7 +1048,7 @@ void WinSalFrame::ReleaseGraphics( SalGraphics* pGraphics )
             SalData* pSalData = GetSalData();
             if ( mpGraphics2->getDefPal() )
                 SelectPalette( mpGraphics2->getHDC(), mpGraphics2->getDefPal(), TRUE );
-            mpGraphics2->InitGraphics();
+            mpGraphics2->DeInitGraphics();
             SendMessageW( pSalData->mpFirstInstance->mhComWnd,
                              SAL_MSG_RELEASEDC,
                              (WPARAM)mhWnd,
@@ -1498,7 +1498,7 @@ static void ImplSetParentFrame( WinSalFrame* pThis, HWND hNewParentWnd, bool bAs
     {
         if ( pThis->mpGraphics->getDefPal() )
             SelectPalette( pThis->mpGraphics->getHDC(), pThis->mpGraphics->getDefPal(), TRUE );
-        pThis->mpGraphics->InitGraphics();
+        pThis->mpGraphics->DeInitGraphics();
         ReleaseDC( pThis->mhWnd, pThis->mpGraphics->getHDC() );
     }
 


More information about the Libreoffice-commits mailing list