Merge "Property enum name changes in dali-core: Core changes" into tizen
[platform/core/uifw/dali-core.git] / automated-tests / src / dali / utc-Dali-RenderTask.cpp
index d7d32d7..8a7a3cf 100644 (file)
@@ -1,25 +1,30 @@
-//
-// Copyright (c) 2014 Samsung Electronics Co., Ltd.
-//
-// Licensed under the Flora License, Version 1.0 (the License);
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://floralicense.org/license/
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an AS IS BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
 
 #include <iostream>
 
 #include <stdlib.h>
-#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
 #include <dali-test-suite-utils.h>
 #include <dali/integration-api/debug.h>
+#include <test-native-image.h>
+
+#define BOOLSTR(x) ((x)?"T":"F")
+
 
 using namespace Dali;
 
@@ -36,61 +41,6 @@ void utc_dali_render_task_cleanup(void)
 namespace // unnamed namespace
 {
 
-class TestNativeImage : public NativeImage
-{
-public:
-  int mWidth;
-  int mHeight;
-  TestNativeImage(int width, int height)
-  : mWidth(width),
-    mHeight(height)
-  {}
-
-  virtual bool GlExtensionCreate() {return true;};
-
-  /**
-   * Destroy the GL resource for the NativeImage.
-   * e.g. For the EglImageKHR extension, this corresponds to calling eglDestroyImageKHR()
-   * @pre There is a GL context for the current thread.
-   */
-  virtual void GlExtensionDestroy() {};
-
-  /**
-   * Use the NativeImage as a texture for rendering
-   * @pre There is a GL context for the current thread.
-   * @return A GL error code
-   */
-  virtual unsigned int TargetTexture() {return 0;};
-
-  /**
-   * Called in each NativeTexture::Bind() call to allow implementation specific operations.
-   * The correct texture sampler has already been bound before the function gets called.
-   * @pre glAbstraction is being used by context in current thread
-   */
-  virtual void PrepareTexture() {}
-
-  /**
-   * Returns the width of the NativeImage
-   * @return width
-   */
-  virtual unsigned int GetWidth() const {return mWidth;}
-
-  /**
-   * Returns the height of the NativeImage
-   * @return height
-   */
-  virtual unsigned int GetHeight() const {return mHeight;}
-
-  /**
-   * Returns the internal pixel NativeImage::PixelFormat of the NativeImage
-   * @return pixel format
-   */
-  virtual Pixel::Format GetPixelFormat() const { return Pixel::RGBA8888; }
-protected:
-  ~TestNativeImage(){}
-};
-
-
 const int RENDER_FRAME_INTERVAL = 16;                           ///< Duration of each frame in ms. (at approx 60FPS)
 
 /*
@@ -180,9 +130,9 @@ bool TestScreenToFrameBufferFunction( Vector2& coordinates )
   return true;
 }
 
-ImageActor CreateLoadingImage(TestApplication& application, std::string filename, Image::LoadPolicy loadPolicy, Image::ReleasePolicy releasePolicy)
+ImageActor CreateLoadingImage(TestApplication& application, std::string filename, ResourceImage::LoadPolicy loadPolicy, Image::ReleasePolicy releasePolicy)
 {
-  Image image = Image::New(filename, loadPolicy, releasePolicy);
+  Image image = ResourceImage::New(filename, loadPolicy, releasePolicy);
   DALI_TEST_CHECK( image );
   application.SendNotification();
   application.Render(16);
@@ -200,7 +150,7 @@ void CompleteImageLoad(TestApplication& application, Integration::ResourceId res
   ids.push_back( 23 );
   application.GetGlAbstraction().SetNextTextureIds( ids );
 
-  Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
+  Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
   Integration::ResourcePointer resource(bitmap);
   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
 
@@ -212,7 +162,7 @@ void FailImageLoad(TestApplication& application, Integration::ResourceId resourc
   application.GetPlatform().SetResourceLoadFailed(resourceId, Integration::FailureUnknown);
 }
 
-void ReloadImage(TestApplication& application, Image image)
+void ReloadImage(TestApplication& application, ResourceImage image)
 {
   application.GetPlatform().ClearReadyResources();
   application.GetPlatform().DiscardRequest();
@@ -235,8 +185,8 @@ RenderTask CreateRenderTask(TestApplication& application,
   FrameBufferImage frameBufferImage;
   if( glSync )
   {
-    NativeImagePtr testNativeImagePtr = new TestNativeImage(10, 10);
-    frameBufferImage= FrameBufferImage::New( *testNativeImagePtr.Get() );
+    NativeImageInterfacePtr testNativeImagePtr = TestNativeImage::New(10, 10);
+    frameBufferImage= FrameBufferImage::New( *(testNativeImagePtr.Get()) );
   }
   else
   {
@@ -257,8 +207,7 @@ RenderTask CreateRenderTask(TestApplication& application,
   return newTask;
 }
 
-
-bool UpdateRender(TestApplication& application, TraceCallStack& callStack, bool testDrawn, bool& finishedSig, bool testFinished )
+bool UpdateRender(TestApplication& application, TraceCallStack& callStack, bool testDrawn, bool& finishedSig, bool testFinished, bool testKeepUpdating )
 {
   finishedSig = false;
   callStack.Reset();
@@ -275,19 +224,72 @@ bool UpdateRender(TestApplication& application, TraceCallStack& callStack, bool
     sigPassed = ! finishedSig;
   }
 
+  bool drawResult = callStack.FindMethod("DrawElements") || callStack.FindMethod("DrawArrays");
+
   bool drawPassed = false;
   if( testDrawn )
   {
-    drawPassed = callStack.FindMethod("DrawElements") || callStack.FindMethod("DrawArrays");
+    drawPassed = drawResult;
   }
   else
   {
-    drawPassed = ! callStack.FindMethod("DrawElements") && ! callStack.FindMethod("DrawArrays") ;
+    drawPassed = !drawResult;
   }
 
-  tet_printf("UpdateRender: drawPassed:%s  sigPassed:%s (Expected: %s %s)\n", drawPassed?"T":"F", sigPassed?"T":"F", testDrawn?"T":"F", testFinished?"T":"F");
+  bool keepUpdating = (application.GetUpdateStatus() != 0);
+  bool keepUpdatingPassed = false;
+  if( testKeepUpdating )
+  {
+    keepUpdatingPassed = keepUpdating;
+  }
+  else
+  {
+    keepUpdatingPassed = !keepUpdating;
+  }
+
+  bool result = (sigPassed && drawPassed && keepUpdatingPassed);
+
+  tet_printf("UpdateRender: Expected: Draw:%s Signal:%s Keep Updating: %s  Actual: Draw:%s  Signal:%s KeepUpdating: %s  %s\n",
+             BOOLSTR(testDrawn), BOOLSTR(testFinished), BOOLSTR(testKeepUpdating),
+             BOOLSTR(drawResult), BOOLSTR(finishedSig), BOOLSTR(keepUpdating),
+             result ? "Passed":"Failed");
+
+  return result;
+}
 
-  return (sigPassed && drawPassed);
+// The functor to be used in the hit-test algorithm to check whether the actor is hittable.
+bool IsActorHittableFunction(Actor actor, Dali::HitTestAlgorithm::TraverseType type)
+{
+  bool hittable = false;
+
+  switch (type)
+  {
+    case Dali::HitTestAlgorithm::CHECK_ACTOR:
+    {
+      // Check whether the actor is visible and not fully transparent.
+      if( actor.IsVisible()
+       && actor.GetCurrentWorldColor().a > 0.01f) // not FULLY_TRANSPARENT
+      {
+
+          hittable = true;
+      }
+      break;
+    }
+    case Dali::HitTestAlgorithm::DESCEND_ACTOR_TREE:
+    {
+      if( actor.IsVisible() ) // Actor is visible, if not visible then none of its children are visible.
+      {
+        hittable = true;
+      }
+      break;
+    }
+    default:
+    {
+      break;
+    }
+  }
+
+  return hittable;
 }
 
 } // unnamed namespace
@@ -339,7 +341,7 @@ int UtcDaliRenderTaskSetSourceActor(void)
   ids.push_back( 7 );
   application.GetGlAbstraction().SetNextTextureIds( ids );
 
-  BitmapImage img = BitmapImage::New( 1,1 );
+  BufferImage img = BufferImage::New( 1,1 );
   ImageActor newActor = ImageActor::New( img );
   newActor.SetSize(1,1);
   stage.Add( newActor );
@@ -402,7 +404,7 @@ int UtcDaliRenderTaskSetSourceActorOffStage(void)
   ids.push_back( expectedTextureId );
   application.GetGlAbstraction().SetNextTextureIds( ids );
 
-  BitmapImage img = BitmapImage::New( 1,1 );
+  BufferImage img = BufferImage::New( 1,1 );
   ImageActor newActor = ImageActor::New( img );
   newActor.SetSize(1,1);
   task.SetSourceActor( newActor );
@@ -463,7 +465,7 @@ int UtcDaliRenderTaskSetSourceActorEmpty(void)
   ids.push_back( expectedTextureId );
   application.GetGlAbstraction().SetNextTextureIds( ids );
 
-  BitmapImage img = BitmapImage::New( 1,1 );
+  BufferImage img = BufferImage::New( 1,1 );
   ImageActor newActor = ImageActor::New( img );
   newActor.SetSize(1,1);
   stage.Add( newActor );
@@ -536,7 +538,7 @@ int UtcDaliRenderTaskSetExclusive(void)
   ids.push_back( 10 ); // 10 = actor3
   application.GetGlAbstraction().SetNextTextureIds( ids );
 
-  BitmapImage img1 = BitmapImage::New( 1,1 );
+  BufferImage img1 = BufferImage::New( 1,1 );
   ImageActor actor1 = ImageActor::New( img1 );
   actor1.SetSize(1,1);
   Stage::GetCurrent().Add( actor1 );
@@ -554,7 +556,7 @@ int UtcDaliRenderTaskSetExclusive(void)
     DALI_TEST_EQUALS( boundTextures[0], 8u/*unique to actor1*/, TEST_LOCATION );
   }
 
