include/vcl/opengl/OpenGLContext.hxx | 1 + vcl/inc/opengl/framebuffer.hxx | 1 + vcl/opengl/framebuffer.cxx | 9 +++++++-- vcl/opengl/texture.cxx | 10 ++++++++++ vcl/source/opengl/OpenGLContext.cxx | 20 ++++++++++++++++++++ vcl/source/opengl/OpenGLHelper.cxx | 1 + vcl/source/window/paint.cxx | 8 ++++++++ 7 files changed, 48 insertions(+), 2 deletions(-)
New commits: commit 18dd07ba4fd9ede98ce576e6024831658bbd5401 Author: Michael Meeks <michael.me...@collabora.com> Date: Mon Aug 31 12:11:50 2015 +0100 tdf#93751 - ensure textures are unbound from framebuffers post destroy. Change-Id: I81aec0e6f8db57905826c54c3442528be6068700 diff --git a/include/vcl/opengl/OpenGLContext.hxx b/include/vcl/opengl/OpenGLContext.hxx index 2f14762..96abe49 100644 --- a/include/vcl/opengl/OpenGLContext.hxx +++ b/include/vcl/opengl/OpenGLContext.hxx @@ -191,6 +191,7 @@ public: bool AcquireDefaultFramebuffer(); OpenGLFramebuffer* AcquireFramebuffer( const OpenGLTexture& rTexture ); static void ReleaseFramebuffer( OpenGLFramebuffer* pFramebuffer ); + void UnbindTextureFromFramebuffers( GLuint nTexture ); #ifdef DBG_UTIL void AddRef(SalGraphicsImpl*); void DeRef(SalGraphicsImpl*); diff --git a/vcl/inc/opengl/framebuffer.hxx b/vcl/inc/opengl/framebuffer.hxx index 385b11a..5d5e870 100644 --- a/vcl/inc/opengl/framebuffer.hxx +++ b/vcl/inc/opengl/framebuffer.hxx @@ -34,6 +34,7 @@ public: static void Unbind(); bool IsFree() const; + bool IsAttached( GLuint nTexture ) const; bool IsAttached( const OpenGLTexture& rTexture ) const; void AttachTexture( const OpenGLTexture& rTexture ); void DetachTexture(); diff --git a/vcl/opengl/framebuffer.cxx b/vcl/opengl/framebuffer.cxx index 87af985..7e19981 100644 --- a/vcl/opengl/framebuffer.cxx +++ b/vcl/opengl/framebuffer.cxx @@ -46,12 +46,17 @@ void OpenGLFramebuffer::Unbind() bool OpenGLFramebuffer::IsFree() const { - return (!mnAttachedTexture); + return !mnAttachedTexture; +} + +bool OpenGLFramebuffer::IsAttached( GLuint nTexture ) const +{ + return mnAttachedTexture == nTexture; } bool OpenGLFramebuffer::IsAttached( const OpenGLTexture& rTexture ) const { - return ( mnAttachedTexture == rTexture.Id() ); + return mnAttachedTexture == rTexture.Id(); } void OpenGLFramebuffer::AttachTexture( const OpenGLTexture& rTexture ) diff --git a/vcl/opengl/texture.cxx b/vcl/opengl/texture.cxx index 4e62915..217b8bf 100644 --- a/vcl/opengl/texture.cxx +++ b/vcl/opengl/texture.cxx @@ -108,7 +108,17 @@ ImplOpenGLTexture::~ImplOpenGLTexture() { VCL_GL_INFO( "vcl.opengl", "~OpenGLTexture " << mnTexture ); if( mnTexture != 0 ) + { + // FIXME: this is really not optimal performance-wise. + + // Check we have been correctly un-bound from all framebuffers. + ImplSVData* pSVData = ImplGetSVData(); + OpenGLContext* pContext = pSVData->maGDIData.mpLastContext; + if (pContext) + pContext->UnbindTextureFromFramebuffers( mnTexture ); + glDeleteTextures( 1, &mnTexture ); + } } bool ImplOpenGLTexture::InsertBuffer(int nX, int nY, int nWidth, int nHeight, int nFormat, int nType, sal_uInt8* pData) diff --git a/vcl/source/opengl/OpenGLContext.cxx b/vcl/source/opengl/OpenGLContext.cxx index 8253241..cb05356 100644 --- a/vcl/source/opengl/OpenGLContext.cxx +++ b/vcl/source/opengl/OpenGLContext.cxx @@ -1537,6 +1537,26 @@ OpenGLFramebuffer* OpenGLContext::AcquireFramebuffer( const OpenGLTexture& rText return pFramebuffer; } +// FIXME: this method is rather grim from a perf. perspective. +// We should instead (eventually) use pointers to associate the +// framebuffer and texture cleanly. +void OpenGLContext::UnbindTextureFromFramebuffers( GLuint nTexture ) +{ + OpenGLFramebuffer* pFramebuffer; + + // see if there is a framebuffer attached to that texture + pFramebuffer = mpLastFramebuffer; + while( pFramebuffer ) + { + if (pFramebuffer->IsAttached(nTexture)) + { + BindFramebuffer(pFramebuffer); + pFramebuffer->DetachTexture(); + } + pFramebuffer = pFramebuffer->mpPrevFramebuffer; + } +} + void OpenGLContext::ReleaseFramebuffer( OpenGLFramebuffer* pFramebuffer ) { if( pFramebuffer ) commit 6cf43cf6b98866401702d3275a7a026d8fa01edf Author: Michael Meeks <michael.me...@collabora.com> Date: Sat Aug 29 20:54:21 2015 +0100 Extended GL painting debug tracing. Change-Id: I52158729d240ca3cb9e7977bc6d1f5acb14437ad diff --git a/vcl/source/opengl/OpenGLHelper.cxx b/vcl/source/opengl/OpenGLHelper.cxx index 68b8d50..3eb8514 100644 --- a/vcl/source/opengl/OpenGLHelper.cxx +++ b/vcl/source/opengl/OpenGLHelper.cxx @@ -138,6 +138,7 @@ GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,const OUString { OpenGLZone aZone; + VCL_GL_INFO("vcl.opengl", "Load shader: vertex " << rVertexShaderName << " fragment " << rFragmentShaderName); // Create the shaders GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER); GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); diff --git a/vcl/source/window/paint.cxx b/vcl/source/window/paint.cxx index 2edcd09..8fc4c23 100644 --- a/vcl/source/window/paint.cxx +++ b/vcl/source/window/paint.cxx @@ -32,6 +32,7 @@ #include <salframe.hxx> #include <svdata.hxx> #include <comphelper/lok.hxx> +#include <vcl/opengl/OpenGLHelper.hxx> #define IMPL_PAINT_PAINT ((sal_uInt16)0x0001) #define IMPL_PAINT_PAINTALL ((sal_uInt16)0x0002) @@ -245,6 +246,7 @@ void PaintHelper::PaintBuffer() void PaintHelper::DoPaint(const vcl::Region* pRegion) { WindowImpl* pWindowImpl = m_pWindow->ImplGetWindowImpl(); + vcl::Region* pWinChildClipRegion = m_pWindow->ImplGetWinChildClipRegion(); ImplFrameData* pFrameData = m_pWindow->mpWindowImpl->mpFrameData; if (pWindowImpl->mnPaintFlags & IMPL_PAINT_PAINTALL || pFrameData->mbInBufferedPaint) @@ -271,6 +273,9 @@ void PaintHelper::DoPaint(const vcl::Region* pRegion) pWindowImpl->mnPaintFlags = 0; if (!pWindowImpl->maInvalidateRegion.IsEmpty()) { + VCL_GL_INFO("vcl.opengl", "PaintHelper::DoPaint on " << + typeid( *m_pWindow ).name() << " '" << m_pWindow->GetText() << "' begin"); + m_pWindow->BeginPaint(); // double-buffering: setup the buffer if it does not exist @@ -302,6 +307,9 @@ void PaintHelper::DoPaint(const vcl::Region* pRegion) } m_pWindow->EndPaint(); + + VCL_GL_INFO("vcl.opengl", "PaintHelper::DoPaint end on " << + typeid( *m_pWindow ).name() << " '" << m_pWindow->GetText() << "'"); } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits