[Libreoffice-commits] core.git: Branch 'feature/opengl-vcl2' - vcl/inc vcl/opengl

Michael Meeks michael.meeks at collabora.com
Tue Nov 18 12:27:52 PST 2014


 vcl/inc/opengl/salbmp.hxx |    4 ++--
 vcl/opengl/gdiimpl.cxx    |    2 +-
 vcl/opengl/salbmp.cxx     |   21 +++++++++++----------
 vcl/opengl/scale.cxx      |    2 +-
 4 files changed, 15 insertions(+), 14 deletions(-)

New commits:
commit 36afb0e9557f1a600cd0fba83076b0e6b61503b5
Author: Michael Meeks <michael.meeks at collabora.com>
Date:   Tue Nov 18 20:21:07 2014 +0000

    vcl: since we share Bitmaps across all GLContexts simplify lifecycle.
    
    ~X11SalVirtualDevice() was destroying X resources referred to by
    OpenGLSalBitmap's mpContext, which were subsequently accessed by
    Bitmap::AcquireReadAccess on the floating Bitmap. Better to use the
    default window's GLContext for all bitmap operations.
    
    Change-Id: I9009980e791cff1a1f36d626592d72c7a32efd39

diff --git a/vcl/inc/opengl/salbmp.hxx b/vcl/inc/opengl/salbmp.hxx
index c862672..972fee0 100644
--- a/vcl/inc/opengl/salbmp.hxx
+++ b/vcl/inc/opengl/salbmp.hxx
@@ -39,7 +39,6 @@ class   BitmapPalette;
 class VCL_PLUGIN_PUBLIC OpenGLSalBitmap : public SalBitmap
 {
 private:
-    OpenGLContext*                      mpContext;
     OpenGLTexture                       maTexture;
     bool                                mbDirtyTexture;
     BitmapPalette                       maPalette;
@@ -83,8 +82,9 @@ public:
 
 public:
 
-    bool            Create( OpenGLContext& rContext, const OpenGLTexture& rTex, long nX, long nY, long nWidth, long nHeight );
+    bool            Create( const OpenGLTexture& rTex, long nX, long nY, long nWidth, long nHeight );
     OpenGLTexture&  GetTexture() const;
+    OpenGLContext*  GetBitmapContext() const;
 
 private:
 
diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 5883e7c8..a255804 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -1459,7 +1459,7 @@ SalBitmap* OpenGLSalGraphicsImpl::getBitmap( long nX, long nY, long nWidth, long
     SAL_INFO( "vcl.opengl", "::getBitmap " << nX << "," << nY <<
               " " << nWidth << "x" << nHeight );
     PreDraw();
-    if( !pBitmap->Create( maContext, maOffscreenTex, nX, nY, nWidth, nHeight ) )
+    if( !pBitmap->Create( maOffscreenTex, nX, nY, nWidth, nHeight ) )
     {
         delete pBitmap;
         pBitmap = NULL;
diff --git a/vcl/opengl/salbmp.cxx b/vcl/opengl/salbmp.cxx
index c664d7e..155757a 100644
--- a/vcl/opengl/salbmp.cxx
+++ b/vcl/opengl/salbmp.cxx
@@ -35,8 +35,7 @@ static bool isValidBitCount( sal_uInt16 nBitCount )
 }
 
 OpenGLSalBitmap::OpenGLSalBitmap()
-: mpContext(NULL)
-, mbDirtyTexture(true)
+: mbDirtyTexture(true)
 , mnBits(0)
 , mnBytesPerRow(0)
 , mnWidth(0)
@@ -59,14 +58,13 @@ OpenGLSalBitmap::~OpenGLSalBitmap()
     SAL_INFO( "vcl.opengl", "~OpenGLSalBitmap" );
 }
 
-bool OpenGLSalBitmap::Create( OpenGLContext& rContext, const OpenGLTexture& rTex, long nX, long nY, long nWidth, long nHeight )
+bool OpenGLSalBitmap::Create( const OpenGLTexture& rTex, long nX, long nY, long nWidth, long nHeight )
 {
     static const BitmapPalette aEmptyPalette;
 
     Destroy();
     SAL_INFO( "vcl.opengl", "OpenGLSalBitmap::Create from FBO: [" << nX << ", " << nY << "] " << nWidth << "x" << nHeight );
 
-    mpContext = &rContext;
     mnWidth = nWidth;
     mnHeight = nHeight;
     mnBufWidth = 0;
@@ -131,7 +129,6 @@ bool OpenGLSalBitmap::Create( const SalBitmap& rSalBmp, sal_uInt16 nNewBitCount
         maPalette = rSourceBitmap.maPalette;
         // execute any pending operations on the source bitmap
         maTexture = rSourceBitmap.GetTexture();
-        mpContext = rSourceBitmap.mpContext;
         mbDirtyTexture = false;
         maUserBuffer = rSourceBitmap.maUserBuffer;
 
@@ -468,13 +465,17 @@ sal_uInt16 OpenGLSalBitmap::GetBitCount() const
     return mnBits;
 }
 
-void OpenGLSalBitmap::makeCurrent()
+OpenGLContext* OpenGLSalBitmap::GetBitmapContext() const
 {
-    if (!mpContext || !mpContext->isInitialized())
-        mpContext = ImplGetDefaultWindow()->GetGraphics()->GetOpenGLContext();
+    return ImplGetDefaultWindow()->GetGraphics()->GetOpenGLContext();
+}
 
-    assert(mpContext && "Couldn't get default OpenGL context provider");
-    mpContext->makeCurrent();
+void OpenGLSalBitmap::makeCurrent()
+{
+    // Always use the default window's context for bitmap
+    OpenGLContext* pContext = GetBitmapContext();
+    assert(pContext && "Couldn't get default OpenGL context provider");
+    pContext->makeCurrent();
 }
 
 BitmapBuffer* OpenGLSalBitmap::AcquireBuffer( bool /*bReadOnly*/ )
diff --git a/vcl/opengl/scale.cxx b/vcl/opengl/scale.cxx
index c4e32db..9c52cc2 100644
--- a/vcl/opengl/scale.cxx
+++ b/vcl/opengl/scale.cxx
@@ -314,7 +314,7 @@ bool OpenGLSalBitmap::Scale( const double& rScaleX, const double& rScaleY, sal_u
         nScaleFlag == BMP_SCALE_LANCZOS )
     {
         //TODO maUserBuffer.reset();
-        if( mpContext == NULL )
+        if( GetBitmapContext() == NULL )
         {
             SAL_INFO( "vcl.opengl", "Add ScaleOp to pending operations" );
             maPendingOps.push_back( new ScaleOp( this, rScaleX, rScaleY, nScaleFlag ) );


More information about the Libreoffice-commits mailing list