-  BitmapImage img2 = BitmapImage::New( 1,1 );
+  BufferImage img2 = BufferImage::New( 1,1 );
   ImageActor actor2 = ImageActor::New( img2 );
   actor2.SetSize(1,1);
 
@@ -578,7 +580,7 @@ int UtcDaliRenderTaskSetExclusive(void)
     DALI_TEST_EQUALS( boundTextures[1], 8u/*unique to actor1*/, TEST_LOCATION );
   }
 
-  BitmapImage img3 = BitmapImage::New( 1,1 );
+  BufferImage img3 = BufferImage::New( 1,1 );
   ImageActor actor3 = ImageActor::New( img3 );
   actor3.SetSize(1,1);
 
@@ -936,7 +938,7 @@ int UtcDaliRenderTaskSetViewportPosition(void)
 
   // Set by Property test
   Vector2 newPosition2(32.0f, 32.0f);
-  task.SetProperty( RenderTask::VIEWPORT_POSITION, newPosition2 );
+  task.SetProperty( RenderTask::Property::VIEWPORT_POSITION, newPosition2 );
 
   // Update
   application.SendNotification();
@@ -946,7 +948,7 @@ int UtcDaliRenderTaskSetViewportPosition(void)
 
   Vector2 newPosition3(64.0f, 0.0f);
   Animation animation = Animation::New(1.0f);
-  animation.AnimateTo( Property( task, RenderTask::VIEWPORT_POSITION ), newPosition3, AlphaFunctions::Linear );
+  animation.AnimateTo( Property( task, RenderTask::Property::VIEWPORT_POSITION ), newPosition3, AlphaFunctions::Linear );
   animation.Play();
 
   // Perform 1000ms worth of updates at which point animation should have completed.
