From 71ab933d3021d59812b50647c71cb1a35e1a373f Mon Sep 17 00:00:00 2001 From: Paul Wisbey Date: Tue, 19 Aug 2014 10:31:10 +0100 Subject: [PATCH] Always call RenderTask::UpdateState every frame [Problem] Sometimes the RenderTask state is not updated after GL sync, this means that Finished signal is not received. [Cause] UpdateState is not called if the scene doesn't change. [Solution] Always call RenderTask::UpdateState every frame. Change-Id: Icd9dbf0b58c5750f3035115823211d7bb9b7985b --- dali/internal/update/manager/process-render-tasks.cpp | 4 ++-- dali/internal/update/manager/update-manager.cpp | 2 ++ .../update/render-tasks/scene-graph-render-task.cpp | 18 ++++++++++++------ .../update/render-tasks/scene-graph-render-task.h | 10 ++++++++-- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/dali/internal/update/manager/process-render-tasks.cpp b/dali/internal/update/manager/process-render-tasks.cpp index 63345dd..6010adf 100644 --- a/dali/internal/update/manager/process-render-tasks.cpp +++ b/dali/internal/update/manager/process-render-tasks.cpp @@ -286,7 +286,7 @@ void ProcessRenderTasks( BufferIndex updateBufferIndex, instructions ); } - renderTask.UpdateState(resourcesFinished); + renderTask.SetResourcesFinished( resourcesFinished ); } DALI_LOG_INFO(gRenderTaskLogFilter, Debug::General, "ProcessRenderTasks() Onscreen\n"); @@ -343,7 +343,7 @@ void ProcessRenderTasks( BufferIndex updateBufferIndex, instructions ); } - renderTask.UpdateState(resourcesFinished); + renderTask.SetResourcesFinished( resourcesFinished ); } } diff --git a/dali/internal/update/manager/update-manager.cpp b/dali/internal/update/manager/update-manager.cpp index f55da7f..6cab25f 100644 --- a/dali/internal/update/manager/update-manager.cpp +++ b/dali/internal/update/manager/update-manager.cpp @@ -1125,6 +1125,8 @@ unsigned int UpdateManager::Update( float elapsedSeconds, unsigned int lastVSync { RenderTask& renderTask(*(*iter)); + renderTask.UpdateState(); + if( renderTask.IsWaitingToRender() && renderTask.ReadyToRender(mSceneGraphBuffers.GetUpdateBufferIndex()) /*avoid updating forever when source actor is off-stage*/ ) { diff --git a/dali/internal/update/render-tasks/scene-graph-render-task.cpp b/dali/internal/update/render-tasks/scene-graph-render-task.cpp index 4fa7e21..7be55e5 100644 --- a/dali/internal/update/render-tasks/scene-graph-render-task.cpp +++ b/dali/internal/update/render-tasks/scene-graph-render-task.cpp @@ -300,11 +300,16 @@ bool RenderTask::IsRenderRequired() return required; } +void RenderTask::SetResourcesFinished( bool resourcesFinished ) +{ + mResourcesFinished = resourcesFinished; +} + // Called every frame regardless of whether render was required. // If render was not required, ignore resourcesFinished. -void RenderTask::UpdateState(bool resourcesFinished) +void RenderTask::UpdateState() { - TASK_LOG_FMT( Debug::General, "(resourcesFinished:%s) FC:%d State:%s RR:%d\n", resourcesFinished?"T":"F", mFrameCounter, STATE_STRING(mState), mRefreshRate ); + TASK_LOG_FMT( Debug::General, "(mResourcesFinished:%s) FC:%d State:%s RR:%d\n", mResourcesFinished?"T":"F", mFrameCounter, STATE_STRING(mState), mRefreshRate ); switch( mState ) { @@ -314,12 +319,12 @@ void RenderTask::UpdateState(bool resourcesFinished) { if( mFrameCounter == 0 ) { - if( resourcesFinished ) + if( mResourcesFinished ) { - ++mFrameCounter; // Only start missing frames when resources are loaded + ++mFrameCounter; // Only start skipping frames when resources are loaded } } - else // Continue counting to miss frames + else // Continue counting to skip frames { ++mFrameCounter; if( mFrameCounter >= mRefreshRate ) @@ -334,7 +339,7 @@ void RenderTask::UpdateState(bool resourcesFinished) case RENDER_ONCE_WAITING_FOR_RESOURCES: { - if( resourcesFinished ) + if( mResourcesFinished ) { mState = RENDERED_ONCE; } @@ -509,6 +514,7 @@ RenderTask::RenderTask() mCameraNode( NULL ), mCameraAttachment( NULL ), mFrameBufferResourceId( 0 ), + mResourcesFinished( false ), mWaitingToRender( false ), mNotifyTrigger( false ), mExclusive( Dali::RenderTask::DEFAULT_EXCLUSIVE ), diff --git a/dali/internal/update/render-tasks/scene-graph-render-task.h b/dali/internal/update/render-tasks/scene-graph-render-task.h index e178be2..7cf2489 100644 --- a/dali/internal/update/render-tasks/scene-graph-render-task.h +++ b/dali/internal/update/render-tasks/scene-graph-render-task.h @@ -243,11 +243,16 @@ public: bool IsRenderRequired(); /** + * Set whether all resources were available when the render-task was processed + * @param[in] resourcesComplete True if the resources of the source tree are completely loaded. + */ + void SetResourcesFinished( bool resourcesFinished ); + + /** * Process a frame. This method is called each frame for every ready render task, regardless * of whether it needs to render (so that the frame counter can be updated). - * @param[in] resourcesComplete true if the resources of the source tree are completely loaded. */ - void UpdateState( bool resourcesComplete ); + void UpdateState(); /** * Return true only if currently waiting for the render task to @@ -336,6 +341,7 @@ private: CameraAttachment* mCameraAttachment; unsigned int mFrameBufferResourceId; + bool mResourcesFinished:1; ///< True if all resources were available when the render-task was processed bool mWaitingToRender:1; ///< True when an render once to FBO is waiting bool mNotifyTrigger:1; ///< True if a render once render task has finished renderering bool mExclusive: 1; ///< Whether the render task has exclusive access to the source actor (node in the scene graph implementation). -- 2.7.4