[Libreoffice-commits] core.git: 3 commits - vcl/inc vcl/opengl vcl/source vcl/workben

Michael Meeks michael.meeks at collabora.com
Tue Nov 18 13:41:01 PST 2014


 vcl/inc/opengl/salbmp.hxx          |    4 -
 vcl/opengl/gdiimpl.cxx             |    2 
 vcl/opengl/salbmp.cxx              |   21 ++++----
 vcl/opengl/scale.cxx               |    2 
 vcl/source/opengl/OpenGLHelper.cxx |   88 +++++++++++++++++--------------------
 vcl/workben/vcldemo.cxx            |   31 ++++---------
 6 files changed, 67 insertions(+), 81 deletions(-)

New commits:
commit 8f1b58b5ac8e945d3c62bc7d7cb1e4b12c4ae263
Author: Michael Meeks <michael.meeks at collabora.com>
Date:   Tue Nov 18 21:17:52 2014 +0000

    vcl: fix un-initialized log length & clean copy/paste bits.
    
    Change-Id: I39cd9ef32fafa2894ffde961d87adc6aac9d4a4f

diff --git a/vcl/source/opengl/OpenGLHelper.cxx b/vcl/source/opengl/OpenGLHelper.cxx
index 6e2fe2c..202ac2b 100644
--- a/vcl/source/opengl/OpenGLHelper.cxx
+++ b/vcl/source/opengl/OpenGLHelper.cxx
@@ -59,6 +59,39 @@ OString loadShader(const OUString& rFilename)
 
 }
 
+namespace {
+    int LogCompilerError(GLuint nId, const rtl::OUString &rDetail,
+                         const rtl::OUString &rName, bool bShaderNotProgram)
+    {
+        int InfoLogLength = 0;
+
+        CHECK_GL_ERROR();
+
+        if (bShaderNotProgram)
+            glGetShaderiv (nId, GL_INFO_LOG_LENGTH, &InfoLogLength);
+        else
+            glGetProgramiv(nId, GL_INFO_LOG_LENGTH, &InfoLogLength);
+
+        CHECK_GL_ERROR();
+
+        if ( InfoLogLength > 0 )
+        {
+            std::vector<char> ErrorMessage(InfoLogLength+1);
+            if (bShaderNotProgram)
+                glGetShaderInfoLog (nId, InfoLogLength, NULL, &ErrorMessage[0]);
+            else
+                glGetProgramInfoLog(nId, InfoLogLength, NULL, &ErrorMessage[0]);
+            CHECK_GL_ERROR();
+
+            ErrorMessage.push_back('\0');
+            SAL_WARN("vcl.opengl", rDetail << " shader " << nId << " compile for " << rName << " failed : " << &ErrorMessage[0]);
+        }
+        else
+            SAL_WARN("vcl.opengl", rDetail << " shader: " << rName << " compile " << nId << "failed without error log");
+        return 0;
+    }
+}
+
 GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,const OUString& rFragmentShaderName)
 {
     // Create the shaders
@@ -66,7 +99,6 @@ GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,const OUString
     GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
 
     GLint Result = GL_FALSE;
-    int InfoLogLength;
 
     // Compile Vertex Shader
     OString aVertexShaderSource = loadShader(rVertexShaderName);
@@ -76,21 +108,9 @@ GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,const OUString
 
     // Check Vertex Shader
     glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);
-    if ( !Result )
-    {
-        glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
-        if ( InfoLogLength > 0 )
-        {
-            std::vector<char> VertexShaderErrorMessage(InfoLogLength+1);
-            glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]);
-            VertexShaderErrorMessage.push_back('\0');
-            SAL_WARN("vcl.opengl", "vertex shader compile for " << rVertexShaderName << " failed : " << &VertexShaderErrorMessage[0]);
-        }
-        else
-            SAL_WARN("vcl.opengl", "vertex shader: " << rVertexShaderName << " compile failed without error log");
-
-        return 0;
-    }
+    if (!Result)
+        return LogCompilerError(VertexShaderID, "vertex",
+                                rVertexShaderName, true);
 
     // Compile Fragment Shader
     OString aFragmentShaderSource = loadShader(rFragmentShaderName);
@@ -100,22 +120,9 @@ GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,const OUString
 
     // Check Fragment Shader
     glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result);
-    if ( !Result )
-    {
-        glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
-        if ( InfoLogLength > 0 )
-        {
-            std::vector<char> FragmentShaderErrorMessage(InfoLogLength+1);
-            glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]);
-            FragmentShaderErrorMessage.push_back('\0');
-            SAL_WARN("vcl.opengl", "fragment shader compile for " << rFragmentShaderName << " failed : " << &FragmentShaderErrorMessage[0]);
-        }
-        else
-            SAL_WARN("vcl.opengl", "fragment shader compile failed without error log");
-
-
-        return 0;
-    }
+    if (!Result)
+        return LogCompilerError(FragmentShaderID, "fragment",
+                                rFragmentShaderName, true);
 
     // Link the program
     GLint ProgramID = glCreateProgram();
@@ -128,21 +135,8 @@ GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,const OUString
 
     // Check the program
     glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result);
-    if ( !Result )
-    {
-        glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength);
-        if ( InfoLogLength > 0 )
-        {
-            std::vector<char> ProgramErrorMessage(InfoLogLength+1);
-            glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]);
-            ProgramErrorMessage.push_back('\0');
-            SAL_WARN("vcl.opengl", "Shader Program failed : " << &ProgramErrorMessage[0]);
-        }
-        else
-            SAL_WARN("vcl.opengl", "shader program link failed without error log");
-
-        return 0;
-    }
+    if (!Result)
+        return LogCompilerError(ProgramID, "program", "<both>", false);
 
     CHECK_GL_ERROR();
     return ProgramID;
commit fa6a174b50747e6f6c83d0cd882ce0bd0886930b
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 d324397..805c693 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -1391,7 +1391,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 741bdd1..c9c19e4 100644
--- a/vcl/opengl/scale.cxx
+++ b/vcl/opengl/scale.cxx
@@ -312,7 +312,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 ) );
commit 721fb11053327a557fc81f3ced4bf8af52e73c64
Author: Michael Meeks <michael.meeks at collabora.com>
Date:   Tue Nov 18 16:47:36 2014 +0000

    vcldemo: render more small scaled page-border alikes
    
    Change-Id: I2605175e7ee66d3da5e41497baa4178074830e99

diff --git a/vcl/workben/vcldemo.cxx b/vcl/workben/vcldemo.cxx
index 1be5351..01ad9c9d 100644
--- a/vcl/workben/vcldemo.cxx
+++ b/vcl/workben/vcldemo.cxx
@@ -458,28 +458,19 @@ public:
             aBlockColor.Erase(COL_RED);
             BitmapEx aShadowStretch = BitmapEx(aBlockColor, aAlphaMask);
 
-#ifdef DEBUG
-            { // before - the pristine <n>x1 image
-                SvFileStream aStream("/tmp/myshadow.png", STREAM_WRITE);
-                vcl::PNGWriter aWriter(aShadowStretch);
-                aWriter.Write(aStream);
-            }
-#endif
+            Point aRenderPt(r.TopLeft());
+
+            long aSizes[] = { 200, 100, 200, 100, 50, 5, 2 };
+
             // and yes - we really do this in the page border rendering code ...
-            aShadowStretch.Scale(Size(aShadowStretch.GetSizePixel().Width(), 50),
-                                   BMP_SCALE_FAST);
-            aShadowStretch.Scale(Size(aShadowStretch.GetSizePixel().Width(), 800),
-                                   BMP_SCALE_FAST);
-#ifdef DEBUG
-            { // after the corrupted image full of fluff ...
-                SvFileStream aStream("/tmp/myshadow-50.png", STREAM_WRITE);
-                vcl::PNGWriter aWriter(aShadowStretch);
-                aWriter.Write(aStream);
+            for (size_t i = 0; i < SAL_N_ELEMENTS(aSizes); i++)
+            {
+                aShadowStretch.Scale(Size(aShadowStretch.GetSizePixel().Width(), aSizes[i]),
+                                     BMP_SCALE_FAST);
+
+                rDev.DrawBitmapEx(aRenderPt, aShadowStretch);
+                aRenderPt.Move(aShadowStretch.GetSizePixel().Width() + 4, 0);
             }
-#endif
-            Point aRenderPt(r.Center());
-            aRenderPt.Move(-nSlice-1, 0);
-            rDev.DrawBitmapEx(aRenderPt, aShadowStretch);
 
             AlphaMask aWholeMask(aPageShadowMask.GetBitmap());
             aBlockColor = Bitmap(aPageShadowMask.GetSizePixel(), 24);


More information about the Libreoffice-commits mailing list