@@ -984,7 +986,7 @@ int UtcDaliRenderTaskSetViewportSize(void)
 
   // Set by Property test
   Vector2 newSize2(50.0f, 50.0f);
-  task.SetProperty( RenderTask::VIEWPORT_SIZE, newSize2 );
+  task.SetProperty( RenderTask::Property::VIEWPORT_SIZE, newSize2 );
 
   // Update
   application.SendNotification();
@@ -994,7 +996,7 @@ int UtcDaliRenderTaskSetViewportSize(void)
 
   Vector2 newSize3(10.0f, 10.0f);
   Animation animation = Animation::New(1.0f);
-  animation.AnimateTo( Property( task, RenderTask::VIEWPORT_SIZE ), newSize3, AlphaFunctions::Linear );
+  animation.AnimateTo( Property( task, RenderTask::Property::VIEWPORT_SIZE ), newSize3, AlphaFunctions::Linear );
   animation.Play();
 
   // Perform 1000ms worth of updates at which point animation should have completed.
@@ -1025,7 +1027,7 @@ int UtcDaliRenderTaskSetClearColor(void)
 
   DALI_TEST_EQUALS( task.GetClearColor(), testColor, TEST_LOCATION );
 
-  task.SetProperty( RenderTask::CLEAR_COLOR, testColor2 );
+  task.SetProperty( RenderTask::Property::CLEAR_COLOR, testColor2 );
 
   // Wait a frame.
   Wait(application);
@@ -1128,13 +1130,13 @@ int UtcDaliRenderTaskSignalFinished(void)
 
   Stage::GetCurrent().Add( offscreenCameraActor );
 
-  BitmapImage image = BitmapImage::New( 10, 10 );
+  BufferImage image = BufferImage::New( 10, 10 );
   ImageActor rootActor = ImageActor::New( image );
   rootActor.SetSize( 10, 10 );
   Stage::GetCurrent().Add( rootActor );
 
   RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
-  NativeImagePtr testNativeImagePtr = new TestNativeImage(10, 10);
+  NativeImageInterfacePtr testNativeImagePtr = TestNativeImage::New(10, 10);
   FrameBufferImage frameBufferImage = FrameBufferImage::New( *testNativeImagePtr.Get() );
 
   // Flush all outstanding messages
@@ -1215,7 +1217,7 @@ int UtcDaliRenderTaskContinuous01(void)
   CameraActor offscreenCameraActor = CameraActor::New();
   Stage::GetCurrent().Add( offscreenCameraActor );
 
-  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
   Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
   Integration::ResourceId imageRequestId = imageRequest->GetId();
   Integration::ResourceTypeId imageType  = imageRequest->GetType()->id;
@@ -1227,20 +1229,19 @@ int UtcDaliRenderTaskContinuous01(void)
   CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
   application.SendNotification();
 
-  // START PROCESS/RENDER                     Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, false,   finished, false ) );
+  // START PROCESS/RENDER                     Input,    Expected  Input, Expected, KeepUpdating
+  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, false,   finished, false, true ) );
+  application.GetPlatform().ClearReadyResources();
+
+  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, false,   finished, false, false ) );
 
   // ADD SOURCE ACTOR TO STAGE - expect continuous renders to start, no finished signal
   Stage::GetCurrent().Add(secondRootActor);
   application.SendNotification();
 
   // CONTINUE PROCESS/RENDER                  Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, true,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, true,    finished, false, false ) );
   END_TEST;
 }
 
@@ -1262,7 +1263,7 @@ int UtcDaliRenderTaskContinuous02(void)
   CameraActor offscreenCameraActor = CameraActor::New();
   Stage::GetCurrent().Add( offscreenCameraActor );
 
-  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
   Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
   Integration::ResourceId imageRequestId = imageRequest->GetId();
   Integration::ResourceTypeId imageType  = imageRequest->GetType()->id;
@@ -1277,19 +1278,17 @@ int UtcDaliRenderTaskContinuous02(void)
   application.SendNotification();
 
   // START PROCESS/RENDER                    Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  application.GetPlatform().ClearReadyResources();
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, false ) );
 
   // MAKE SOURCE ACTOR VISIBLE - expect continuous renders to start, no finished signal
   secondRootActor.SetVisible(true);
   application.SendNotification();
 
   // CONTINUE PROCESS/RENDER                 Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, false ) );
   END_TEST;
 }
 
@@ -1308,7 +1307,7 @@ int UtcDaliRenderTaskContinuous03(void)
   Stage::GetCurrent().Add( rootActor );
 
   CameraActor offscreenCameraActor = CameraActor::New();
-  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
   Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
   Integration::ResourceId imageRequestId = imageRequest->GetId();
   Integration::ResourceTypeId imageType  = imageRequest->GetType()->id;
@@ -1322,19 +1321,17 @@ int UtcDaliRenderTaskContinuous03(void)
   application.SendNotification();
 
   // START PROCESS/RENDER                    Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  application.GetPlatform().ClearReadyResources();
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, false ) );
 
   // ADD CAMERA ACTOR TO STAGE - expect continuous renders to start, no finished signal
   Stage::GetCurrent().Add( offscreenCameraActor );
   application.SendNotification();
 
   // CONTINUE PROCESS/RENDER                 Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, false ) );
   END_TEST;
 }
 
@@ -1355,7 +1352,7 @@ int UtcDaliRenderTaskContinuous04(void)
 
   CameraActor offscreenCameraActor = CameraActor::New();
   Stage::GetCurrent().Add( offscreenCameraActor );
-  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
   Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
   Integration::ResourceId imageRequestId = imageRequest->GetId();
   Integration::ResourceTypeId imageType  = imageRequest->GetType()->id;
@@ -1368,118 +1365,12 @@ int UtcDaliRenderTaskContinuous04(void)
   application.SendNotification();
 
   // START PROCESS/RENDER                    Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
 
-  // FINISH RESOURCE LOADING - expect continuous renders to start, no finished signal
+  // FINISH RESOURCE LOADING - expect 'continuous' renders to start, no finished signal
   CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-
