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