X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Frender%2Fcommon%2Frender-manager.cpp;h=9261a6d651276fe0a643b5aa3ae7cfd8ac225bb7;hb=c17d02729a43a3f76fff1d56ea2c9bb01a23d99a;hp=f19c956a9d1f9b3e5c7d020025d3c4b5fc5625ef;hpb=e5ae770573de0421fdeb9b5509a82fdd14e92284;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/render/common/render-manager.cpp b/dali/internal/render/common/render-manager.cpp index f19c956..9261a6d 100644 --- a/dali/internal/render/common/render-manager.cpp +++ b/dali/internal/render/common/render-manager.cpp @@ -54,14 +54,16 @@ namespace SceneGraph struct RenderManager::Impl { Impl( Integration::GlAbstraction& glAbstraction, - Integration::GlSyncAbstraction& glSyncAbstraction ) + Integration::GlSyncAbstraction& glSyncAbstraction, + Integration::DepthBufferAvailable depthBufferAvailableParam, + Integration::StencilBufferAvailable stencilBufferAvailableParam ) : context( glAbstraction ), glSyncAbstraction( glSyncAbstraction ), renderQueue(), instructions(), renderAlgorithms(), backgroundColor( Dali::Stage::DEFAULT_BACKGROUND_COLOR ), - frameCount( 0 ), + frameCount( 0u ), renderBufferIndex( SceneGraphBuffers::INITIAL_UPDATE_BUFFER_INDEX ), defaultSurfaceRect(), rendererContainer(), @@ -69,7 +71,9 @@ struct RenderManager::Impl textureContainer(), frameBufferContainer(), lastFrameWasRendered( false ), - programController( glAbstraction ) + programController( glAbstraction ), + depthBufferAvailable( depthBufferAvailableParam ), + stencilBufferAvailable( stencilBufferAvailableParam ) { } @@ -127,14 +131,21 @@ struct RenderManager::Impl ProgramController programController; ///< Owner of the GL programs + Integration::DepthBufferAvailable depthBufferAvailable; ///< Whether the depth buffer is available + Integration::StencilBufferAvailable stencilBufferAvailable; ///< Whether the stencil buffer is available + }; RenderManager* RenderManager::New( Integration::GlAbstraction& glAbstraction, - Integration::GlSyncAbstraction& glSyncAbstraction ) + Integration::GlSyncAbstraction& glSyncAbstraction, + Integration::DepthBufferAvailable depthBufferAvailable, + Integration::StencilBufferAvailable stencilBufferAvailable ) { RenderManager* manager = new RenderManager; manager->mImpl = new Impl( glAbstraction, - glSyncAbstraction ); + glSyncAbstraction, + depthBufferAvailable, + stencilBufferAvailable ); return manager; } @@ -394,7 +405,7 @@ void RenderManager::Render( Integration::RenderStatus& status ) DALI_ASSERT_DEBUG( mImpl->context.IsGlContextCreated() ); // Increment the frame count at the beginning of each frame - ++(mImpl->frameCount); + ++mImpl->frameCount; // Process messages queued during previous update mImpl->renderQueue.ProcessMessages( mImpl->renderBufferIndex ); @@ -409,7 +420,7 @@ void RenderManager::Render( Integration::RenderStatus& status ) status.SetNeedsPostRender( true ); // switch rendering to adaptor provided (default) buffer - mImpl->context.BindFramebuffer( GL_FRAMEBUFFER, 0 ); + mImpl->context.BindFramebuffer( GL_FRAMEBUFFER, 0u ); mImpl->context.Viewport( mImpl->defaultSurfaceRect.x, mImpl->defaultSurfaceRect.y, @@ -421,17 +432,31 @@ void RenderManager::Render( Integration::RenderStatus& status ) mImpl->backgroundColor.b, mImpl->backgroundColor.a ); - mImpl->context.ClearStencil( 0 ); - - // Clear the entire color, depth and stencil buffers for the default framebuffer. - // It is important to clear all 3 buffers, for performance on deferred renderers like Mali + // Clear the entire color, depth and stencil buffers for the default framebuffer, if required. + // It is important to clear all 3 buffers when they are being used, for performance on deferred renderers // e.g. previously when the depth & stencil buffers were NOT cleared, it caused the DDK to exceed a "vertex count limit", // and then stall. That problem is only noticeable when rendering a large number of vertices per frame. + mImpl->context.SetScissorTest( false ); + + GLbitfield clearMask = GL_COLOR_BUFFER_BIT; + mImpl->context.ColorMask( true ); - mImpl->context.DepthMask( true ); - mImpl->context.StencilMask( 0xFF ); // 8 bit stencil mask, all 1's - mImpl->context.Clear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, Context::FORCE_CLEAR ); + + if( mImpl->depthBufferAvailable == Integration::DepthBufferAvailable::TRUE ) + { + mImpl->context.DepthMask( true ); + clearMask |= GL_DEPTH_BUFFER_BIT; + } + + if( mImpl->stencilBufferAvailable == Integration::StencilBufferAvailable::TRUE) + { + mImpl->context.ClearStencil( 0 ); + mImpl->context.StencilMask( 0xFF ); // 8 bit stencil mask, all 1's + clearMask |= GL_STENCIL_BUFFER_BIT; + } + + mImpl->context.Clear( clearMask, Context::FORCE_CLEAR ); // reset the program matrices for all programs once per frame // this ensures we will set view and projection matrix once per program per camera @@ -483,7 +508,7 @@ void RenderManager::DoRender( RenderInstruction& instruction ) clearColor = Dali::RenderTask::DEFAULT_CLEAR_COLOR; } - if( instruction.mFrameBuffer != 0 ) + if( !instruction.mIgnoreRenderToFbo && ( instruction.mFrameBuffer != 0 ) ) { instruction.mFrameBuffer->Bind( mImpl->context ); if ( instruction.mIsViewportSet ) @@ -532,7 +557,12 @@ void RenderManager::DoRender( RenderInstruction& instruction ) mImpl->context.SetScissorTest( false ); } - mImpl->renderAlgorithms.ProcessRenderInstruction( instruction, mImpl->context, mImpl->renderBufferIndex ); + mImpl->renderAlgorithms.ProcessRenderInstruction( + instruction, + mImpl->context, + mImpl->renderBufferIndex, + mImpl->depthBufferAvailable, + mImpl->stencilBufferAvailable ); if( instruction.mRenderTracker && ( instruction.mFrameBuffer != NULL ) ) {