-  // CONTINUE PROCESS/RENDER                 Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  END_TEST;
-}
-
-int UtcDaliRenderTaskContinuous05(void)
-{
-  TestApplication application;
-
-  tet_infoline("Testing RenderTask Render Continuous, every 3 frames using loading image\nPRE: Resources not ready\nPOST:continuous renders, no Finished signal");
-
-  // SETUP AN OFFSCREEN RENDER TASK
-  application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
-  TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
-  drawTrace.Enable(true);
-
-  Actor rootActor = Actor::New();
-  Stage::GetCurrent().Add( rootActor );
-
-  CameraActor offscreenCameraActor = CameraActor::New();
-  Stage::GetCurrent().Add( offscreenCameraActor );
-  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
-  Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
-  Integration::ResourceId imageRequestId = imageRequest->GetId();
-  Integration::ResourceTypeId imageType  = imageRequest->GetType()->id;
-  Stage::GetCurrent().Add(secondRootActor);
-
-  RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, 3, true);
-  bool finished = false;
-  RenderTaskFinished renderTaskFinished( finished );
-  newTask.FinishedSignal().Connect( &application, renderTaskFinished );
-  application.SendNotification();
-
-  // START PROCESS/RENDER                    Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-
-  // FINISH RESOURCE LOADING - expect continuous renders to start, no finished signal
-  CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  END_TEST;
-}
-
-int UtcDaliRenderTaskContinuous06(void)
-{
-  TestApplication application;
-
-  tet_infoline("Testing RenderTask Render Continuous, every 3 frames using loading image\nPRE: Render Always, Resources not ready\nPOST:continuous renders at reduced freq, no Finished signal");
-
-  // SETUP AN OFFSCREEN RENDER TASK
-  application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
-  TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
-  drawTrace.Enable(true);
-
-  Actor rootActor = Actor::New();
-  Stage::GetCurrent().Add( rootActor );
-
-  CameraActor offscreenCameraActor = CameraActor::New();
-  Stage::GetCurrent().Add( offscreenCameraActor );
-  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
-  Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
-  Integration::ResourceId imageRequestId = imageRequest->GetId();
-  Integration::ResourceTypeId imageType  = imageRequest->GetType()->id;
-  Stage::GetCurrent().Add(secondRootActor);
-
-  RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
-  bool finished = false;
-  RenderTaskFinished renderTaskFinished( finished );
-  newTask.FinishedSignal().Connect( &application, renderTaskFinished );
-  application.SendNotification();
-
-  // START PROCESS/RENDER                     Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, false,   finished, false ) );
-
-  // FINISH RESOURCE LOADING - expect continuous renders to start, no finished signal
-  CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
-  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, true,    finished, false ) );
-
-  // CHANGE FREQUENCY
-  newTask.SetRefreshRate(3);  //              Input,    Expected  Input,    Expected
-  application.SendNotification();
-  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, false,   finished, false ) );
-
-  newTask.SetRefreshRate(RenderTask::REFRESH_ALWAYS); // Should render every frame immediately
-  application.SendNotification();
-  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application,  drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, false ) );
   END_TEST;
 }
 
@@ -1501,13 +1392,12 @@ int UtcDaliRenderTaskOnce01(void)
 
   CameraActor offscreenCameraActor = CameraActor::New();
   Stage::GetCurrent().Add( offscreenCameraActor );
-  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
   Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
   Integration::ResourceId imageRequestId = imageRequest->GetId();
   Integration::ResourceTypeId imageType  = imageRequest->GetType()->id;
 
   Stage::GetCurrent().Add(secondRootActor);
-  secondRootActor.SetVisible(false);
 
   RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, true);
   bool finished = false;
@@ -1516,33 +1406,26 @@ int UtcDaliRenderTaskOnce01(void)
   application.SendNotification();
 
   // START PROCESS/RENDER                    Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
 
   // MAKE SOURCE VISIBLE
   secondRootActor.SetVisible(true);
   application.SendNotification();
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
 
   // FINISH RESOURCE LOADING - expect no rendering yet
   CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
   Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
   DALI_TEST_CHECK( lastSyncObj != NULL );
 
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  application.GetPlatform().ClearReadyResources();
   sync.SetObjectSynced( lastSyncObj, true );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false  ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true  ) );
-
-  // Finished rendering - expect no more renders, no more signals:
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,   finished, false, true  ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true, false  ) );
   END_TEST;
 }
 
@@ -1565,7 +1448,7 @@ int UtcDaliRenderTaskOnce02(void)
 
   CameraActor offscreenCameraActor = CameraActor::New();
   Stage::GetCurrent().Add( offscreenCameraActor );
-  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
   Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
   Integration::ResourceId imageRequestId = imageRequest->GetId();
   Integration::ResourceTypeId imageType  = imageRequest->GetType()->id;
@@ -1578,34 +1461,28 @@ int UtcDaliRenderTaskOnce02(void)
   application.SendNotification();
 
   // START PROCESS/RENDER                    Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
 
   // FINISH RESOURCE LOADING
   CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, false ) );
+  application.GetPlatform().ClearReadyResources();
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, false ) );
 
   newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
   application.SendNotification(); //         Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
   Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
   DALI_TEST_CHECK( lastSyncObj != NULL );
 
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
   sync.SetObjectSynced( lastSyncObj, true );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false  ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true  ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true  ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true, false  ) );
 
-  // Finished rendering - expect no more renders, no more signals:
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
   END_TEST;
 }
 
@@ -1630,7 +1507,7 @@ int UtcDaliRenderTaskOnce03(void)
 
   CameraActor offscreenCameraActor = CameraActor::New();
   Stage::GetCurrent().Add( offscreenCameraActor );
-  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
   Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
   Integration::ResourceId imageRequestId = imageRequest->GetId();
   Integration::ResourceTypeId imageType  = imageRequest->GetType()->id;
@@ -1643,32 +1520,26 @@ int UtcDaliRenderTaskOnce03(void)
   application.SendNotification();
 
   // START PROCESS/RENDER                    Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
 
   // CHANGE TO RENDER ONCE
   newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
   application.SendNotification(); //         Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
 
   // FINISH RESOURCE LOADING
   CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
   Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
   DALI_TEST_CHECK( lastSyncObj != NULL );
