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.me...@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.me...@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.me...@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); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits