[Libreoffice-commits] core.git: vcl/opengl vcl/source
Tor Lillqvist
tml at collabora.com
Mon Nov 16 23:38:06 PST 2015
vcl/opengl/framebuffer.cxx | 11 ++++--
vcl/opengl/gdiimpl.cxx | 60 ++++++++++++++++++++++-------------
vcl/opengl/program.cxx | 31 +++++++++++++++++-
vcl/opengl/texture.cxx | 61 +++++++++++++++++++++++++-----------
vcl/opengl/x11/gdiimpl.cxx | 4 +-
vcl/source/opengl/OpenGLContext.cxx | 2 -
6 files changed, 123 insertions(+), 46 deletions(-)
New commits:
commit da11e337441f747155fa75c19263df70bfe6c543
Author: Tor Lillqvist <tml at collabora.com>
Date: Tue Nov 17 09:20:25 2015 +0200
Check for OpenGL errors right where an error might be generated
CHECK_GL_ERROR() is now zero-cost in a production build, so no reason
to avoid it.
Don't check for OpenGL errors after glX or wgl calls. They don't
generate OpenGL errors but use the X and Win32 error mechanisms, as
far as I see.
Change-Id: I8f97ef434cbdc89d6e345a247456cfc4a1a82bb6
diff --git a/vcl/opengl/framebuffer.cxx b/vcl/opengl/framebuffer.cxx
index 0c2cca9..842c427 100644
--- a/vcl/opengl/framebuffer.cxx
+++ b/vcl/opengl/framebuffer.cxx
@@ -22,12 +22,14 @@ OpenGLFramebuffer::OpenGLFramebuffer() :
mpNextFramebuffer( nullptr )
{
glGenFramebuffers( 1, &mnId );
+ CHECK_GL_ERROR();
VCL_GL_INFO( "vcl.opengl", "Created framebuffer " << (int)mnId );
}
OpenGLFramebuffer::~OpenGLFramebuffer()
{
glDeleteFramebuffers( 1, &mnId );
+ CHECK_GL_ERROR();
}
void OpenGLFramebuffer::Bind()
@@ -40,8 +42,8 @@ void OpenGLFramebuffer::Bind()
void OpenGLFramebuffer::Unbind()
{
glBindFramebuffer( GL_FRAMEBUFFER, 0 );
- VCL_GL_INFO( "vcl.opengl", "Binding default framebuffer" );
CHECK_GL_ERROR();
+ VCL_GL_INFO( "vcl.opengl", "Binding default framebuffer" );
}
bool OpenGLFramebuffer::IsFree() const
@@ -69,18 +71,19 @@ void OpenGLFramebuffer::AttachTexture( const OpenGLTexture& rTexture )
mnWidth = rTexture.GetWidth();
mnHeight = rTexture.GetHeight();
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mnAttachedTexture, 0);
- if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
+ CHECK_GL_ERROR();
+ GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
+ CHECK_GL_ERROR();
+ if (status != GL_FRAMEBUFFER_COMPLETE)
{
SAL_WARN("vcl.opengl", "Framebuffer incomplete");
}
- CHECK_GL_ERROR();
}
void OpenGLFramebuffer::DetachTexture()
{
if( mnAttachedTexture != 0 )
{
- CHECK_GL_ERROR();
mnAttachedTexture = 0;
glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0 );
CHECK_GL_ERROR();
diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 51dbc5a..f954a01 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -177,6 +177,7 @@ void OpenGLSalGraphicsImpl::PreDraw()
CHECK_GL_ERROR();
glViewport( 0, 0, GetWidth(), GetHeight() );
+ CHECK_GL_ERROR();
ImplInitClipRegion();
CHECK_GL_ERROR();
@@ -187,9 +188,15 @@ void OpenGLSalGraphicsImpl::PostDraw()
if( !mbOffscreen && mpContext->mnPainting == 0 )
glFlush();
if( mbUseScissor )
+ {
glDisable( GL_SCISSOR_TEST );
- if( mbUseStencil )
+ CHECK_GL_ERROR();
+ }
+ if( mbUseStencil )
+ {
glDisable( GL_STENCIL_TEST );
+ CHECK_GL_ERROR();
+ }
if( mpProgram )
{
mpProgram->Clean();
@@ -198,8 +205,6 @@ void OpenGLSalGraphicsImpl::PostDraw()
mProgramIsSolidColor = false;
#endif
}
-
- CHECK_GL_ERROR();
OpenGLZone::leave();
}
@@ -222,12 +227,18 @@ void OpenGLSalGraphicsImpl::freeResources()
void OpenGLSalGraphicsImpl::ImplSetClipBit( const vcl::Region& rClip, GLuint nMask )
{
glEnable( GL_STENCIL_TEST );
+ CHECK_GL_ERROR();
glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
+ CHECK_GL_ERROR();
glStencilMask( nMask );
+ CHECK_GL_ERROR();
glStencilFunc( GL_NEVER, nMask, 0xFF );
+ CHECK_GL_ERROR();
glStencilOp( GL_REPLACE, GL_KEEP, GL_KEEP );
+ CHECK_GL_ERROR();
glClear( GL_STENCIL_BUFFER_BIT );
+ CHECK_GL_ERROR();
if( UseSolid( MAKE_SALCOLOR( 0xFF, 0xFF, 0xFF ) ) )
{
if( rClip.getRegionBand() )
@@ -237,9 +248,10 @@ void OpenGLSalGraphicsImpl::ImplSetClipBit( const vcl::Region& rClip, GLuint nMa
}
glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
+ CHECK_GL_ERROR();
glStencilMask( 0x00 );
+ CHECK_GL_ERROR();
glDisable( GL_STENCIL_TEST );
-
CHECK_GL_ERROR();
}
@@ -253,6 +265,7 @@ void OpenGLSalGraphicsImpl::ImplInitClipRegion()
{
Rectangle aRect( maClipRegion.GetBoundRect() );
glScissor( aRect.Left(), GetHeight() - aRect.Bottom() - 1, aRect.GetWidth() + 1, aRect.GetHeight() + 1 );
+ CHECK_GL_ERROR();
}
else if( !maClipRegion.IsEmpty() )
{
@@ -261,14 +274,17 @@ void OpenGLSalGraphicsImpl::ImplInitClipRegion()
}
if( mbUseScissor )
+ {
glEnable( GL_SCISSOR_TEST );
+ CHECK_GL_ERROR();
+ }
if( mbUseStencil )
{
glStencilFunc( GL_EQUAL, 1, 0x1 );
+ CHECK_GL_ERROR();
glEnable( GL_STENCIL_TEST );
+ CHECK_GL_ERROR();
}
-
- CHECK_GL_ERROR();
}
const vcl::Region& OpenGLSalGraphicsImpl::getClipRegion() const
@@ -477,7 +493,6 @@ void OpenGLSalGraphicsImpl::DrawPoint( long nX, long nY )
ApplyProgramMatrices(0.5f);
mpProgram->SetVertices( pPoint );
glDrawArrays( GL_POINTS, 0, 1 );
-
CHECK_GL_ERROR();
}
@@ -495,7 +510,6 @@ void OpenGLSalGraphicsImpl::DrawLine( double nX1, double nY1, double nX2, double
ApplyProgramMatrices(0.5f);
mpProgram->SetVertices( pPoints );
glDrawArrays( GL_LINES, 0, 2 );
-
CHECK_GL_ERROR();
}
@@ -517,8 +531,6 @@ void OpenGLSalGraphicsImpl::DrawLineAA( double nX1, double nY1, double nX2, doub
return;
}
ImplDrawLineAA( nX1, nY1, nX2, nY2 );
-
- CHECK_GL_ERROR();
}
void OpenGLSalGraphicsImpl::ImplDrawLineAA( double nX1, double nY1, double nX2, double nY2, bool edge )
@@ -655,7 +667,6 @@ void OpenGLSalGraphicsImpl::ImplDrawLineAA( double nX1, double nY1, double nX2,
mpProgram->SetTextureCoord( aTexCoord );
mpProgram->SetVertices( vertices );
glDrawArrays(GL_TRIANGLE_STRIP, 0, 8);
-
CHECK_GL_ERROR();
}
@@ -692,6 +703,7 @@ void OpenGLSalGraphicsImpl::DrawConvexPolygon( sal_uInt32 nPoints, const SalPoin
ApplyProgramMatrices();
mpProgram->SetVertices( &aVertices[0] );
glDrawArrays( GL_TRIANGLE_FAN, 0, nPoints );
+ CHECK_GL_ERROR();
if( !blockAA && mrParent.getAntiAliasB2DDraw())
{
@@ -715,8 +727,6 @@ void OpenGLSalGraphicsImpl::DrawConvexPolygon( sal_uInt32 nPoints, const SalPoin
UseSolid( lastSolidColor, lastSolidTransparency );
}
}
-
- CHECK_GL_ERROR();
}
void OpenGLSalGraphicsImpl::DrawConvexPolygon( const tools::Polygon& rPolygon, bool blockAA )
@@ -737,6 +747,7 @@ void OpenGLSalGraphicsImpl::DrawConvexPolygon( const tools::Polygon& rPolygon, b
ApplyProgramMatrices();
mpProgram->SetVertices( &aVertices[0] );
glDrawArrays( GL_TRIANGLE_FAN, 0, nPoints );
+ CHECK_GL_ERROR();
if( !blockAA && mrParent.getAntiAliasB2DDraw())
{
@@ -760,8 +771,6 @@ void OpenGLSalGraphicsImpl::DrawConvexPolygon( const tools::Polygon& rPolygon, b
UseSolid( lastSolidColor, lastSolidTransparency );
}
}
-
- CHECK_GL_ERROR();
}
void OpenGLSalGraphicsImpl::DrawTrapezoid( const basegfx::B2DTrapezoid& trapezoid, bool blockAA )
@@ -789,6 +798,7 @@ void OpenGLSalGraphicsImpl::DrawTrapezoid( const basegfx::B2DTrapezoid& trapezoi
ApplyProgramMatrices();
mpProgram->SetVertices( &aVertices[0] );
glDrawArrays( GL_TRIANGLE_FAN, 0, nPoints );
+ CHECK_GL_ERROR();
if( !blockAA && mrParent.getAntiAliasB2DDraw())
{
@@ -812,8 +822,6 @@ void OpenGLSalGraphicsImpl::DrawTrapezoid( const basegfx::B2DTrapezoid& trapezoi
UseSolid( lastSolidColor, lastSolidTransparency );
}
}
-
- CHECK_GL_ERROR();
}
void OpenGLSalGraphicsImpl::DrawRect( long nX, long nY, long nWidth, long nHeight )
@@ -904,7 +912,6 @@ void OpenGLSalGraphicsImpl::DrawRegionBand( const RegionBand& rRegion )
ApplyProgramMatrices();
mpProgram->SetVertices( &aVertices[0] );
glDrawArrays( GL_TRIANGLES, 0, aVertices.size() / 2 );
-
CHECK_GL_ERROR();
}
@@ -1026,9 +1033,8 @@ void OpenGLSalGraphicsImpl::DrawTransformedTexture(
mpProgram->SetTextureCoord( aTexCoord );
mpProgram->SetVertices( &aVertices[0] );
glDrawArrays( GL_TRIANGLE_FAN, 0, 4 );
- mpProgram->Clean();
-
CHECK_GL_ERROR();
+ mpProgram->Clean();
}
void OpenGLSalGraphicsImpl::DrawAlphaTexture( OpenGLTexture& rTexture, const SalTwoRect& rPosAry, bool bInverted, bool bPremultiplied )
@@ -1293,6 +1299,7 @@ void OpenGLSalGraphicsImpl::drawRect( long nX, long nY, long nWidth, long nHeigh
ApplyProgramMatrices(0.5f);
mpProgram->SetVertices(pPoints);
glDrawArrays(GL_LINE_LOOP, 0, 4);
+ CHECK_GL_ERROR();
}
PostDraw();
@@ -1614,9 +1621,9 @@ SalColor OpenGLSalGraphicsImpl::getPixel( long nX, long nY )
PreDraw();
nY = GetHeight() - nY - 1;
glReadPixels( nX, nY, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel);
+ CHECK_GL_ERROR();
PostDraw();
- CHECK_GL_ERROR();
return MAKE_SALCOLOR( pixel[0], pixel[1], pixel[2] );
}
@@ -1689,9 +1696,12 @@ bool OpenGLSalGraphicsImpl::blendBitmap(
VCL_GL_INFO( "vcl.opengl", "::blendBitmap" );
PreDraw();
glEnable( GL_BLEND );
+ CHECK_GL_ERROR();
glBlendFunc( GL_ZERO, GL_SRC_COLOR );
+ CHECK_GL_ERROR();
DrawTexture( rTexture, rPosAry );
glDisable( GL_BLEND );
+ CHECK_GL_ERROR();
PostDraw();
return true;
}
@@ -1820,12 +1830,16 @@ bool OpenGLSalGraphicsImpl::drawGradient(const tools::PolyPolygon& rPolyPoly,
if( mbUseStencil )
{
glEnable( GL_STENCIL_TEST );
+ CHECK_GL_ERROR();
glStencilFunc( GL_EQUAL, 3, 0xFF );
+ CHECK_GL_ERROR();
}
else
{
glEnable( GL_STENCIL_TEST );
+ CHECK_GL_ERROR();
glStencilFunc( GL_EQUAL, 2, 0xFF );
+ CHECK_GL_ERROR();
}
#endif
@@ -1854,11 +1868,13 @@ bool OpenGLSalGraphicsImpl::drawGradient(const tools::PolyPolygon& rPolyPoly,
#if FIXME_BROKEN_STENCIL_FOR_GRADIENTS
if( !mbUseStencil )
+ {
glDisable( GL_STENCIL_TEST );
+ CHECK_GL_ERROR();
+ }
#endif
PostDraw();
- CHECK_GL_ERROR();
return true;
}
diff --git a/vcl/opengl/program.cxx b/vcl/opengl/program.cxx
index 0919c1a..588700b 100644
--- a/vcl/opengl/program.cxx
+++ b/vcl/opengl/program.cxx
@@ -33,7 +33,10 @@ OpenGLProgram::~OpenGLProgram()
{
maUniformLocations.clear();
if( mnId != 0 )
+ {
glDeleteProgram( mnId );
+ CHECK_GL_ERROR();
+ }
}
bool OpenGLProgram::Load( const OUString& rVertexShader,
@@ -51,6 +54,7 @@ bool OpenGLProgram::Use()
return false;
glUseProgram( mnId );
+ CHECK_GL_ERROR();
return true;
}
@@ -64,6 +68,7 @@ bool OpenGLProgram::Clean()
while( it != maTextures.rend() )
{
glActiveTexture( GL_TEXTURE0 + nIndex-- );
+ CHECK_GL_ERROR();
it->Unbind();
++it;
}
@@ -76,7 +81,10 @@ bool OpenGLProgram::Clean()
for( int i = 0; i < 32; i++ )
{
if( mnEnabledAttribs & ( 1 << i ) )
+ {
glDisableVertexAttribArray( i );
+ CHECK_GL_ERROR();
+ }
}
mnEnabledAttribs = 0;
}
@@ -86,22 +94,27 @@ bool OpenGLProgram::Clean()
{
mbBlending = false;
glDisable( GL_BLEND );
+ CHECK_GL_ERROR();
}
- CHECK_GL_ERROR();
return true;
}
void OpenGLProgram::SetVertexAttrib( GLuint& rAttrib, const OString& rName, const GLvoid* pData )
{
if( rAttrib == SAL_MAX_UINT32 )
+ {
rAttrib = glGetAttribLocation( mnId, rName.getStr() );
+ CHECK_GL_ERROR();
+ }
if( (mnEnabledAttribs & ( 1 << rAttrib )) == 0 )
{
glEnableVertexAttribArray( rAttrib );
+ CHECK_GL_ERROR();
mnEnabledAttribs |= ( 1 << rAttrib );
}
glVertexAttribPointer( rAttrib, 2, GL_FLOAT, GL_FALSE, 0, pData );
+ CHECK_GL_ERROR();
}
void OpenGLProgram::SetVertices( const GLvoid* pData )
@@ -130,6 +143,7 @@ GLuint OpenGLProgram::GetUniformLocation( const OString& rName )
if( it == maUniformLocations.end() )
{
GLuint nLocation = glGetUniformLocation( mnId, rName.getStr() );
+ CHECK_GL_ERROR();
maUniformLocations[rName] = nLocation;
return nLocation;
}
@@ -141,30 +155,35 @@ void OpenGLProgram::SetUniform1f( const OString& rName, GLfloat v1 )
{
GLuint nUniform = GetUniformLocation( rName );
glUniform1f( nUniform, v1 );
+ CHECK_GL_ERROR();
}
void OpenGLProgram::SetUniform2f( const OString& rName, GLfloat v1, GLfloat v2 )
{
GLuint nUniform = GetUniformLocation( rName );
glUniform2f( nUniform, v1, v2 );
+ CHECK_GL_ERROR();
}
void OpenGLProgram::SetUniform1fv( const OString& rName, GLsizei nCount, GLfloat* aValues )
{
GLuint nUniform = GetUniformLocation( rName );
glUniform1fv( nUniform, nCount, aValues );
+ CHECK_GL_ERROR();
}
void OpenGLProgram::SetUniform2fv( const OString& rName, GLsizei nCount, GLfloat* aValues )
{
GLuint nUniform = GetUniformLocation( rName );
glUniform2fv( nUniform, nCount, aValues );
+ CHECK_GL_ERROR();
}
void OpenGLProgram::SetUniform1i( const OString& rName, GLint v1 )
{
GLuint nUniform = GetUniformLocation( rName );
glUniform1i( nUniform, v1 );
+ CHECK_GL_ERROR();
}
void OpenGLProgram::SetColor( const OString& rName, SalColor nColor, sal_uInt8 nTransparency )
@@ -175,6 +194,7 @@ void OpenGLProgram::SetColor( const OString& rName, SalColor nColor, sal_uInt8 n
((float) SALCOLOR_GREEN( nColor )) / 255,
((float) SALCOLOR_BLUE( nColor )) / 255,
(100 - nTransparency) * (1.0 / 100) );
+ CHECK_GL_ERROR();
if( nTransparency > 0 )
SetBlendMode( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
@@ -188,6 +208,7 @@ void OpenGLProgram::SetColorf( const OString& rName, SalColor nColor, double fTr
((float) SALCOLOR_GREEN( nColor )) / 255,
((float) SALCOLOR_BLUE( nColor )) / 255,
(1.0f - fTransparency) );
+ CHECK_GL_ERROR();
if( fTransparency > 0.0 )
SetBlendMode( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
@@ -201,6 +222,7 @@ void OpenGLProgram::SetColor( const OString& rName, const Color& rColor )
((float) rColor.GetGreen()) / 255,
((float) rColor.GetBlue()) / 255,
1.0f - ((float) rColor.GetTransparency()) / 255 );
+ CHECK_GL_ERROR();
if( rColor.GetTransparency() > 0 )
SetBlendMode( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
@@ -214,6 +236,7 @@ void OpenGLProgram::SetColorWithIntensity( const OString& rName, const Color& rC
((float) rColor.GetGreen()) * nFactor / 25500.0,
((float) rColor.GetBlue()) * nFactor / 25500.0,
1.0f );
+ CHECK_GL_ERROR();
}
void OpenGLProgram::SetTexture( const OString& rName, OpenGLTexture& rTexture )
@@ -222,7 +245,9 @@ void OpenGLProgram::SetTexture( const OString& rName, OpenGLTexture& rTexture )
int nIndex = maTextures.size();
glUniform1i( nUniform, nIndex );
+ CHECK_GL_ERROR();
glActiveTexture( GL_TEXTURE0 + nIndex );
+ CHECK_GL_ERROR();
rTexture.Bind();
maTextures.push_back( rTexture );
}
@@ -249,6 +274,7 @@ void OpenGLProgram::SetTransform(
(float) rNull.getX(), (float) rNull.getY(), 0, 1 };
glm::mat4 mMatrix = glm::make_mat4( aValues );
glUniformMatrix4fv( nUniform, 1, GL_FALSE, glm::value_ptr( mMatrix ) );
+ CHECK_GL_ERROR();
}
void OpenGLProgram::ApplyMatrix(float fWidth, float fHeight, float fPixelOffset)
@@ -270,12 +296,15 @@ void OpenGLProgram::ApplyMatrix(float fWidth, float fHeight, float fPixelOffset)
mMVP = glm::translate(mMVP, glm::vec3(fPixelOffset, fPixelOffset, 0.0f));
glUniformMatrix4fv(nUniform, 1, GL_FALSE, glm::value_ptr(mMVP));
+ CHECK_GL_ERROR();
}
void OpenGLProgram::SetBlendMode( GLenum nSFactor, GLenum nDFactor )
{
glEnable( GL_BLEND );
+ CHECK_GL_ERROR();
glBlendFunc( nSFactor, nDFactor );
+ CHECK_GL_ERROR();
mbBlending = true;
}
diff --git a/vcl/opengl/texture.cxx b/vcl/opengl/texture.cxx
index 9095326..35984b9 100644
--- a/vcl/opengl/texture.cxx
+++ b/vcl/opengl/texture.cxx
@@ -38,18 +38,26 @@ ImplOpenGLTexture::ImplOpenGLTexture( int nWidth, int nHeight, bool bAllocate )
mnFreeSlots(-1)
{
glGenTextures( 1, &mnTexture );
+ CHECK_GL_ERROR();
glBindTexture( GL_TEXTURE_2D, mnTexture );
+ CHECK_GL_ERROR();
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+ CHECK_GL_ERROR();
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
+ CHECK_GL_ERROR();
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
+ CHECK_GL_ERROR();
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
+ CHECK_GL_ERROR();
if( bAllocate )
+ {
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, nWidth, nHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr );
+ CHECK_GL_ERROR();
+ }
glBindTexture( GL_TEXTURE_2D, 0 );
+ CHECK_GL_ERROR();
VCL_GL_INFO( "vcl.opengl", "OpenGLTexture " << mnTexture << " " << nWidth << "x" << nHeight << " allocate" );
-
- CHECK_GL_ERROR();
}
// texture with content retrieved from FBO
@@ -65,18 +73,23 @@ ImplOpenGLTexture::ImplOpenGLTexture( int nX, int nY, int nWidth, int nHeight )
// nY = GetHeight() - nHeight - nY;
glGenTextures( 1, &mnTexture );
+ CHECK_GL_ERROR();
glBindTexture( GL_TEXTURE_2D, mnTexture );
+ CHECK_GL_ERROR();
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+ CHECK_GL_ERROR();
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
+ CHECK_GL_ERROR();
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
+ CHECK_GL_ERROR();
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
+ CHECK_GL_ERROR();
glCopyTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, nX, nY, nWidth, nHeight, 0 );
CHECK_GL_ERROR();
glBindTexture( GL_TEXTURE_2D, 0 );
+ CHECK_GL_ERROR();
VCL_GL_INFO( "vcl.opengl", "OpenGLTexture " << mnTexture << " " << nWidth << "x" << nHeight << " from x" << nX << ", y" << nY );
-
- CHECK_GL_ERROR();
}
// texture from buffer data
@@ -89,19 +102,28 @@ ImplOpenGLTexture::ImplOpenGLTexture( int nWidth, int nHeight, int nFormat, int
mnFreeSlots(-1)
{
if( !mnTexture )
+ {
glGenTextures( 1, &mnTexture );
+ CHECK_GL_ERROR();
+ }
glBindTexture( GL_TEXTURE_2D, mnTexture );
+ CHECK_GL_ERROR();
glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
+ CHECK_GL_ERROR();
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+ CHECK_GL_ERROR();
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
+ CHECK_GL_ERROR();
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
+ CHECK_GL_ERROR();
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
+ CHECK_GL_ERROR();
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, mnWidth, mnHeight, 0, nFormat, nType, pData );
+ CHECK_GL_ERROR();
glBindTexture( GL_TEXTURE_2D, 0 );
+ CHECK_GL_ERROR();
VCL_GL_INFO( "vcl.opengl", "OpenGLTexture " << mnTexture << " " << nWidth << "x" << nHeight << " from data" );
-
- CHECK_GL_ERROR();
}
ImplOpenGLTexture::~ImplOpenGLTexture()
@@ -126,13 +148,16 @@ bool ImplOpenGLTexture::InsertBuffer(int nX, int nY, int nWidth, int nHeight, in
if (!pData || mnTexture == 0)
return false;
glBindTexture(GL_TEXTURE_2D, mnTexture);
+ CHECK_GL_ERROR();
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ CHECK_GL_ERROR();
glTexSubImage2D(GL_TEXTURE_2D, 0, nX, mnHeight - nY - nHeight, nWidth, nHeight, nFormat, nType, pData);
+ CHECK_GL_ERROR();
glBindTexture(GL_TEXTURE_2D, 0);
+ CHECK_GL_ERROR();
VCL_GL_INFO( "vcl.opengl", "OpenGLTexture " << mnTexture << " Insert buff. to " << nX << " " << nY
<< " size " << nWidth << "x" << nHeight << " from data" );
- CHECK_GL_ERROR();
return true;
}
@@ -311,26 +336,28 @@ void OpenGLTexture::SetFilter( GLenum nFilter )
{
mpImpl->mnFilter = nFilter;
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nFilter );
+ CHECK_GL_ERROR();
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nFilter );
+ CHECK_GL_ERROR();
}
-
- CHECK_GL_ERROR();
}
void OpenGLTexture::Bind()
{
if( mpImpl )
+ {
glBindTexture( GL_TEXTURE_2D, mpImpl->mnTexture );
-
- CHECK_GL_ERROR();
+ CHECK_GL_ERROR();
+ }
}
void OpenGLTexture::Unbind()
{
if( mpImpl )
+ {
glBindTexture( GL_TEXTURE_2D, 0 );
-
- CHECK_GL_ERROR();
+ CHECK_GL_ERROR();
+ }
}
void OpenGLTexture::SaveToFile(const OUString& rFileName)
@@ -349,8 +376,6 @@ void OpenGLTexture::SaveToFile(const OUString& rFileName)
{
SAL_WARN("vcl.opengl", "Error writing png to " << rFileName);
}
-
- CHECK_GL_ERROR();
}
void OpenGLTexture::Read( GLenum nFormat, GLenum nType, sal_uInt8* pData )
@@ -367,8 +392,10 @@ void OpenGLTexture::Read( GLenum nFormat, GLenum nType, sal_uInt8* pData )
{
Bind();
glPixelStorei( GL_PACK_ALIGNMENT, 1 );
+ CHECK_GL_ERROR();
// XXX: Call not available with GLES 2.0
glGetTexImage( GL_TEXTURE_2D, 0, nFormat, nType, pData );
+ CHECK_GL_ERROR();
Unbind();
}
else
@@ -383,11 +410,11 @@ void OpenGLTexture::Read( GLenum nFormat, GLenum nType, sal_uInt8* pData )
rtl::Reference<OpenGLContext> pContext = pSVData->maGDIData.mpLastContext;
OpenGLFramebuffer* pFramebuffer = pContext->AcquireFramebuffer(*this);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
+ CHECK_GL_ERROR();
glReadPixels(nX, nY, nWidth, nHeight, nFormat, nType, pData);
+ CHECK_GL_ERROR();
OpenGLContext::ReleaseFramebuffer(pFramebuffer);
}
-
- CHECK_GL_ERROR();
}
OpenGLTexture::operator bool() const
diff --git a/vcl/opengl/x11/gdiimpl.cxx b/vcl/opengl/x11/gdiimpl.cxx
index 20c45ff..2418bc6 100644
--- a/vcl/opengl/x11/gdiimpl.cxx
+++ b/vcl/opengl/x11/gdiimpl.cxx
@@ -96,8 +96,10 @@ bool X11OpenGLSalGraphicsImpl::FillPixmapFromScreen( X11Pixmap* pPixmap, int nX,
// TODO: lfrb: What if offscreen?
pData = static_cast<char*>(malloc( pPixmap->GetWidth() * pPixmap->GetHeight() * 4 ));
glPixelStorei( GL_PACK_ALIGNMENT, 1 );
+ CHECK_GL_ERROR();
glReadPixels( nX, GetHeight() - nY, pPixmap->GetWidth(), pPixmap->GetHeight(),
GL_RGBA, GL_UNSIGNED_BYTE, pData );
+ CHECK_GL_ERROR();
pImage = XCreateImage( pDisplay, aVisualInfo.visual, 24, ZPixmap, 0, pData,
pPixmap->GetWidth(), pPixmap->GetHeight(), 8, 0 );
@@ -108,7 +110,6 @@ bool X11OpenGLSalGraphicsImpl::FillPixmapFromScreen( X11Pixmap* pPixmap, int nX,
XFreeGC( pDisplay, aGC );
XDestroyImage( pImage );
- CHECK_GL_ERROR();
return true;
}
@@ -154,6 +155,7 @@ bool X11OpenGLSalGraphicsImpl::RenderPixmap(X11Pixmap* pPixmap, X11Pixmap* pMask
rCombo.mpTexture.reset(new OpenGLTexture(pPixmap->GetWidth(), pPixmap->GetHeight(), false));
glActiveTexture( GL_TEXTURE0 );
+ CHECK_GL_ERROR();
rCombo.mpTexture->Bind();
glXBindTexImageEXT( pDisplay, pGlxPixmap, GLX_FRONT_LEFT_EXT, nullptr );
rCombo.mpTexture->Unbind();
diff --git a/vcl/source/opengl/OpenGLContext.cxx b/vcl/source/opengl/OpenGLContext.cxx
index 6670489..0c58120 100644
--- a/vcl/source/opengl/OpenGLContext.cxx
+++ b/vcl/source/opengl/OpenGLContext.cxx
@@ -197,7 +197,6 @@ int InitTempWindow(HWND *hwnd, int width, int height, const PIXELFORMATDESCRIPTO
return -1;
}
- CHECK_GL_ERROR();
return 0;
}
@@ -1612,6 +1611,7 @@ OpenGLFramebuffer* OpenGLContext::AcquireFramebuffer( const OpenGLTexture& rText
BindFramebuffer( pFramebuffer );
pFramebuffer->AttachTexture( rTexture );
glViewport( 0, 0, rTexture.GetWidth(), rTexture.GetHeight() );
+ CHECK_GL_ERROR();
return pFramebuffer;
}
More information about the Libreoffice-commits
mailing list