+  application.GetPlatform().ClearReadyResources();
 
   sync.SetObjectSynced( lastSyncObj, true );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false  ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true  ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true  ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true, false  ) );
 
-  // Finished rendering - expect no more renders, no more signals:
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
   END_TEST;
 }
 
@@ -1693,7 +1564,7 @@ int UtcDaliRenderTaskOnce03(void)
 
   CameraActor offscreenCameraActor = CameraActor::New();
   Stage::GetCurrent().Add( offscreenCameraActor );
-  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
   Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
   Integration::ResourceId imageRequestId = imageRequest->GetId();
   Integration::ResourceTypeId imageType  = imageRequest->GetType()->id;
@@ -1701,6 +1572,7 @@ int UtcDaliRenderTaskOnce03(void)
   application.Render();
 
   Stage::GetCurrent().Add(secondRootActor);
+  application.GetPlatform().ClearReadyResources();
 
   RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
   bool finished = false;
@@ -1709,8 +1581,8 @@ int UtcDaliRenderTaskOnce03(void)
   application.SendNotification();
 
   // START PROCESS/RENDER                    Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
 
   // CHANGE TO RENDER ONCE, RESOURCES BECOME NOT READY
   newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
@@ -1719,28 +1591,29 @@ int UtcDaliRenderTaskOnce03(void)
   ReloadImage(application, secondRootActor.GetImage());
   application.SendNotification(); //         Input,    Expected  Input,    Expected
 
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
   DALI_TEST_EQUALS( secondRootActor.GetImage().GetLoadingState(), Dali::ResourceLoading, TEST_LOCATION);
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
 
   // FINISH RESOURCE LOADING
   CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
+  application.GetPlatform().ClearReadyResources();
   Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
   DALI_TEST_CHECK( lastSyncObj != NULL );
 
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
   sync.SetObjectSynced( lastSyncObj, true );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false  ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true  ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true  ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true, true  ) );
 
   // Finished rendering - expect no more renders, no more signals:
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
   END_TEST;
 }
 #endif
@@ -1765,12 +1638,13 @@ int UtcDaliRenderTaskOnce05(void)
 
   CameraActor offscreenCameraActor = CameraActor::New();
   Stage::GetCurrent().Add( offscreenCameraActor );
-  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
   Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
   Integration::ResourceId imageRequestId = imageRequest->GetId();
   Integration::ResourceTypeId imageType  = imageRequest->GetType()->id;
   CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
   application.Render();
+  application.GetPlatform().ClearReadyResources();
 
   Stage::GetCurrent().Add(secondRootActor);
 
@@ -1781,39 +1655,32 @@ int UtcDaliRenderTaskOnce05(void)
   application.SendNotification();
 
   // START PROCESS/RENDER                    Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, false ) );
 
   // CHANGE TO RENDER ONCE,
   newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
   application.SendNotification();
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
   Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
   DALI_TEST_CHECK( lastSyncObj != NULL );
 
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
   sync.SetObjectSynced( lastSyncObj, true );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true  ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true,  false  ) );
 
   newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
   application.SendNotification();
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
   lastSyncObj = sync.GetLastSyncObject();
   DALI_TEST_CHECK( lastSyncObj != NULL );
 
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
   sync.SetObjectSynced( lastSyncObj, true );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true  ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true, false  ) );
   END_TEST;
 }
 
@@ -1839,12 +1706,13 @@ int UtcDaliRenderTaskOnce06(void)
 
   CameraActor offscreenCameraActor = CameraActor::New();
   Stage::GetCurrent().Add( offscreenCameraActor );
-  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
   Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
   Integration::ResourceId imageRequestId = imageRequest->GetId();
   Integration::ResourceTypeId imageType  = imageRequest->GetType()->id;
   CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
   application.Render();
+  application.GetPlatform().ClearReadyResources();
 
   Stage::GetCurrent().Add(secondRootActor);
 
@@ -1857,26 +1725,26 @@ int UtcDaliRenderTaskOnce06(void)
 
   application.SendNotification();
 
+  // Expect 2 frames to be drawn.
   // START PROCESS/RENDER                    Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
   Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
   DALI_TEST_CHECK( lastSyncObj == NULL );
-
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, false ) );
 
   // CHANGE TO RENDER ONCE,
   newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
   application.SendNotification();
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
   lastSyncObj = sync.GetLastSyncObject();
   DALI_TEST_CHECK( lastSyncObj != NULL );
 
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
 
   sync.SetObjectSynced( lastSyncObj, true );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true  ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true, false  ) );
   application.SendNotification();
 
   // Expect SetRefreshRate to have been called again
@@ -1884,18 +1752,13 @@ int UtcDaliRenderTaskOnce06(void)
   RenderTaskFinished renderTaskFinished( finished );
   connectionTracker.DisconnectAll();
   newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinished );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
   lastSyncObj = sync.GetLastSyncObject();
   DALI_TEST_CHECK( lastSyncObj != NULL );
 
   sync.SetObjectSynced( lastSyncObj, true );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true  ) );
-
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true, false  ) );
   END_TEST;
 }
 
@@ -1920,12 +1783,13 @@ int UtcDaliRenderTaskOnce07(void)
 
   CameraActor offscreenCameraActor = CameraActor::New();
   Stage::GetCurrent().Add( offscreenCameraActor );
-  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
   Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
   Integration::ResourceId imageRequestId = imageRequest->GetId();
   Integration::ResourceTypeId imageType  = imageRequest->GetType()->id;
   CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
   application.Render();
+  application.GetPlatform().ClearReadyResources();
 
   Stage::GetCurrent().Add(secondRootActor);
 
@@ -1936,32 +1800,28 @@ int UtcDaliRenderTaskOnce07(void)
   application.SendNotification();
 
   // START PROCESS/RENDER                    Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, false ) );
 
   // CHANGE TO RENDER ONCE,
   newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
   application.SendNotification();
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
 
   newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
   application.SendNotification();
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
   Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
   DALI_TEST_CHECK( lastSyncObj != NULL );
 
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
   sync.SetObjectSynced( lastSyncObj, true );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true  ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true, false  ) );
 
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
   END_TEST;
 }
 
