[Libreoffice-commits] core.git: Branch 'feature/opengl-vcl' - 2 commits - include/vcl vcl/inc vcl/opengl vcl/source vcl/unx vcl/win

Louis-Francis Ratté-Boulianne lfrb at collabora.com
Wed Nov 12 09:48:43 PST 2014


 include/vcl/outdev.hxx             |    4 +++-
 vcl/inc/generic/genpspgraphics.h   |    3 ++-
 vcl/inc/headless/svpgdi.hxx        |    3 ++-
 vcl/inc/openglgdiimpl.hxx          |    4 +++-
 vcl/inc/quartz/salgdi.h            |    3 ++-
 vcl/inc/salgdi.hxx                 |    3 ++-
 vcl/inc/salgdiimpl.hxx             |    3 ++-
 vcl/inc/unx/salgdi.h               |    3 ++-
 vcl/inc/win/salgdi.h               |    3 ++-
 vcl/opengl/gdiimpl.cxx             |   25 +++++++++++++++++++------
 vcl/source/opengl/OpenGLHelper.cxx |    1 -
 vcl/source/outdev/outdev.cxx       |   13 +++++++++----
 vcl/source/window/paint.cxx        |    7 +++++--
 vcl/unx/generic/gdi/gdiimpl.hxx    |    3 ++-
 vcl/unx/generic/gdi/salgdi.cxx     |    9 +++++++--
 vcl/win/source/gdi/gdiimpl.hxx     |    3 ++-
 vcl/win/source/gdi/salgdi.cxx      |    9 +++++++--
 17 files changed, 71 insertions(+), 28 deletions(-)

New commits:
commit 309a589ccc4ab2f1cbb9d8d58a50a8f7aafcbcba
Author: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
Date:   Wed Nov 12 12:46:22 2014 -0500

    vcl: Fix the masked texture program attributes binding
    
    Change-Id: Ie7440881f35eaf348aef35beea5a6d407d16a342

diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index c4c2930..393930f 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -285,8 +285,8 @@ bool OpenGLSalGraphicsImpl::CreateMaskedTextureProgram( void )
     if( mnMaskedTextureProgram == 0 )
         return false;
 
-    glBindAttribLocation( mnTextureProgram, GL_ATTRIB_POS, "position" );
-    glBindAttribLocation( mnTextureProgram, GL_ATTRIB_TEX, "tex_coord_in" );
+    glBindAttribLocation( mnMaskedTextureProgram, GL_ATTRIB_POS, "position" );
+    glBindAttribLocation( mnMaskedTextureProgram, GL_ATTRIB_TEX, "tex_coord_in" );
     mnMaskedSamplerUniform = glGetUniformLocation( mnMaskedTextureProgram, "sampler" );
     mnMaskSamplerUniform = glGetUniformLocation( mnMaskedTextureProgram, "mask" );
 
commit 128a96a10ad04d7f646f433eef3e004c13fdb906
Author: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
Date:   Wed Nov 12 12:45:36 2014 -0500

    vcl: Use single-buffer rendering and only flush when necessary
    
    Change-Id: I832dd6f3647fbb423975fa928a5ec32447225e85

diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx
index 5070a5f..cff245c 100644
--- a/include/vcl/outdev.hxx
+++ b/include/vcl/outdev.hxx
@@ -518,7 +518,9 @@ public:
                                     const Point& rSrcPt,  const Size& rSrcSize,
                                     sal_uInt16 nFlags = 0 );
 
-    virtual bool                SwapBuffers();
+    // Call before and after a paint operation to reduce flushing
+    virtual void                BeginPaint();
+    virtual void                EndPaint();
 
 protected:
 
diff --git a/vcl/inc/generic/genpspgraphics.h b/vcl/inc/generic/genpspgraphics.h
index fb7169a..882e475 100644
--- a/vcl/inc/generic/genpspgraphics.h
+++ b/vcl/inc/generic/genpspgraphics.h
@@ -193,7 +193,8 @@ public:
     virtual SystemGraphicsData GetGraphicsData() const SAL_OVERRIDE;
     virtual SystemFontData  GetSysFontData( int nFallbacklevel ) const SAL_OVERRIDE;
 
-    virtual bool SwapBuffers() SAL_OVERRIDE { return false; };
+    virtual void BeginPaint() SAL_OVERRIDE { };
+    virtual void EndPaint() SAL_OVERRIDE { };
 };
 
 #endif // INCLUDED_VCL_INC_GENERIC_GENPSPGRAPHICS_H
