[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