@@ -1987,7 +1847,7 @@ int UtcDaliRenderTaskOnce08(void)
 
   CameraActor offscreenCameraActor = CameraActor::New();
   Stage::GetCurrent().Add( offscreenCameraActor );
-  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
   Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
   Integration::ResourceId imageRequestId = imageRequest->GetId();
   Stage::GetCurrent().Add(secondRootActor);
@@ -1999,31 +1859,29 @@ int UtcDaliRenderTaskOnce08(void)
   application.SendNotification();
 
   // START PROCESS/RENDER                    Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
 
   // CHANGE TO RENDER ONCE,
   newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
   application.SendNotification();
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
+
+  tet_printf("  FailImageLoad\n");
 
   FailImageLoad(application, imageRequestId); // Need to run Update again for this to complete
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) ); // nothing to draw
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) ); // nothing to draw
+  application.SendNotification();
+
+  // Drawing empty framebuffer, so will still get a GL sync
   Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
   DALI_TEST_CHECK( lastSyncObj != NULL );
 
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  sync.SetObjectSynced( lastSyncObj, true );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true  ) );
+  // Expect finished signal, as all resources are complete
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,   finished, true, false ) );
 
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
   END_TEST;
 }
 
@@ -2045,13 +1903,12 @@ int UtcDaliRenderTaskOnceNoSync01(void)
 
   CameraActor offscreenCameraActor = CameraActor::New();
   Stage::GetCurrent().Add( offscreenCameraActor );
-  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
   Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
   Integration::ResourceId imageRequestId = imageRequest->GetId();
   Integration::ResourceTypeId imageType  = imageRequest->GetType()->id;
 
   Stage::GetCurrent().Add(secondRootActor);
-  secondRootActor.SetVisible(false);
 
   RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, false);
   bool finished = false;
@@ -2060,22 +1917,14 @@ int UtcDaliRenderTaskOnceNoSync01(void)
   application.SendNotification();
 
   // START PROCESS/RENDER                    Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-
-  // MAKE SOURCE VISIBLE
-  secondRootActor.SetVisible(true);
-  application.SendNotification();
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
 
   // FINISH RESOURCE LOADING - expect immediate rendering yet
   CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false  ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false  ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
+  application.GetPlatform().ClearReadyResources();
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true, false ) );
   END_TEST;
 }
 
@@ -2097,7 +1946,7 @@ int UtcDaliRenderTaskOnceNoSync02(void)
 
   CameraActor offscreenCameraActor = CameraActor::New();
   Stage::GetCurrent().Add( offscreenCameraActor );
-  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
   Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
   Integration::ResourceId imageRequestId = imageRequest->GetId();
   Integration::ResourceTypeId imageType  = imageRequest->GetType()->id;
@@ -2110,22 +1959,18 @@ int UtcDaliRenderTaskOnceNoSync02(void)
   application.SendNotification();
 
   // START PROCESS/RENDER                    Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
 
   // FINISH RESOURCE LOADING
   CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, false ) );
+  application.GetPlatform().ClearReadyResources();
 
   newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
   application.SendNotification(); //         Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true  ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true, false  ) );
   END_TEST;
 }
 
@@ -2149,7 +1994,7 @@ int UtcDaliRenderTaskOnceNoSync03(void)
 
   CameraActor offscreenCameraActor = CameraActor::New();
   Stage::GetCurrent().Add( offscreenCameraActor );
-  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
   Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
   Integration::ResourceId imageRequestId = imageRequest->GetId();
   Integration::ResourceTypeId imageType  = imageRequest->GetType()->id;
@@ -2162,22 +2007,20 @@ int UtcDaliRenderTaskOnceNoSync03(void)
   application.SendNotification();
 
   // START PROCESS/RENDER                    Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
 
   // CHANGE TO RENDER ONCE
   newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
   application.SendNotification(); //         Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
 
   // FINISH RESOURCE LOADING
   CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true  ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
+  application.GetPlatform().ClearReadyResources();
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true, false  ) );
   END_TEST;
 }
 
@@ -2201,12 +2044,13 @@ int UtcDaliRenderTaskOnceNoSync03(void)
 
   CameraActor offscreenCameraActor = CameraActor::New();
   Stage::GetCurrent().Add( offscreenCameraActor );
-  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
   Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
   Integration::ResourceId imageRequestId = imageRequest->GetId();
   Integration::ResourceTypeId imageType  = imageRequest->GetType()->id;
   CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
   application.Render();
+  application.GetPlatform().ClearReadyResources();
 
   Stage::GetCurrent().Add(secondRootActor);
 
@@ -2217,8 +2061,8 @@ int UtcDaliRenderTaskOnceNoSync03(void)
   application.SendNotification();
 
   // START PROCESS/RENDER                    Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, false ) );
 
   // CHANGE TO RENDER ONCE, RESOURCES BECOME NOT READY
   newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
@@ -2227,17 +2071,18 @@ int UtcDaliRenderTaskOnceNoSync03(void)
   ReloadImage(application, secondRootActor.GetImage());
   application.SendNotification(); //         Input,    Expected  Input,    Expected
 
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
   DALI_TEST_EQUALS( secondRootActor.GetImage().GetLoadingState(), Dali::ResourceLoading, TEST_LOCATION);
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
 
   // FINISH RESOURCE LOADING
   CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, true ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false  ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, true, true ) );
+  application.GetPlatform().ClearReadyResources();
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true  ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false, true ) );
   END_TEST;
 }
 #endif
@@ -2261,12 +2106,13 @@ int UtcDaliRenderTaskOnceNoSync05(void)
 
   CameraActor offscreenCameraActor = CameraActor::New();
   Stage::GetCurrent().Add( offscreenCameraActor );
