vcl/inc/opengl/RenderState.hxx | 35 +++++++++++++++++++++++++++++++++++ vcl/opengl/gdiimpl.cxx | 33 ++++++++++++++------------------- vcl/opengl/salbmp.cxx | 4 ++++ vcl/opengl/scale.cxx | 1 + 4 files changed, 54 insertions(+), 19 deletions(-)
New commits: commit b8f0e6452cc019744c44997c92831d94086b35b7 Author: Tomaž Vajngerl <[email protected]> Date: Thu Apr 28 20:01:28 2016 +0900 opengl: track the state of stencil test Change-Id: Id3e15e91316df740f04a42ed8c95b77d83240b5a Reviewed-on: https://gerrit.libreoffice.org/24505 Reviewed-by: Tomaž Vajngerl <[email protected]> Tested-by: Tomaž Vajngerl <[email protected]> diff --git a/vcl/inc/opengl/RenderState.hxx b/vcl/inc/opengl/RenderState.hxx index 7b3db7be..b1b0b18 100644 --- a/vcl/inc/opengl/RenderState.hxx +++ b/vcl/inc/opengl/RenderState.hxx @@ -69,10 +69,44 @@ public: } }; +class StencilState +{ + bool mbTest; +public: + + StencilState() + : mbTest(false) + { + glDisable(GL_STENCIL_TEST); + CHECK_GL_ERROR(); + } + + void enable() + { + if (!mbTest) + { + glEnable(GL_STENCIL_TEST); + CHECK_GL_ERROR(); + mbTest = true; + } + } + + void disable() + { + if (mbTest) + { + glDisable(GL_STENCIL_TEST); + CHECK_GL_ERROR(); + mbTest = false; + } + } +}; + class RenderState { TextureState maTexture; ScissorState maScissor; + StencilState maStencil; public: RenderState() @@ -80,6 +114,7 @@ public: TextureState& texture() { return maTexture; } ScissorState& scissor() { return maScissor; } + StencilState& stencil() { return maStencil; } }; #endif // INCLUDED_VCL_INC_OPENGL_RENDER_STATE_H diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx index ca5f439..70b2d65 100644 --- a/vcl/opengl/gdiimpl.cxx +++ b/vcl/opengl/gdiimpl.cxx @@ -234,11 +234,6 @@ void OpenGLSalGraphicsImpl::PostDraw() CHECK_GL_ERROR(); } - if( mbUseStencil ) - { - glDisable( GL_STENCIL_TEST ); - CHECK_GL_ERROR(); - } if( mpProgram ) { mpProgram->Clean(); @@ -271,6 +266,7 @@ void OpenGLSalGraphicsImpl::freeResources() mpContext->makeCurrent(); FlushDeferredDrawing(); mpContext->state()->scissor().disable(); + mpContext->state()->stencil().disable(); mpContext->ReleaseFramebuffer( maOffscreenTex ); } ReleaseContext(); @@ -278,7 +274,7 @@ void OpenGLSalGraphicsImpl::freeResources() void OpenGLSalGraphicsImpl::ImplSetClipBit( const vcl::Region& rClip, GLuint nMask ) { - glEnable( GL_STENCIL_TEST ); + mpContext->state()->stencil().enable(); VCL_GL_INFO( "Adding complex clip / stencil" ); GLuint nStencil = maOffscreenTex.StencilId(); @@ -317,8 +313,8 @@ void OpenGLSalGraphicsImpl::ImplSetClipBit( const vcl::Region& rClip, GLuint nMa CHECK_GL_ERROR(); glStencilMask( 0x00 ); CHECK_GL_ERROR(); - glDisable( GL_STENCIL_TEST ); - CHECK_GL_ERROR(); + + mpContext->state()->stencil().disable(); } void OpenGLSalGraphicsImpl::ImplInitClipRegion() @@ -348,8 +344,11 @@ void OpenGLSalGraphicsImpl::ImplInitClipRegion() { glStencilFunc( GL_EQUAL, 1, 0x1 ); CHECK_GL_ERROR(); - glEnable( GL_STENCIL_TEST ); - CHECK_GL_ERROR(); + mpContext->state()->stencil().enable(); + } + else + { + mpContext->state()->stencil().disable(); } } @@ -1501,11 +1500,7 @@ void OpenGLSalGraphicsImpl::DrawTransformedTexture( // so if we do not disable the scissor test, the texture produced // by the first downscaling is clipped to the current window size. mpContext->state()->scissor().disable(); - CHECK_GL_ERROR(); - - // Maybe it can give problems too. - glDisable(GL_STENCIL_TEST); - CHECK_GL_ERROR(); + mpContext->state()->stencil().disable(); // the square root of the whole inverted scale ratio double ixscalesqrt = std::floor(std::sqrt(ixscale)); @@ -1529,10 +1524,7 @@ void OpenGLSalGraphicsImpl::DrawTransformedTexture( mpContext->state()->scissor().enable(); if (mbUseStencil) - { - glEnable(GL_STENCIL_TEST); - CHECK_GL_ERROR(); - } + mpContext->state()->stencil().enable(); } } @@ -2507,6 +2499,7 @@ void OpenGLSalGraphicsImpl::flush() FlushDeferredDrawing(); mpContext->state()->scissor().disable(); + mpContext->state()->stencil().disable(); if( IsOffscreen() ) return; @@ -2525,6 +2518,7 @@ void OpenGLSalGraphicsImpl::doFlush() FlushDeferredDrawing(); mpContext->state()->scissor().disable(); + mpContext->state()->stencil().disable(); if( IsOffscreen() ) return; @@ -2570,6 +2564,7 @@ void OpenGLSalGraphicsImpl::doFlush() CHECK_GL_ERROR(); mpWindowContext->state()->scissor().disable(); + mpWindowContext->state()->stencil().disable(); #if OSL_DEBUG_LEVEL > 0 // random background glClear glClearColor((float)rand()/RAND_MAX, (float)rand()/RAND_MAX, diff --git a/vcl/opengl/salbmp.cxx b/vcl/opengl/salbmp.cxx index 1cc17d1..b9b7a5f 100644 --- a/vcl/opengl/salbmp.cxx +++ b/vcl/opengl/salbmp.cxx @@ -541,6 +541,7 @@ bool OpenGLSalBitmap::ReadTexture() rtl::Reference<OpenGLContext> xContext = OpenGLContext::getVCLContext(); xContext->state()->scissor().disable(); + xContext->state()->stencil().disable(); if (mnBits == 8 || mnBits == 16 || mnBits == 24 || mnBits == 32) { @@ -624,6 +625,7 @@ bool OpenGLSalBitmap::calcChecksumGL(OpenGLTexture& rInputTexture, ChecksumType& rtl::Reference< OpenGLContext > xContext = OpenGLContext::getVCLContext(); xContext->state()->scissor().disable(); + xContext->state()->stencil().disable(); static vcl::DeleteOnDeinit<OpenGLTexture> gCRCTableTexture( new OpenGLTexture(512, 1, GL_RGBA, GL_UNSIGNED_BYTE, @@ -893,6 +895,7 @@ bool OpenGLSalBitmap::Replace( const Color& rSearchColor, const Color& rReplaceC OpenGLZone aZone; rtl::Reference<OpenGLContext> xContext = OpenGLContext::getVCLContext(); xContext->state()->scissor().disable(); + xContext->state()->stencil().disable(); OpenGLFramebuffer* pFramebuffer; OpenGLProgram* pProgram; @@ -932,6 +935,7 @@ bool OpenGLSalBitmap::ConvertToGreyscale() OpenGLZone aZone; rtl::Reference<OpenGLContext> xContext = OpenGLContext::getVCLContext(); xContext->state()->scissor().disable(); + xContext->state()->stencil().disable(); OpenGLFramebuffer* pFramebuffer; OpenGLProgram* pProgram; diff --git a/vcl/opengl/scale.cxx b/vcl/opengl/scale.cxx index 61ecf31..9feb933 100644 --- a/vcl/opengl/scale.cxx +++ b/vcl/opengl/scale.cxx @@ -329,6 +329,7 @@ bool OpenGLSalBitmap::ImplScale( const double& rScaleX, const double& rScaleY, B OpenGLVCLContextZone aContextZone; rtl::Reference<OpenGLContext> xContext = OpenGLContext::getVCLContext(); xContext->state()->scissor().disable(); + xContext->state()->stencil().disable(); if (rScaleX <= 1 && rScaleY <= 1) {
_______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
