Always call RenderTask::UpdateState every frame 16/26216/2
authorPaul Wisbey <p.wisbey@samsung.com>
Tue, 19 Aug 2014 09:31:10 +0000 (10:31 +0100)
committerPaul Wisbey <p.wisbey@samsung.com>
Tue, 19 Aug 2014 10:06:46 +0000 (11:06 +0100)
[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
dali/internal/update/manager/update-manager.cpp
dali/internal/update/render-tasks/scene-graph-render-task.cpp
dali/internal/update/render-tasks/scene-graph-render-task.h

index 63345dd..6010adf 100644 (file)
@@ -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 );
   }
 }
 
index f55da7f..6cab25f 100644 (file)
@@ -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*/ )
     {
index 4fa7e21..7be55e5 100644 (file)
@@ -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 ),
index e178be2..7cf2489 100644 (file)
@@ -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).