From bf54bff28b941e7d2be622477739f77001f39f74 Mon Sep 17 00:00:00 2001 From: Kimmo Hoikka Date: Thu, 27 Feb 2014 17:46:05 +0000 Subject: [PATCH] Fix the renderable visibility checking and its relationship with render once [Issue#] N/A [Problem] incorrect algorithm [Cause] [Solution] fix the logic and clarify Change-Id: I7114e35209f8a11d4f9e5c6aaa619b1744b20015 --- .../update/manager/process-render-tasks.cpp | 49 ++++++++++++---------- .../scene-graph-renderable-attachment.cpp | 41 +++++++++--------- .../scene-graph-renderable-attachment.h | 9 ++++ 3 files changed, 56 insertions(+), 43 deletions(-) diff --git a/dali/internal/update/manager/process-render-tasks.cpp b/dali/internal/update/manager/process-render-tasks.cpp index bc3683f..40c4f9c 100644 --- a/dali/internal/update/manager/process-render-tasks.cpp +++ b/dali/internal/update/manager/process-render-tasks.cpp @@ -139,31 +139,38 @@ static bool AddRenderablesForTask( BufferIndex updateBufferIndex, RenderableAttachment* renderable = node.GetAttachment().GetRenderable(); // not all attachments render if ( renderable ) { - bool ready = false; - bool complete = false; - renderable->GetReadyAndComplete(ready, complete); + bool visible = renderable->HasVisibleSizeAndColor(); + // if its not potentially visible, then don't consider this renderable for render complete checking + // note that whilst visibility is inherited (if parent is insible, skip the sub-tree), + // size and color may not be so this needs to be done per renderable + if( visible ) // i.e. some resources are ready + { + bool ready = false; + bool complete = false; + renderable->GetReadyAndComplete(ready, complete); - DALI_LOG_INFO(gRenderTaskLogFilter, Debug::General, "Testing renderable:%p ready:%s complete:%s\n", renderable, ready?"T":"F", complete?"T":"F"); + DALI_LOG_INFO(gRenderTaskLogFilter, Debug::General, "Testing renderable:%p ready:%s complete:%s\n", renderable, ready?"T":"F", complete?"T":"F"); - resourcesFinished = !complete ? complete : resourcesFinished; + resourcesFinished = !complete ? complete : resourcesFinished; - if( ready ) // i.e. some resources are ready - { - if( DrawMode::STENCIL == inheritedDrawMode ) - { - layer->stencilRenderables.push_back( renderable ); - } - else if( DrawMode::OVERLAY == inheritedDrawMode ) - { - layer->overlayRenderables.push_back( renderable ); - } - else if ( ! renderable->IsBlendingOn( updateBufferIndex ) ) - { - layer->opaqueRenderables.push_back( renderable ); - } - else + if( ready ) // i.e. some resources are ready { - layer->transparentRenderables.push_back( renderable ); + if( DrawMode::STENCIL == inheritedDrawMode ) + { + layer->stencilRenderables.push_back( renderable ); + } + else if( DrawMode::OVERLAY == inheritedDrawMode ) + { + layer->overlayRenderables.push_back( renderable ); + } + else if ( ! renderable->IsBlendingOn( updateBufferIndex ) ) + { + layer->opaqueRenderables.push_back( renderable ); + } + else + { + layer->transparentRenderables.push_back( renderable ); + } } } } diff --git a/dali/internal/update/node-attachments/scene-graph-renderable-attachment.cpp b/dali/internal/update/node-attachments/scene-graph-renderable-attachment.cpp index 0409a29..2610f3b 100644 --- a/dali/internal/update/node-attachments/scene-graph-renderable-attachment.cpp +++ b/dali/internal/update/node-attachments/scene-graph-renderable-attachment.cpp @@ -192,33 +192,30 @@ void RenderableAttachment::GetReadyAndComplete(bool& ready, bool& complete) cons CompleteStatusManager& completeStatusManager = mSceneController->GetCompleteStatusManager(); - if( mHasSizeAndColorFlag ) + std::size_t numTrackedResources = mTrackedResources.Count(); + if( mHasUntrackedResources || numTrackedResources == 0 ) { - std::size_t numTrackedResources = mTrackedResources.Count(); - if( mHasUntrackedResources || numTrackedResources == 0 ) - { - ready = mResourcesReady; - complete = mFinishedResourceAcquisition; - } - else + ready = mResourcesReady; + complete = mFinishedResourceAcquisition; + } + else + { + // If there are tracked resources and no untracked resources, test the trackers + ready = true; + for( size_t i=0; i < numTrackedResources; ++i ) { - // If there are tracked resources and no untracked resources, test the trackers - ready = true; - for( size_t i=0; i < numTrackedResources; ++i ) + ResourceTracker* tracker = completeStatusManager.FindResourceTracker(mTrackedResources[i]); + if( tracker && ! tracker->IsComplete() ) { - ResourceTracker* tracker = completeStatusManager.FindResourceTracker(mTrackedResources[i]); - if( tracker && ! tracker->IsComplete() ) - { - ready = false; - break; - } + ready = false; + break; } + } - complete = mFinishedResourceAcquisition; - if( ! complete ) - { - complete = ready; - } + complete = mFinishedResourceAcquisition; + if( ! complete ) + { + complete = ready; } } } diff --git a/dali/internal/update/node-attachments/scene-graph-renderable-attachment.h b/dali/internal/update/node-attachments/scene-graph-renderable-attachment.h index f67d5af..b3bfe50 100644 --- a/dali/internal/update/node-attachments/scene-graph-renderable-attachment.h +++ b/dali/internal/update/node-attachments/scene-graph-renderable-attachment.h @@ -156,6 +156,15 @@ public: // For use during in the update algorithm only } /** + * if this renderable actor has visible size and color + * @return true if you can potentially see this actor + */ + bool HasVisibleSizeAndColor() const + { + return mHasSizeAndColorFlag; + } + + /** * Check whether the attachment has been marked as ready to render * @param[out] ready TRUE if the attachment has resources to render * @param[out] complete TRUE if the attachment's resources are complete -- 2.7.4