diff --git a/vcl/inc/headless/svpgdi.hxx b/vcl/inc/headless/svpgdi.hxx
index cd5622f..9f2604f 100644
--- a/vcl/inc/headless/svpgdi.hxx
+++ b/vcl/inc/headless/svpgdi.hxx
@@ -243,7 +243,8 @@ public:
     virtual SystemGraphicsData GetGraphicsData() const SAL_OVERRIDE;
     virtual SystemFontData  GetSysFontData( int nFallbacklevel ) const SAL_OVERRIDE;
 
-    virtual bool            SwapBuffers() SAL_OVERRIDE { return false; };
+    virtual void            BeginPaint() SAL_OVERRIDE { };
+    virtual void            EndPaint() SAL_OVERRIDE { };
 
 #ifdef IOS
     void                SetVirDevGraphics( CGLayerRef xLayer, CGContextRef xContext, int = 0 );
diff --git a/vcl/inc/openglgdiimpl.hxx b/vcl/inc/openglgdiimpl.hxx
index f80c969..3d1c585 100644
--- a/vcl/inc/openglgdiimpl.hxx
+++ b/vcl/inc/openglgdiimpl.hxx
@@ -38,6 +38,7 @@ protected:
     OpenGLContext maContext;
     SalFrame* mpFrame;
     SalVirtualDevice* mpVDev;
+    int mnPainting;
 
     bool mbOffscreen;
     GLuint mnFramebufferId;
@@ -285,7 +286,8 @@ public:
 
     virtual bool drawGradient(const tools::PolyPolygon& rPolygon, const Gradient& rGradient) SAL_OVERRIDE;
 
-    virtual bool swapBuffers() SAL_OVERRIDE;
+    virtual void beginPaint() SAL_OVERRIDE;
+    virtual void endPaint() SAL_OVERRIDE;
 private:
 };
 
diff --git a/vcl/inc/quartz/salgdi.h b/vcl/inc/quartz/salgdi.h
index caab577..6cc4526 100644
--- a/vcl/inc/quartz/salgdi.h
+++ b/vcl/inc/quartz/salgdi.h
@@ -394,7 +394,8 @@ public:
                             GetGraphicsData() const SAL_OVERRIDE;
     virtual SystemFontData  GetSysFontData( int /* nFallbacklevel */ ) const SAL_OVERRIDE;
 
-    virtual bool            SwapBuffers() SAL_OVERRIDE { return false; };
+    virtual void            BeginPaint() SAL_OVERRIDE { };
+    virtual void            EndPaint() SAL_OVERRIDE { };
 
 private:
     // differences between VCL, Quartz and kHiThemeOrientation coordinate systems
diff --git a/vcl/inc/salgdi.hxx b/vcl/inc/salgdi.hxx
index a3917bb..2453450 100644
--- a/vcl/inc/salgdi.hxx
+++ b/vcl/inc/salgdi.hxx
@@ -412,7 +412,8 @@ public:
                                     sal_uInt8 nTransparency,
                                     const OutputDevice *pOutDev );
 
-    virtual bool                SwapBuffers() = 0;
+    virtual void                BeginPaint() = 0;
+    virtual void                EndPaint() = 0;
 
     virtual SystemGraphicsData  GetGraphicsData() const = 0;
 
diff --git a/vcl/inc/salgdiimpl.hxx b/vcl/inc/salgdiimpl.hxx
index 4b4b735..09ea28f 100644
--- a/vcl/inc/salgdiimpl.hxx
+++ b/vcl/inc/salgdiimpl.hxx
@@ -207,7 +207,8 @@ public:
 
     virtual bool drawGradient(const tools::PolyPolygon& rPolygon, const Gradient& rGradient) = 0;
 
-    virtual bool swapBuffers() = 0;
+    virtual void beginPaint() = 0;
+    virtual void endPaint() = 0;
 };
 
 #endif
diff --git a/vcl/inc/unx/salgdi.h b/vcl/inc/unx/salgdi.h
index d532668..743fc5d 100644
--- a/vcl/inc/unx/salgdi.h
+++ b/vcl/inc/unx/salgdi.h
@@ -269,7 +269,8 @@ public:
     virtual SystemGraphicsData GetGraphicsData() const SAL_OVERRIDE;
     virtual SystemFontData     GetSysFontData( int nFallbackLevel ) const SAL_OVERRIDE;
 
