From 036add8e9e7bafa4e1335481f70e46bf3f7c918d Mon Sep 17 00:00:00 2001 From: "Konstantin S. Matveyev" Date: Fri, 18 Aug 2017 10:20:26 +0300 Subject: [PATCH] glClear should not be called with zero-mask in osgUtil::RenderStage::drawImplementation --- src/osgUtil/RenderStage.cpp | 58 +++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/src/osgUtil/RenderStage.cpp b/src/osgUtil/RenderStage.cpp index 2b707e57d..e05af611a 100644 --- a/src/osgUtil/RenderStage.cpp +++ b/src/osgUtil/RenderStage.cpp @@ -1342,40 +1342,42 @@ void RenderStage::drawImplementation(osg::RenderInfo& renderInfo,RenderLeaf*& pr if (_colorMask.valid()) _colorMask->apply(state); else glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); - if (_clearMask & GL_COLOR_BUFFER_BIT) + if (_clearMask != 0) { - glClearColor( _clearColor[0], _clearColor[1], _clearColor[2], _clearColor[3]); - } + if (_clearMask & GL_COLOR_BUFFER_BIT) + { + glClearColor( _clearColor[0], _clearColor[1], _clearColor[2], _clearColor[3]); + } - if (_clearMask & GL_DEPTH_BUFFER_BIT) - { - #if !defined(OSG_GLES1_AVAILABLE) && !defined(OSG_GLES2_AVAILABLE) && !defined(OSG_GLES3_AVAILABLE) - glClearDepth( _clearDepth); - #else - glClearDepthf( _clearDepth); + if (_clearMask & GL_DEPTH_BUFFER_BIT) + { + #if !defined(OSG_GLES1_AVAILABLE) && !defined(OSG_GLES2_AVAILABLE) && !defined(OSG_GLES3_AVAILABLE) + glClearDepth( _clearDepth); + #else + glClearDepthf( _clearDepth); + #endif + + glDepthMask ( GL_TRUE ); + state.haveAppliedAttribute( osg::StateAttribute::DEPTH ); + } + + if (_clearMask & GL_STENCIL_BUFFER_BIT) + { + glClearStencil( _clearStencil); + glStencilMask ( ~0u ); + state.haveAppliedAttribute( osg::StateAttribute::STENCIL ); + } + + #if !defined(OSG_GLES1_AVAILABLE) && !defined(OSG_GLES2_AVAILABLE) && !defined(OSG_GLES3_AVAILABLE) && !defined(OSG_GL3_AVAILABLE) + if (_clearMask & GL_ACCUM_BUFFER_BIT) + { + glClearAccum( _clearAccum[0], _clearAccum[1], _clearAccum[2], _clearAccum[3]); + } #endif - glDepthMask ( GL_TRUE ); - state.haveAppliedAttribute( osg::StateAttribute::DEPTH ); + glClear( _clearMask ); } - if (_clearMask & GL_STENCIL_BUFFER_BIT) - { - glClearStencil( _clearStencil); - glStencilMask ( ~0u ); - state.haveAppliedAttribute( osg::StateAttribute::STENCIL ); - } - - #if !defined(OSG_GLES1_AVAILABLE) && !defined(OSG_GLES2_AVAILABLE) && !defined(OSG_GLES3_AVAILABLE) && !defined(OSG_GL3_AVAILABLE) - if (_clearMask & GL_ACCUM_BUFFER_BIT) - { - glClearAccum( _clearAccum[0], _clearAccum[1], _clearAccum[2], _clearAccum[3]); - } - #endif - - - glClear( _clearMask ); - #ifdef USE_SCISSOR_TEST glDisable( GL_SCISSOR_TEST ); #endif