-  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
   Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
   Integration::ResourceId imageRequestId = imageRequest->GetId();
   Integration::ResourceTypeId imageType  = imageRequest->GetType()->id;
   CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
   application.Render();
+  application.GetPlatform().ClearReadyResources();
 
   Stage::GetCurrent().Add(secondRootActor);
 
@@ -2277,25 +2123,19 @@ int UtcDaliRenderTaskOnceNoSync05(void)
   application.SendNotification();
 
   // START PROCESS/RENDER                    Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, false ) );
 
   // CHANGE TO RENDER ONCE,
   newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
   application.SendNotification();
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true  ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true,  false ) );
 
   newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
   application.SendNotification();
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true,  false ) );
   END_TEST;
 }
 
@@ -2320,12 +2160,13 @@ int UtcDaliRenderTaskOnceNoSync06(void)
 
   CameraActor offscreenCameraActor = CameraActor::New();
   Stage::GetCurrent().Add( offscreenCameraActor );
-  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
   Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
   Integration::ResourceId imageRequestId = imageRequest->GetId();
   Integration::ResourceTypeId imageType  = imageRequest->GetType()->id;
   CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
   application.Render();
+  application.GetPlatform().ClearReadyResources();
 
   Stage::GetCurrent().Add(secondRootActor);
 
@@ -2339,14 +2180,14 @@ int UtcDaliRenderTaskOnceNoSync06(void)
   application.SendNotification();
 
   // START PROCESS/RENDER                    Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, false ) );
 
   // CHANGE TO RENDER ONCE,
   newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
   application.SendNotification();
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true,  false ) );
 
   // Expect SetRefreshRate to have been called again
   // Prevent next finished signal calling refresh once again
@@ -2354,11 +2195,8 @@ int UtcDaliRenderTaskOnceNoSync06(void)
   connectionTracker.DisconnectAll();
   newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinished );
 
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true,  false ) );
   END_TEST;
 }
 
@@ -2382,12 +2220,13 @@ int UtcDaliRenderTaskOnceNoSync07(void)
 
   CameraActor offscreenCameraActor = CameraActor::New();
   Stage::GetCurrent().Add( offscreenCameraActor );
-  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
   Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
   Integration::ResourceId imageRequestId = imageRequest->GetId();
   Integration::ResourceTypeId imageType  = imageRequest->GetType()->id;
   CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
   application.Render();
+  application.GetPlatform().ClearReadyResources();
 
   Stage::GetCurrent().Add(secondRootActor);
 
@@ -2398,23 +2237,19 @@ int UtcDaliRenderTaskOnceNoSync07(void)
   application.SendNotification();
 
   // START PROCESS/RENDER                    Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, false ) );
 
   // CHANGE TO RENDER ONCE,
   newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
   application.SendNotification();
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true,  false ) );
 
   newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
   application.SendNotification();
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   finished, true,  false ) );
   END_TEST;
 }
 
@@ -2437,7 +2272,7 @@ int UtcDaliRenderTaskOnceNoSync08(void)
 
   CameraActor offscreenCameraActor = CameraActor::New();
   Stage::GetCurrent().Add( offscreenCameraActor );
-  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+  ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
   Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
   Integration::ResourceId imageRequestId = imageRequest->GetId();
   Stage::GetCurrent().Add(secondRootActor);
@@ -2449,24 +2284,20 @@ int UtcDaliRenderTaskOnceNoSync08(void)
   application.SendNotification();
 
   // START PROCESS/RENDER                    Input,     Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
 
   // CHANGE TO RENDER ONCE,
   newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
   application.SendNotification();
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) );
 
   FailImageLoad(application, imageRequestId); // Need to run Update again for this to complete
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) ); // nothing to draw
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, true  ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, false, true ) ); // nothing to draw
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,    finished, true,  false  ) );
+
   END_TEST;
 }
 
@@ -2491,7 +2322,7 @@ int UtcDaliRenderTaskOnceChain01(void)
 
   CameraActor offscreenCameraActor = CameraActor::New();
   Stage::GetCurrent().Add( offscreenCameraActor );
-  ImageActor firstRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+  ImageActor firstRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
   Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
   Integration::ResourceId imageRequestId = imageRequest->GetId();
   Integration::ResourceTypeId imageType  = imageRequest->GetType()->id;
@@ -2515,29 +2346,19 @@ int UtcDaliRenderTaskOnceChain01(void)
   application.SendNotification();
 
   // START PROCESS/RENDER                    Input,    Expected  Input,    Expected
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,  firstFinished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,  firstFinished, false, true ) );
   DALI_TEST_CHECK( secondFinished == false );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,  firstFinished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,  firstFinished, false, true ) );
   DALI_TEST_CHECK( secondFinished == false );
 
   CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,  firstFinished, false ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, true,  firstFinished, false, true ) );
   DALI_TEST_CHECK( secondFinished == false );
   application.GetPlatform().ClearReadyResources();
 
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,  firstFinished, true ) );
+  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,  firstFinished, true,  false ) );
   DALI_TEST_CHECK( secondFinished == true );
 
-  secondFinished = false;
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   firstFinished, false ) );
-  DALI_TEST_CHECK( secondFinished == false );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   firstFinished, false ) );
-  DALI_TEST_CHECK( secondFinished == false );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   firstFinished, false ) );
-  DALI_TEST_CHECK( secondFinished == false );
-  DALI_TEST_CHECK( UpdateRender(application, drawTrace, false,   firstFinished, false ) );
-  DALI_TEST_CHECK( secondFinished == false );
-
   END_TEST;
 }
 
@@ -2553,3 +2374,159 @@ int UtcDaliRenderTaskProperties(void)
   DALI_TEST_EQUALS( indices.size(), task.GetPropertyCount(), TEST_LOCATION );
   END_TEST;
 }