-    virtual bool               SwapBuffers() SAL_OVERRIDE;
+    virtual void               BeginPaint() SAL_OVERRIDE;
+    virtual void               EndPaint() SAL_OVERRIDE;
 
     // create a pixmap from a screen region
     X11Pixmap* GetPixmapFromScreen( const Rectangle& rRect );
diff --git a/vcl/inc/win/salgdi.h b/vcl/inc/win/salgdi.h
index f09af28..69ea4cf 100644
--- a/vcl/inc/win/salgdi.h
+++ b/vcl/inc/win/salgdi.h
@@ -397,7 +397,8 @@ public:
     virtual SystemGraphicsData GetGraphicsData() const;
     virtual SystemFontData     GetSysFontData( int nFallbacklevel ) const;
 
-    virtual bool               SwapBuffers() SAL_OVERRIDE;
+    virtual void               BeginPaint() SAL_OVERRIDE;
+    virtual void               EndPaint() SAL_OVERRIDE;
 
     /// Update settings based on the platform values
     static void updateSettingsNative( AllSettings& rSettings );
diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 9d49597..c4c2930 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -60,6 +60,7 @@
 
 OpenGLSalGraphicsImpl::OpenGLSalGraphicsImpl()
     : mpFrame(NULL)
+    , mnPainting(0)
     , mbOffscreen(false)
     , mnFramebufferId(0)
     , mpOffscreenTex(NULL)
@@ -104,7 +105,8 @@ void OpenGLSalGraphicsImpl::PostDraw()
 {
     if( mbOffscreen )
         glBindFramebuffer( GL_FRAMEBUFFER, 0 );
-
+    if( mnPainting == 0 )
+        glFlush();
     CHECK_GL_ERROR();
 }
 
@@ -1343,10 +1345,21 @@ bool OpenGLSalGraphicsImpl::drawGradient(const tools::PolyPolygon& rPolyPoly,
     return false;
 }
 
-bool OpenGLSalGraphicsImpl::swapBuffers()
+void OpenGLSalGraphicsImpl::beginPaint()
 {
-    maContext.swapBuffers();
-    return true;
+    mnPainting++;
+    SAL_INFO( "vcl.opengl", "BEGIN PAINT " << this );
+}
+
+void OpenGLSalGraphicsImpl::endPaint()
+{
+    mnPainting--;
+    SAL_INFO( "vcl.opengl", "END PAINT " << this );
+    if( mnPainting == 0 )
+    {
+        maContext.makeCurrent();
+        glFlush();
+    }
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/opengl/OpenGLHelper.cxx b/vcl/source/opengl/OpenGLHelper.cxx
index d9f445d..a6073c4 100644
--- a/vcl/source/opengl/OpenGLHelper.cxx
+++ b/vcl/source/opengl/OpenGLHelper.cxx
@@ -387,7 +387,6 @@ bool OpenGLHelper::GetVisualInfo(Display* pDisplay, int nScreen, XVisualInfo& rV
                       GLX_GREEN_SIZE, 8,
                       GLX_BLUE_SIZE, 8,
                       GLX_DEPTH_SIZE, 24,
-                      GLX_DOUBLEBUFFER,
                       None };
 
     pVI = glXChooseVisual( pDisplay, nScreen, aAttrib );
diff --git a/vcl/source/outdev/outdev.cxx b/vcl/source/outdev/outdev.cxx
index 2ce3762..8821ba6 100644
--- a/vcl/source/outdev/outdev.cxx
+++ b/vcl/source/outdev/outdev.cxx
@@ -897,11 +897,16 @@ bool OutputDevice::DrawEPS( const Point& rPoint, const Size& rSize,
     return bDrawn;
 }
 
-bool OutputDevice::SwapBuffers()
+void OutputDevice::BeginPaint()
 {
-    if( !mpGraphics && !AcquireGraphics() )
-        return false;
-    return mpGraphics->SwapBuffers();
+    if( mpGraphics || AcquireGraphics() )
+        mpGraphics->BeginPaint();
+}
+
+void OutputDevice::EndPaint()
+{
+    if( mpGraphics || AcquireGraphics() )
+        mpGraphics->EndPaint();
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/window/paint.cxx b/vcl/source/window/paint.cxx
index e5cc31a..061cf2d 100644
--- a/vcl/source/window/paint.cxx
+++ b/vcl/source/window/paint.cxx
@@ -120,8 +120,10 @@ void PaintHelper::DoPaint(const vcl::Region* pRegion)
     pWindowImpl->mnPaintFlags = 0;
     if ( !pWindowImpl->maInvalidateRegion.IsEmpty() )
     {
+        m_pWindow->BeginPaint();
         m_pWindow->PushPaintHelper(this);
         m_pWindow->Paint(m_aPaintRect);
+        m_pWindow->EndPaint();
     }
 }
 
@@ -277,9 +279,10 @@ void Window::ImplCallOverlapPaint()
     {
         // - RTL - notify ImplCallPaint to check for re-mirroring (CHECKRTL)
         //         because we were called from the Sal layer
-        ImplCallPaint( NULL, mpWindowImpl->mnPaintFlags /*| IMPL_PAINT_CHECKRTL */);
         OutputDevice *pOutDev = GetOutDev();
-        pOutDev->SwapBuffers();
+        pOutDev->BeginPaint();
+        ImplCallPaint( NULL, mpWindowImpl->mnPaintFlags /*| IMPL_PAINT_CHECKRTL */);
+        pOutDev->EndPaint();
     }
 }
 
diff --git a/vcl/unx/generic/gdi/gdiimpl.hxx b/vcl/unx/generic/gdi/gdiimpl.hxx
index 5b0062c..fed9bc6 100644
--- a/vcl/unx/generic/gdi/gdiimpl.hxx
+++ b/vcl/unx/generic/gdi/gdiimpl.hxx
@@ -267,7 +267,8 @@ public:
 
     virtual bool drawGradient(const tools::PolyPolygon& rPolygon, const Gradient& rGradient) SAL_OVERRIDE;
 
-    virtual bool swapBuffers() SAL_OVERRIDE { return false; }
+    virtual void beginPaint() SAL_OVERRIDE { }
+    virtual void endPaint() SAL_OVERRIDE { }
 
 public:
     // implementation of X11GraphicsImpl
diff --git a/vcl/unx/generic/gdi/salgdi.cxx b/vcl/unx/generic/gdi/salgdi.cxx
index 9609ec8..62e8989 100644
--- a/vcl/unx/generic/gdi/salgdi.cxx
+++ b/vcl/unx/generic/gdi/salgdi.cxx
@@ -471,9 +471,14 @@ bool X11SalGraphics::drawGradient(const tools::PolyPolygon& rPoly, const Gradien
     return mpImpl->drawGradient(rPoly, rGradient);
 }
 
-bool X11SalGraphics::SwapBuffers()
+void X11SalGraphics::BeginPaint()
 {
-    return mpImpl->swapBuffers();
+    return mpImpl->beginPaint();
+}
+
+void X11SalGraphics::EndPaint()
+{
+    return mpImpl->endPaint();
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/win/source/gdi/gdiimpl.hxx b/vcl/win/source/gdi/gdiimpl.hxx
index cfef58a..852764d 100644
--- a/vcl/win/source/gdi/gdiimpl.hxx
+++ b/vcl/win/source/gdi/gdiimpl.hxx
@@ -217,7 +217,8 @@ public:
     virtual bool drawGradient(const tools::PolyPolygon& rPolygon,
             const Gradient& rGradient) SAL_OVERRIDE;
 
-    virtual bool swapBuffers() SAL_OVERRIDE { return false; }
+    virtual void beginPaint() SAL_OVERRIDE { }
+    virtual void endPaint() SAL_OVERRIDE { }
 };
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/win/source/gdi/salgdi.cxx b/vcl/win/source/gdi/salgdi.cxx
index 4543489..fa85420 100644
--- a/vcl/win/source/gdi/salgdi.cxx
+++ b/vcl/win/source/gdi/salgdi.cxx
@@ -1027,9 +1027,14 @@ SystemGraphicsData WinSalGraphics::GetGraphicsData() const
     return aRes;
 }
 
-bool WinSalGraphics::SwapBuffers()
+void WinSalGraphics::BeginPaint()
 {
-    return mpImpl->swapBuffers();
+    return mpImpl->beginPaint();
+}
+
+void WinSalGraphics::BeginPaint()
+{
+    return mpImpl->endPaint();
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list