X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Frender%2Fcommon%2Frender-manager.cpp;h=910cb054815d6f03c67d0aef2806df3e29ec2e68;hb=0a68c62785eaa442cfa213157431d6f2c9b37033;hp=431bd0ac4fbcb3f0b7b7aeda286728d3cfa1dfd4;hpb=d782b799bd76959c4b1a5078c7401a2bbe62e2c4;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 431bd0a..910cb05 100644 --- a/dali/internal/render/common/render-manager.cpp +++ b/dali/internal/render/common/render-manager.cpp @@ -80,7 +80,6 @@ struct RenderManager::Impl renderQueue(), instructions(), renderAlgorithms(), - backgroundColor( Dali::Stage::DEFAULT_BACKGROUND_COLOR ), frameCount( 0u ), renderBufferIndex( SceneGraphBuffers::INITIAL_UPDATE_BUFFER_INDEX ), defaultSurfaceRect(), @@ -149,8 +148,6 @@ struct RenderManager::Impl RenderInstructionContainer instructions; Render::RenderAlgorithms renderAlgorithms; ///< The RenderAlgorithms object is used to action the renders required by a RenderInstruction - Vector4 backgroundColor; ///< The glClear color used at the beginning of each frame. - uint32_t frameCount; ///< The current frame count BufferIndex renderBufferIndex; ///< The index of the buffer to read from; this is opposite of the "update" buffer @@ -252,11 +249,6 @@ RenderInstructionContainer& RenderManager::GetRenderInstructionContainer() return mImpl->instructions; } -void RenderManager::SetBackgroundColor( const Vector4& color ) -{ - mImpl->backgroundColor = color; -} - void RenderManager::SetDefaultSurfaceRect(const Rect& rect) { mImpl->defaultSurfaceRect = rect; @@ -614,7 +606,6 @@ void RenderManager::DoRender( RenderInstruction& instruction ) Rect surfaceRect = mImpl->defaultSurfaceRect; int surfaceOrientation = mImpl->defaultSurfaceOrientation; - Vector4 backgroundColor = mImpl->backgroundColor; Integration::DepthBufferAvailable depthBufferAvailable = mImpl->depthBufferAvailable; Integration::StencilBufferAvailable stencilBufferAvailable = mImpl->stencilBufferAvailable; @@ -646,7 +637,6 @@ void RenderManager::DoRender( RenderInstruction& instruction ) } surfaceRect = Rect( 0, 0, static_cast( surfaceFrameBuffer->GetWidth() ), static_cast( surfaceFrameBuffer->GetHeight() ) ); - backgroundColor = surfaceFrameBuffer->GetBackgroundColor(); } else { @@ -674,7 +664,10 @@ void RenderManager::DoRender( RenderInstruction& instruction ) { // For each offscreen buffer, update the dependency list with the new texture id used by this frame buffer. Render::TextureFrameBuffer* textureFrameBuffer = static_cast( instruction.mFrameBuffer ); - mImpl->textureDependencyList.PushBack( textureFrameBuffer->GetTextureId() ); + for (unsigned int i0 = 0, i1 = textureFrameBuffer->GetColorAttachmentCount(); i0 < i1; ++i0) + { + mImpl->textureDependencyList.PushBack( textureFrameBuffer->GetTextureId(i0) ); + } } } else @@ -688,20 +681,12 @@ void RenderManager::DoRender( RenderInstruction& instruction ) surfaceRect.y, surfaceRect.width, surfaceRect.height ); - - mImpl->currentContext->ClearColor( backgroundColor.r, - backgroundColor.g, - backgroundColor.b, - backgroundColor.a ); } // 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->currentContext->SetScissorTest( false ); - GLbitfield clearMask = GL_COLOR_BUFFER_BIT; mImpl->currentContext->ColorMask( true ); @@ -719,8 +704,6 @@ void RenderManager::DoRender( RenderInstruction& instruction ) clearMask |= GL_STENCIL_BUFFER_BIT; } - mImpl->currentContext->Clear( clearMask, Context::FORCE_CLEAR ); - if( !instruction.mIgnoreRenderToFbo && ( instruction.mFrameBuffer != 0 ) ) { if ( instruction.mFrameBuffer->IsSurfaceBacked() ) // Surface rendering @@ -774,6 +757,17 @@ void RenderManager::DoRender( RenderInstruction& instruction ) } } + bool clearFullFrameRect = true; + if( instruction.mFrameBuffer != 0 ) + { + Viewport frameRect( 0, 0, instruction.mFrameBuffer->GetWidth(), instruction.mFrameBuffer->GetHeight() ); + clearFullFrameRect = ( frameRect == viewportRect ); + } + else + { + clearFullFrameRect = ( surfaceRect == viewportRect ); + } + if ( surfaceOrientation == 90 || surfaceOrientation == 270 ) { int temp = viewportRect.width; @@ -783,19 +777,25 @@ void RenderManager::DoRender( RenderInstruction& instruction ) mImpl->currentContext->Viewport(viewportRect.x, viewportRect.y, viewportRect.width, viewportRect.height); - if ( instruction.mIsClearColorSet ) + if( instruction.mIsClearColorSet ) { mImpl->currentContext->ClearColor( clearColor.r, clearColor.g, clearColor.b, clearColor.a ); - // Clear the viewport area only - mImpl->currentContext->SetScissorTest( true ); - mImpl->currentContext->Scissor( viewportRect.x, viewportRect.y, viewportRect.width, viewportRect.height ); - mImpl->currentContext->ColorMask( true ); - mImpl->currentContext->Clear( GL_COLOR_BUFFER_BIT , Context::CHECK_CACHED_VALUES ); - mImpl->currentContext->SetScissorTest( false ); + if( !clearFullFrameRect ) + { + mImpl->currentContext->SetScissorTest( true ); + mImpl->currentContext->Scissor( viewportRect.x, viewportRect.y, viewportRect.width, viewportRect.height ); + mImpl->currentContext->Clear( clearMask, Context::FORCE_CLEAR ); + mImpl->currentContext->SetScissorTest( false ); + } + else + { + mImpl->currentContext->SetScissorTest( false ); + mImpl->currentContext->Clear( clearMask, Context::FORCE_CLEAR ); + } } // Clear the list of bound textures