+
+int UtcDaliRenderTaskSetScreenToFrameBufferMappingActor(void)
+{
+  TestApplication application;
+  tet_infoline("Testing RenderTask::SetScreenToFrameBufferMappingActor ");
+
+  Stage stage = Stage::GetCurrent();
+  Size stageSize = stage.GetSize();
+  Actor mappingActor = Actor::New();
+  Vector2 scale( 0.6f, 0.75f);
+  Vector2 offset( stageSize.x*0.1f, stageSize.y*0.15f);
+  mappingActor.SetSize( stageSize * scale );
+  mappingActor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
+  mappingActor.SetPosition( offset.x, offset.y );
+  stage.Add( mappingActor );
+
+  Actor offscreenActor = Actor::New();
+  offscreenActor.SetSize( stageSize );
+  offscreenActor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
+  stage.Add( offscreenActor );
+
+  RenderTaskList taskList = stage.GetRenderTaskList();
+  RenderTask renderTask = taskList.CreateTask();
+  FrameBufferImage frameBufferImage =  FrameBufferImage::New(stageSize.width*scale.x, stageSize.height*scale.y, Pixel::A8, Image::NEVER);
+  renderTask.SetSourceActor( offscreenActor );
+  renderTask.SetExclusive( true );
+  renderTask.SetInputEnabled( true );
+  renderTask.SetTargetFrameBuffer( frameBufferImage );
+  renderTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
+  renderTask.SetScreenToFrameBufferMappingActor( mappingActor );
+  application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+
+  // Render and notify
+  application.SendNotification();
+  application.Render();
+  application.Render();
+  application.SendNotification();
+
+  Vector2 screenCoordinates( stageSize.x * 0.05f, stageSize.y * 0.05f );
+  Dali::HitTestAlgorithm::Results results;
+  DALI_TEST_CHECK( !results.actor );
+  DALI_TEST_EQUALS( Vector2::ZERO, results.actorCoordinates, 0.1f, TEST_LOCATION );
+  // miss expected, results not changed
+  DALI_TEST_CHECK( false == Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction ) );
+  DALI_TEST_CHECK( !results.actor );
+  DALI_TEST_EQUALS( Vector2::ZERO, results.actorCoordinates, 0.1f, TEST_LOCATION );
+
+  screenCoordinates.x = stageSize.x * 0.265f;
+  screenCoordinates.y = stageSize.y * 0.33f;
+  results.actor = Actor();
+  results.actorCoordinates = Vector2::ZERO;
+  // hit expected, results changed
+  DALI_TEST_CHECK( true == Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction ) );
+  DALI_TEST_CHECK( results.actor  == offscreenActor );
+  DALI_TEST_EQUALS( (screenCoordinates-offset)/scale , results.actorCoordinates, 0.1f, TEST_LOCATION );
+
+  screenCoordinates.x = stageSize.x * 0.435f;
+  screenCoordinates.y = stageSize.y * 0.52f;
+  // hit expected, results changed
+  DALI_TEST_CHECK( true == Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction ) );
+  DALI_TEST_CHECK( results.actor  == offscreenActor );
+  const Vector2 expectedCoordinates = (screenCoordinates-offset)/scale;
+  DALI_TEST_EQUALS( expectedCoordinates , results.actorCoordinates, 0.1f, TEST_LOCATION );
+
+  screenCoordinates.x = stageSize.x * 0.65f;
+  screenCoordinates.y = stageSize.y * 0.95f;
+  // miss expected, results not changed
+  DALI_TEST_CHECK( false == Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction ) );
+  DALI_TEST_CHECK( results.actor  == offscreenActor );
+  DALI_TEST_EQUALS( expectedCoordinates , results.actorCoordinates, 0.1f, TEST_LOCATION );
+  END_TEST;
+}
+
+int UtcDaliRenderTaskFinishInvisibleSourceActor(void)
+{
+  TestApplication application;
+
+  tet_infoline("Testing RenderTask::SignalFinished()");
+
+  application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+  TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
+
+  CameraActor offscreenCameraActor = CameraActor::New();
+
+  Stage::GetCurrent().Add( offscreenCameraActor );
+
+  BufferImage image = BufferImage::New( 10, 10 );
+  ImageActor rootActor = ImageActor::New( image );
+  rootActor.SetSize( 10, 10 );
+  rootActor.SetVisible(false);
+  Stage::GetCurrent().Add( rootActor );
+
+  RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+  NativeImageInterfacePtr testNativeImagePtr = TestNativeImage::New(10, 10);
+  FrameBufferImage frameBufferImage = FrameBufferImage::New( *testNativeImagePtr.Get() );
+
+  // Flush all outstanding messages
+  application.SendNotification();
+  application.Render();
+
+  RenderTask newTask = taskList.CreateTask();
+  newTask.SetCameraActor( offscreenCameraActor );
+  newTask.SetSourceActor( rootActor );
+  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 );
+  newTask.SetTargetFrameBuffer( frameBufferImage );
+
+  // Framebuffer doesn't actually get created until Connected, i.e. by previous line
+
+  bool finished = false;
+  RenderTaskFinished renderTaskFinished( finished );
+  newTask.FinishedSignal().Connect( &application, renderTaskFinished );
+
+  // Flush the queue and render.
+  application.SendNotification();
+
+  // 1 render to process render task, then wait for sync before finished msg is sent
+  // from update to the event thread.
+
+  application.Render();
+  application.SendNotification();
+  DALI_TEST_CHECK( !finished );
+
+  Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
+  DALI_TEST_CHECK( lastSyncObj != NULL );
+
+  application.Render();
+  DALI_TEST_EQUALS( (application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
+  application.SendNotification();
+  DALI_TEST_CHECK( !finished );
+
+  application.Render();
+  DALI_TEST_EQUALS( (application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
+  application.SendNotification();
+  DALI_TEST_CHECK( ! finished );
+
+  sync.SetObjectSynced( lastSyncObj, true );
+
+  application.Render();
+  application.SendNotification();
+  DALI_TEST_CHECK( !finished );
+
+  application.Render();
+  application.SendNotification();
+  DALI_TEST_CHECK( finished );
+  finished = false;
+
+  application.Render(); // Double check no more finished signal
+  application.SendNotification();
+  DALI_TEST_CHECK( ! finished );
+
+  END_TEST;
+}