From 3e4ed82867c43b181d514560e996ae79438e2420 Mon Sep 17 00:00:00 2001 From: Paul Wisbey Date: Wed, 3 Jun 2015 13:05:27 +0100 Subject: [PATCH] Consider loading to be complete when no resource ID is set Change-Id: I4d68cde636b6dae4460dd537c3989f428587b87e --- automated-tests/src/dali/utc-Dali-RenderTask.cpp | 41 ++++++++++++++ .../scene-graph-image-attachment.cpp | 62 +++++++++++++--------- .../update/resources/complete-status-manager.cpp | 24 ++++++--- 3 files changed, 93 insertions(+), 34 deletions(-) diff --git a/automated-tests/src/dali/utc-Dali-RenderTask.cpp b/automated-tests/src/dali/utc-Dali-RenderTask.cpp index 0e86033..792ade5 100644 --- a/automated-tests/src/dali/utc-Dali-RenderTask.cpp +++ b/automated-tests/src/dali/utc-Dali-RenderTask.cpp @@ -3122,3 +3122,44 @@ int UtcDaliRenderTaskFinishInvisibleSourceActor(void) END_TEST; } + +int UtcDaliRenderTaskFinishMissingImage(void) +{ + TestApplication application; + + // Previously we had bugs where not having a resource ID would cause render-tasks to wait forever + tet_infoline("Testing RenderTask::SignalFinished() when an ImageActor has no Image set"); + + Stage stage = Stage::GetCurrent(); + + BufferImage image = BufferImage::New( 10, 10 ); + ImageActor rootActor = ImageActor::New( image ); + rootActor.SetSize( 10, 10 ); + stage.Add( rootActor ); + + ImageActor actorWithMissingImage = ImageActor::New( Image() ); + actorWithMissingImage.SetSize( 10, 10 ); + stage.Add( actorWithMissingImage ); + + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + RenderTask newTask = taskList.CreateTask(); + newTask.SetInputEnabled( false ); + newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) ); + newTask.SetClearEnabled( true ); + newTask.SetExclusive( true ); + newTask.SetRefreshRate( RenderTask::REFRESH_ONCE ); + + bool finished = false; + RenderTaskFinished renderTaskFinished( finished ); + newTask.FinishedSignal().Connect( &application, renderTaskFinished ); + + // 1 render to process render task, then 1 before finished msg is sent from update to the event thread. + application.SendNotification(); + application.Render(); + application.Render(); + + application.SendNotification(); + DALI_TEST_CHECK( finished ); + + END_TEST; +} diff --git a/dali/internal/update/node-attachments/scene-graph-image-attachment.cpp b/dali/internal/update/node-attachments/scene-graph-image-attachment.cpp index 803b557..6301b6b 100644 --- a/dali/internal/update/node-attachments/scene-graph-image-attachment.cpp +++ b/dali/internal/update/node-attachments/scene-graph-image-attachment.cpp @@ -120,7 +120,9 @@ void ImageAttachment::SetTextureId( BufferIndex updateBufferIndex, unsigned int ATTACHMENT_LOG_FMT(Debug::General, " textureid: %d)\n", textureId); mTextureId = textureId; - mFinishedResourceAcquisition = false; + + // Loading is essentially finished if we don't have a resource ID + mFinishedResourceAcquisition = ( 0 == mTextureId ); if( mImageRenderer ) { @@ -219,40 +221,48 @@ bool ImageAttachment::DoPrepareResources( BufferIndex updateBufferIndex, Resourc DALI_LOG_TRACE_METHOD_FMT(gImageAttachmentLogFilter, "this:%p", this); bool ready = false; - // The metadata is used by IsFullyOpaque(), below. - mBitmapMetadata = resourceManager.GetBitmapMetadata( mTextureId ); + if( 0 != mTextureId ) + { + // The metadata is used by IsFullyOpaque(), below. + mBitmapMetadata = resourceManager.GetBitmapMetadata( mTextureId ); - CompleteStatusManager& completeStatusManager = mSceneController->GetCompleteStatusManager(); - CompleteStatusManager::CompleteState status = completeStatusManager.GetStatus( mTextureId ); + CompleteStatusManager& completeStatusManager = mSceneController->GetCompleteStatusManager(); + CompleteStatusManager::CompleteState status = completeStatusManager.GetStatus( mTextureId ); - switch( status ) - { - case CompleteStatusManager::NOT_READY: + switch( status ) { - ready = false; + case CompleteStatusManager::NOT_READY: + { + ready = false; + + if( mBitmapMetadata.GetIsFramebuffer() ) + { + ready = true; + } + mFinishedResourceAcquisition = false; + FollowTracker( mTextureId ); + } + break; - if( mBitmapMetadata.GetIsFramebuffer() ) + case CompleteStatusManager::COMPLETE: { ready = true; + mFinishedResourceAcquisition = true; } - mFinishedResourceAcquisition = false; - FollowTracker( mTextureId ); - } - break; - - case CompleteStatusManager::COMPLETE: - { - ready = true; - mFinishedResourceAcquisition = true; - } - break; + break; - case CompleteStatusManager::NEVER: - { - ready = false; - mFinishedResourceAcquisition = true; + case CompleteStatusManager::NEVER: + { + ready = false; + mFinishedResourceAcquisition = true; + } + break; } - break; + } + else + { + // Loading is essentially finished if we don't have a resource ID + mFinishedResourceAcquisition = true; } ATTACHMENT_LOG_FMT(Debug::General, " ObjName:%s finished:%s ready:%s \n", diff --git a/dali/internal/update/resources/complete-status-manager.cpp b/dali/internal/update/resources/complete-status-manager.cpp index faa2712..2a4079a 100644 --- a/dali/internal/update/resources/complete-status-manager.cpp +++ b/dali/internal/update/resources/complete-status-manager.cpp @@ -107,22 +107,30 @@ CompleteStatusManager::CompleteState CompleteStatusManager::GetStatus( Integrati { CompleteState readiness = CompleteStatusManager::NOT_READY; - TrackedResourcesIter iter = mTrackedResources.find(id); - if( iter != mTrackedResources.end() ) + if( 0 != id ) { - if( iter->second->IsComplete() ) + TrackedResourcesIter iter = mTrackedResources.find(id); + if( iter != mTrackedResources.end() ) + { + if( iter->second->IsComplete() ) + { + readiness = CompleteStatusManager::COMPLETE; + } + } + else if( mResourceManager.IsResourceLoaded(id) ) { readiness = CompleteStatusManager::COMPLETE; } + else if( mResourceManager.IsResourceLoadFailed(id) ) + { + readiness = CompleteStatusManager::NEVER; + } } - else if( mResourceManager.IsResourceLoaded(id) ) + else { + // Loading is essentially finished if we don't have a resource ID readiness = CompleteStatusManager::COMPLETE; } - else if( mResourceManager.IsResourceLoadFailed(id) ) - { - readiness = CompleteStatusManager::NEVER; - } TRACKER_LOG_FMT(Debug::General, "id:%d = %s\n", id, (readiness==CompleteStatusManager::COMPLETE)?"COMPLETE":((readiness==CompleteStatusManager::NEVER)?"NEVER":"NOT_READY")); -- 2.7.4