X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fupdate%2Fmanager%2Frender-instruction-processor.cpp;h=2a45987ab05e789a7ef6bc692e2bd9ef903022c9;hb=0adda602532f61db5b44eb2796f9a74d7a37b519;hp=983b7995d9b919ebdb132936c11dffa5439ac0e0;hpb=bbabafdd4854af2128019da47457cd49936a2abb;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/update/manager/render-instruction-processor.cpp b/dali/internal/update/manager/render-instruction-processor.cpp old mode 100644 new mode 100755 index 983b799..2a45987 --- a/dali/internal/update/manager/render-instruction-processor.cpp +++ b/dali/internal/update/manager/render-instruction-processor.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * Copyright (c) 2019 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,6 +33,7 @@ #include #include #include +#include namespace { @@ -160,9 +161,9 @@ inline void AddRendererToRenderList( BufferIndex updateBufferIndex, bool cull ) { bool inside( true ); - const Node* node = renderable.mNode; - - if( cull && renderable.mRenderer && !renderable.mRenderer->GetShader().HintEnabled( Dali::Shader::Hint::MODIFIES_GEOMETRY ) ) + Node* node = renderable.mNode; + bool geomertryModified = false; + if( cull && renderable.mRenderer && !( geomertryModified = renderable.mRenderer->GetShader().HintEnabled( Dali::Shader::Hint::MODIFIES_GEOMETRY ) ) ) { const Vector4& boundingSphere = node->GetBoundingSphere(); inside = ( boundingSphere.w > Math::MACHINE_EPSILON_1000 ) && @@ -180,17 +181,27 @@ inline void AddRendererToRenderList( BufferIndex updateBufferIndex, item.mNode = renderable.mNode; item.mIsOpaque = ( opacityType == Renderer::OPAQUE ); item.mDepthIndex = 0; + item.mPartialUpdateEnabled = false; - if(!isLayer3d) + if( !isLayer3d ) { item.mDepthIndex = renderable.mNode->GetDepthIndex(); } + if( isLayer3d || geomertryModified ) + { + renderList.SetPartialUpdateEnabled( false ); + } if( DALI_LIKELY( renderable.mRenderer ) ) { item.mRenderer = &renderable.mRenderer->GetRenderer(); item.mTextureSet = renderable.mRenderer->GetTextures(); item.mDepthIndex += renderable.mRenderer->GetDepthIndex(); + + if( FaceCullingMode::NONE != renderable.mRenderer->GetFaceCullingMode() ) + { + renderList.SetPartialUpdateEnabled( false ); + } } else { @@ -201,7 +212,28 @@ inline void AddRendererToRenderList( BufferIndex updateBufferIndex, node->GetWorldMatrixAndSize( item.mModelMatrix, item.mSize ); Matrix::Multiply( item.mModelViewMatrix, item.mModelMatrix, viewMatrix ); + + if( node->IsPartialUpdateAvailable() && DALI_LIKELY( item.mRenderer ) && renderList.IsPartialUpdateEnabled() ) + { + if( node->IsComponentChanged() || node->IsPropertyDirty() ) + { + item.mPartialUpdateEnabled = true; + + item.mUpdateSizeHint = item.mSize; + Vector3 updateSizeHint = Vector3::ZERO; + node->GetUpdateSizeHint( updateBufferIndex, updateSizeHint ); + if( updateSizeHint != Vector3::ZERO ) + { + item.mUpdateSizeHint = updateSizeHint; + } + } + } } + node->SetCulled( updateBufferIndex, false ); + } + else + { + node->SetCulled( updateBufferIndex, true ); } } @@ -226,12 +258,11 @@ inline void AddRenderersToRenderList( BufferIndex updateBufferIndex, { DALI_LOG_INFO( gRenderListLogFilter, Debug::Verbose, "AddRenderersToRenderList()\n"); - unsigned int rendererCount( renderers.Size() ); - for( unsigned int i(0); i < rendererCount; ++i ) + for( auto&& renderer : renderers ) { AddRendererToRenderList( updateBufferIndex, renderList, - renderers[i], + renderer, viewMatrix, camera, isLayer3d, @@ -252,7 +283,7 @@ inline bool TryReuseCachedRenderers( Layer& layer, RenderableContainer& renderables ) { bool retValue = false; - size_t renderableCount = renderables.Size(); + uint32_t renderableCount = static_cast( renderables.Size() ); // Check that the cached list originates from this layer and that the counts match if( ( renderList.GetSourceLayer() == &layer )&& ( renderList.GetCachedItemCount() == renderableCount ) ) @@ -262,11 +293,11 @@ inline bool TryReuseCachedRenderers( Layer& layer, // Therefore we check a combined sum of all renderer addresses. size_t checkSumNew = 0; size_t checkSumOld = 0; - for( size_t index = 0; index < renderableCount; ++index ) + for( uint32_t index = 0; index < renderableCount; ++index ) { const Render::Renderer& renderer = renderables[index].mRenderer->GetRenderer(); - checkSumNew += size_t( &renderer ); - checkSumOld += size_t( &renderList.GetRenderer( index ) ); + checkSumNew += reinterpret_cast( &renderer ); + checkSumOld += reinterpret_cast( &renderList.GetRenderer( index ) ); } if( checkSumNew == checkSumOld ) { @@ -312,9 +343,9 @@ RenderInstructionProcessor::~RenderInstructionProcessor() inline void RenderInstructionProcessor::SortRenderItems( BufferIndex bufferIndex, RenderList& renderList, Layer& layer, bool respectClippingOrder ) { - const size_t renderableCount = renderList.Count(); + const uint32_t renderableCount = static_cast( renderList.Count() ); // Reserve space if needed. - const unsigned int oldcapacity = mSortingHelper.size(); + const uint32_t oldcapacity = static_cast( mSortingHelper.size() ); if( oldcapacity < renderableCount ) { mSortingHelper.reserve( renderableCount ); @@ -333,7 +364,7 @@ inline void RenderInstructionProcessor::SortRenderItems( BufferIndex bufferIndex // Using an if and two for-loops rather than if inside for as its better for branch prediction. if( layer.UsesDefaultSortFunction() ) { - for( size_t index = 0; index < renderableCount; ++index ) + for( uint32_t index = 0; index < renderableCount; ++index ) { RenderItem& item = renderList.GetItem( index ); @@ -346,7 +377,7 @@ inline void RenderInstructionProcessor::SortRenderItems( BufferIndex bufferIndex mSortingHelper[ index ].textureSet = item.mTextureSet; // The default sorting function should get inlined here. - mSortingHelper[ index ].zValue = Internal::Layer::ZValue( item.mModelViewMatrix.GetTranslation3() ) - item.mDepthIndex; + mSortingHelper[ index ].zValue = Internal::Layer::ZValue( item.mModelViewMatrix.GetTranslation3() ) - static_cast( item.mDepthIndex ); // Keep the renderitem pointer in the helper so we can quickly reorder items after sort. mSortingHelper[ index ].renderItem = &item; @@ -355,7 +386,7 @@ inline void RenderInstructionProcessor::SortRenderItems( BufferIndex bufferIndex else { const Dali::Layer::SortFunctionType sortFunction = layer.GetSortFunction(); - for( size_t index = 0; index < renderableCount; ++index ) + for( uint32_t index = 0; index < renderableCount; ++index ) { RenderItem& item = renderList.GetItem( index ); @@ -365,7 +396,7 @@ inline void RenderInstructionProcessor::SortRenderItems( BufferIndex bufferIndex mSortingHelper[ index ].textureSet = item.mTextureSet; - mSortingHelper[ index ].zValue = (*sortFunction)( item.mModelViewMatrix.GetTranslation3() ) - item.mDepthIndex; + mSortingHelper[ index ].zValue = (*sortFunction)( item.mModelViewMatrix.GetTranslation3() ) - static_cast( item.mDepthIndex ); // Keep the RenderItem pointer in the helper so we can quickly reorder items after sort. mSortingHelper[ index ].renderItem = &item; @@ -383,7 +414,7 @@ inline void RenderInstructionProcessor::SortRenderItems( BufferIndex bufferIndex // Reorder / re-populate the RenderItems in the RenderList to correct order based on the sortinghelper. DALI_LOG_INFO( gRenderListLogFilter, Debug::Verbose, "Sorted Transparent List:\n"); RenderItemContainer::Iterator renderListIter = renderList.GetContainer().Begin(); - for( unsigned int index = 0; index < renderableCount; ++index, ++renderListIter ) + for( uint32_t index = 0; index < renderableCount; ++index, ++renderListIter ) { *renderListIter = mSortingHelper[ index ].renderItem; DALI_LOG_INFO( gRenderListLogFilter, Debug::Verbose, " sortedList[%d] = %p\n", index, mSortingHelper[ index ].renderItem->mRenderer); @@ -403,6 +434,7 @@ void RenderInstructionProcessor::Prepare( BufferIndex updateBufferIndex, renderTask.PrepareRenderInstruction( instruction, updateBufferIndex ); bool viewMatrixHasNotChanged = !renderTask.ViewMatrixUpdated(); bool isRenderListAdded = false; + bool isRootLayerDirty = false; const Matrix& viewMatrix = renderTask.GetViewMatrix( updateBufferIndex ); SceneGraph::Camera& camera = renderTask.GetCamera(); @@ -415,6 +447,12 @@ void RenderInstructionProcessor::Prepare( BufferIndex updateBufferIndex, const bool isLayer3D = layer.GetBehavior() == Dali::Layer::LAYER_3D; RenderList* renderList = NULL; + if( layer.IsRoot() && ( layer.GetDirtyFlags() != NodePropertyFlags::NOTHING ) ) + { + // If root-layer & dirty, i.e. a property has changed or a child has been deleted, then we need to ensure we render once more + isRootLayerDirty = true; + } + if( !layer.colorRenderables.Empty() ) { RenderableContainer& renderables = layer.colorRenderables; @@ -422,6 +460,10 @@ void RenderInstructionProcessor::Prepare( BufferIndex updateBufferIndex, if( !SetupRenderList( renderables, layer, instruction, tryReuseRenderList, &renderList ) ) { renderList->SetHasColorRenderItems( true ); + if( !isLayer3D ) + { + renderList->SetPartialUpdateEnabled( true ); + } AddRenderersToRenderList( updateBufferIndex, *renderList, renderables, @@ -444,6 +486,10 @@ void RenderInstructionProcessor::Prepare( BufferIndex updateBufferIndex, if( !SetupRenderList( renderables, layer, instruction, tryReuseRenderList, &renderList ) ) { renderList->SetHasColorRenderItems( false ); + if( !isLayer3D ) + { + renderList->SetPartialUpdateEnabled( true ); + } AddRenderersToRenderList( updateBufferIndex, *renderList, renderables, @@ -463,7 +509,7 @@ void RenderInstructionProcessor::Prepare( BufferIndex updateBufferIndex, // Inform the render instruction that all renderers have been added and this frame is complete. instruction.UpdateCompleted(); - if( !isRenderListAdded && !instruction.mIsClearColorSet ) + if( !isRenderListAdded && !instruction.mIsClearColorSet && !isRootLayerDirty ) { instructions.DiscardCurrentInstruction( updateBufferIndex ); }