2 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
21 #include <dali/public-api/dali-core.h>
22 #include <dali-test-suite-utils.h>
23 #include <dali/integration-api/debug.h>
25 #define BOOLSTR(x) ((x)?"T":"F")
30 void utc_dali_render_task_startup(void)
32 test_return_value = TET_UNDEF;
35 void utc_dali_render_task_cleanup(void)
37 test_return_value = TET_PASS;
40 namespace // unnamed namespace
43 class TestNativeImage : public NativeImage
48 TestNativeImage(int width, int height)
53 virtual bool GlExtensionCreate() {return true;};
56 * Destroy the GL resource for the NativeImage.
57 * e.g. For the EglImageKHR extension, this corresponds to calling eglDestroyImageKHR()
58 * @pre There is a GL context for the current thread.
60 virtual void GlExtensionDestroy() {};
63 * Use the NativeImage as a texture for rendering
64 * @pre There is a GL context for the current thread.
65 * @return A GL error code
67 virtual unsigned int TargetTexture() {return 0;};
70 * Called in each NativeTexture::Bind() call to allow implementation specific operations.
71 * The correct texture sampler has already been bound before the function gets called.
72 * @pre glAbstraction is being used by context in current thread
74 virtual void PrepareTexture() {}
77 * Returns the width of the NativeImage
80 virtual unsigned int GetWidth() const {return mWidth;}
83 * Returns the height of the NativeImage
86 virtual unsigned int GetHeight() const {return mHeight;}
89 * Returns the internal pixel NativeImage::PixelFormat of the NativeImage
90 * @return pixel format
92 virtual Pixel::Format GetPixelFormat() const { return Pixel::RGBA8888; }
98 const int RENDER_FRAME_INTERVAL = 16; ///< Duration of each frame in ms. (at approx 60FPS)
101 * Simulate time passed by.
103 * @note this will always process at least 1 frame (1/60 sec)
105 * @param application Test application instance
106 * @param duration Time to pass in milliseconds.
107 * @return The actual time passed in milliseconds
109 int Wait(TestApplication& application, int duration = 0)
113 for(int i = 0; i <= ( duration / RENDER_FRAME_INTERVAL); i++)
115 application.SendNotification();
116 application.Render(RENDER_FRAME_INTERVAL);
117 time += RENDER_FRAME_INTERVAL;
123 struct RenderTaskFinished
125 RenderTaskFinished( bool& finished )
126 : finished( finished )
130 void operator()( RenderTask& renderTask )
138 struct RenderTaskFinishedRemoveSource
140 RenderTaskFinishedRemoveSource( bool& finished )
141 : finished( finished ),
146 void operator()( RenderTask& renderTask )
148 DALI_TEST_CHECK(finishedOnce == false);
151 Actor srcActor = renderTask.GetSourceActor();
152 UnparentAndReset(srcActor);
159 struct RenderTaskFinishedRenderAgain
161 RenderTaskFinishedRenderAgain( bool& finished )
162 : finished( finished ),
167 void operator()( RenderTask& renderTask )
169 DALI_TEST_CHECK(finishedOnce == false);
172 renderTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
180 bool TestScreenToFrameBufferFunction( Vector2& coordinates )
182 coordinates = coordinates + Vector2( 1, 2 );
187 ImageActor CreateLoadingImage(TestApplication& application, std::string filename, Image::LoadPolicy loadPolicy, Image::ReleasePolicy releasePolicy)
189 Image image = Image::New(filename, loadPolicy, releasePolicy);
190 DALI_TEST_CHECK( image );
191 application.SendNotification();
192 application.Render(16);
193 DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
194 ImageActor actor = ImageActor::New(image);
195 actor.SetSize( 80, 80 );
196 application.SendNotification();
197 application.Render(16);
201 void CompleteImageLoad(TestApplication& application, Integration::ResourceId resourceId, Integration::ResourceTypeId requestType)
203 std::vector<GLuint> ids;
205 application.GetGlAbstraction().SetNextTextureIds( ids );
207 Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
208 Integration::ResourcePointer resource(bitmap);
209 bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
211 application.GetPlatform().SetResourceLoaded(resourceId, requestType, resource);
214 void FailImageLoad(TestApplication& application, Integration::ResourceId resourceId )
216 application.GetPlatform().SetResourceLoadFailed(resourceId, Integration::FailureUnknown);
219 void ReloadImage(TestApplication& application, Image image)
221 application.GetPlatform().ClearReadyResources();
222 application.GetPlatform().DiscardRequest();
223 application.GetPlatform().ResetTrace();
224 application.GetPlatform().SetClosestImageSize(Vector2(80.0f, 80.0f)); // Ensure reload is called.
228 RenderTask CreateRenderTask(TestApplication& application,
229 CameraActor offscreenCamera,
230 Actor rootActor, // Reset default render task to point at this actor
231 Actor secondRootActor, // Source actor
232 unsigned int refreshRate,
235 // Change main render task to use a different root
236 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
237 taskList.GetTask(0u).SetSourceActor( rootActor );
239 FrameBufferImage frameBufferImage;
242 NativeImagePtr testNativeImagePtr = new TestNativeImage(10, 10);
243 frameBufferImage= FrameBufferImage::New( *testNativeImagePtr.Get() );
247 frameBufferImage = FrameBufferImage::New( 10, 10 );
250 // Don't draw output framebuffer
252 RenderTask newTask = taskList.CreateTask();
253 newTask.SetCameraActor( offscreenCamera );
254 newTask.SetSourceActor( secondRootActor );
255 newTask.SetInputEnabled( false );
256 newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
257 newTask.SetClearEnabled( true );
258 newTask.SetExclusive( true );
259 newTask.SetRefreshRate( refreshRate );
260 newTask.SetTargetFrameBuffer( frameBufferImage );
264 bool UpdateRender(TestApplication& application, TraceCallStack& callStack, bool testDrawn, bool& finishedSig, bool testFinished, bool testKeepUpdating )
268 application.Render(16);
269 application.SendNotification();
271 bool sigPassed = false;
274 sigPassed = finishedSig;
278 sigPassed = ! finishedSig;
281 bool drawResult = callStack.FindMethod("DrawElements") || callStack.FindMethod("DrawArrays");
283 bool drawPassed = false;
286 drawPassed = drawResult;
290 drawPassed = !drawResult;
293 bool keepUpdating = (application.GetUpdateStatus() != 0);
294 bool keepUpdatingPassed = false;
295 if( testKeepUpdating )
297 keepUpdatingPassed = keepUpdating;
301 keepUpdatingPassed = !keepUpdating;
304 bool result = (sigPassed && drawPassed && keepUpdatingPassed);
306 tet_printf("UpdateRender: Expected: Draw:%s Signal:%s Keep Updating: %s Actual: Draw:%s Signal:%s KeepUpdating: %s %s\n",
307 BOOLSTR(testDrawn), BOOLSTR(testFinished), BOOLSTR(testKeepUpdating),
308 BOOLSTR(drawResult), BOOLSTR(finishedSig), BOOLSTR(keepUpdating),
309 result ? "Passed":"Failed");
314 // The functor to be used in the hit-test algorithm to check whether the actor is hittable.
315 bool IsActorHittableFunction(Actor actor, Dali::HitTestAlgorithm::TraverseType type)
317 bool hittable = false;
321 case Dali::HitTestAlgorithm::CHECK_ACTOR:
323 // Check whether the actor is visible and not fully transparent.
324 if( actor.IsVisible()
325 && actor.GetCurrentWorldColor().a > 0.01f) // not FULLY_TRANSPARENT
332 case Dali::HitTestAlgorithm::DESCEND_ACTOR_TREE:
334 if( actor.IsVisible() ) // Actor is visible, if not visible then none of its children are visible.
349 } // unnamed namespace
352 /****************************************************************************************************/
353 /****************************************************************************************************/
354 /******************************** TEST CASES BELOW **********************************************/
355 /****************************************************************************************************/
356 /****************************************************************************************************/
358 int UtcDaliRenderTaskDownCast(void)
360 TestApplication application;
362 tet_infoline("Testing RenderTask::DownCast()");
364 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
366 BaseHandle base = taskList.GetTask( 0u );
367 DALI_TEST_CHECK( base );
369 RenderTask task = RenderTask::DownCast( base );
370 DALI_TEST_CHECK( task );
372 // Try calling a method
373 DALI_TEST_CHECK( task.GetSourceActor() );
377 int UtcDaliRenderTaskSetSourceActor(void)
379 TestApplication application;
381 tet_infoline("Testing RenderTask::SetSourceActor()");
383 Stage stage = Stage::GetCurrent();
385 const std::vector<GLuint>& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 );
387 RenderTaskList taskList = stage.GetRenderTaskList();
389 RenderTask task = taskList.GetTask( 0u );
391 Actor actor = task.GetSourceActor();
392 DALI_TEST_CHECK( actor );
394 std::vector<GLuint> ids;
396 application.GetGlAbstraction().SetNextTextureIds( ids );
398 BitmapImage img = BitmapImage::New( 1,1 );
399 ImageActor newActor = ImageActor::New( img );
400 newActor.SetSize(1,1);
401 stage.Add( newActor );
403 Actor nonRenderableActor = Actor::New();
404 stage.Add( nonRenderableActor );
406 // Stop the newActor from being rendered by changing the source actor
407 DALI_TEST_CHECK( nonRenderableActor );
408 task.SetSourceActor( nonRenderableActor );
409 DALI_TEST_CHECK( task.GetSourceActor() != actor );
410 DALI_TEST_CHECK( task.GetSourceActor() == nonRenderableActor );
412 // Update & Render nothing!
413 application.GetGlAbstraction().ClearBoundTextures();
414 application.SendNotification();
415 application.Render();
417 // Check that nothing was rendered
418 DALI_TEST_EQUALS( boundTextures.size(), 0u, TEST_LOCATION );
420 // Set newActor as the new source Actor
421 task.SetSourceActor( newActor );
422 DALI_TEST_CHECK( task.GetSourceActor() != actor );
423 DALI_TEST_CHECK( task.GetSourceActor() == newActor );
425 // Update & Render the newActor
426 application.GetGlAbstraction().ClearBoundTextures();
427 application.SendNotification();
428 application.Render();
430 // Check that the newActor was rendered
431 DALI_TEST_EQUALS( boundTextures.size(), 1u, TEST_LOCATION );
432 if ( boundTextures.size() )
434 DALI_TEST_EQUALS( boundTextures[0], 7u, TEST_LOCATION );
439 int UtcDaliRenderTaskSetSourceActorOffStage(void)
441 TestApplication application;
443 tet_infoline("Testing RenderTask::SetSourceActor (on/off stage testing)");
445 Stage stage = Stage::GetCurrent();
447 const std::vector<GLuint>& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 );
449 RenderTaskList taskList = stage.GetRenderTaskList();
451 RenderTask task = taskList.GetTask( 0u );
453 Actor actor = task.GetSourceActor();
454 DALI_TEST_CHECK( actor );
456 std::vector<GLuint> ids;
457 GLuint expectedTextureId( 3 );
458 ids.push_back( expectedTextureId );
459 application.GetGlAbstraction().SetNextTextureIds( ids );
461 BitmapImage img = BitmapImage::New( 1,1 );
462 ImageActor newActor = ImageActor::New( img );
463 newActor.SetSize(1,1);
464 task.SetSourceActor( newActor );
465 // Don't add newActor to stage yet
467 // Update & Render with the actor initially off-stage
468 application.GetGlAbstraction().ClearBoundTextures();
469 application.SendNotification();
470 application.Render();
472 // Check that nothing was rendered
473 DALI_TEST_EQUALS( boundTextures.size(), 0u, TEST_LOCATION );
476 stage.Add( newActor );
478 // Update & Render with the actor on-stage
479 application.GetGlAbstraction().ClearBoundTextures();
480 application.SendNotification();
481 application.Render();
483 // Check that the newActor was rendered
484 DALI_TEST_EQUALS( boundTextures.size(), 1u, TEST_LOCATION );
485 if ( boundTextures.size() )
487 DALI_TEST_EQUALS( boundTextures[0], expectedTextureId, TEST_LOCATION );
490 // Now remove from stage
491 stage.Remove( newActor );
493 // Update & Render with the actor off-stage
494 application.GetGlAbstraction().ClearBoundTextures();
495 application.SendNotification();
496 application.Render();
500 int UtcDaliRenderTaskSetSourceActorEmpty(void)
502 TestApplication application;
504 tet_infoline("Testing RenderTask::SetSourceActor (empty handle case)");
506 Stage stage = Stage::GetCurrent();
508 const std::vector<GLuint>& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 );
510 RenderTaskList taskList = stage.GetRenderTaskList();
512 RenderTask task = taskList.GetTask( 0u );
514 Actor actor = task.GetSourceActor();
515 DALI_TEST_CHECK( actor );
517 std::vector<GLuint> ids;
518 GLuint expectedTextureId( 5 );
519 ids.push_back( expectedTextureId );
520 application.GetGlAbstraction().SetNextTextureIds( ids );
522 BitmapImage img = BitmapImage::New( 1,1 );
523 ImageActor newActor = ImageActor::New( img );
524 newActor.SetSize(1,1);
525 stage.Add( newActor );
527 Actor nonRenderableActor = Actor::New();
528 stage.Add( nonRenderableActor );
530 // Set with empty handle
531 task.SetSourceActor( Actor() );
532 DALI_TEST_CHECK( ! task.GetSourceActor() );
534 // Update & Render nothing!
535 application.GetGlAbstraction().ClearBoundTextures();
536 application.SendNotification();
537 application.Render();
539 // Check that nothing was rendered
540 DALI_TEST_EQUALS( boundTextures.size(), 0u, TEST_LOCATION );
542 // Set with non-empty handle
543 task.SetSourceActor( newActor );
544 DALI_TEST_CHECK( task.GetSourceActor() == newActor );
546 // Update & Render the newActor
547 application.GetGlAbstraction().ClearBoundTextures();
548 application.SendNotification();
549 application.Render();
551 // Check that the newActor was rendered
552 DALI_TEST_EQUALS( boundTextures.size(), 1u, TEST_LOCATION );
553 if ( boundTextures.size() )
555 DALI_TEST_EQUALS( boundTextures[0], expectedTextureId, TEST_LOCATION );
560 int UtcDaliRenderTaskGetSourceActor(void)
562 TestApplication application;
564 tet_infoline("Testing RenderTask::GetSourceActor()");
566 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
568 RenderTask task = taskList.GetTask( 0u );
570 Actor actor = task.GetSourceActor();
571 DALI_TEST_CHECK( actor );
573 // By default the entire scene should be rendered
574 Actor root = Stage::GetCurrent().GetLayer( 0 );
575 DALI_TEST_CHECK( root == actor );
579 int UtcDaliRenderTaskSetExclusive(void)
581 TestApplication application;
583 tet_infoline("Testing RenderTask::SetExclusive()");
585 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
587 // Manipulate the GenTextures behaviour, to identify different ImageActors
589 std::vector<GLuint> ids;
590 ids.push_back( 8 ); // 8 = actor1
591 ids.push_back( 9 ); // 9 = actor2
592 ids.push_back( 10 ); // 10 = actor3
593 application.GetGlAbstraction().SetNextTextureIds( ids );
595 BitmapImage img1 = BitmapImage::New( 1,1 );
596 ImageActor actor1 = ImageActor::New( img1 );
598 Stage::GetCurrent().Add( actor1 );
600 // Update & Render actor1
601 application.SendNotification();
602 application.Render();
604 // Check that the actor1 was rendered
605 const std::vector<GLuint>& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 );
606 DALI_TEST_EQUALS( boundTextures.size(), 1u, TEST_LOCATION );
608 if ( boundTextures.size() )
610 DALI_TEST_EQUALS( boundTextures[0], 8u/*unique to actor1*/, TEST_LOCATION );
613 BitmapImage img2 = BitmapImage::New( 1,1 );
614 ImageActor actor2 = ImageActor::New( img2 );
617 // Force actor2 to be rendered before actor1
618 Layer layer = Layer::New();
619 Stage::GetCurrent().Add( layer );
621 layer.LowerToBottom();
624 application.GetGlAbstraction().ClearBoundTextures();
625 application.SendNotification();
626 application.Render();
628 // Check that the actors were rendered
629 DALI_TEST_EQUALS( boundTextures.size(), 2u, TEST_LOCATION );
631 if ( boundTextures.size() )
633 DALI_TEST_EQUALS( boundTextures[0], 9u/*unique to actor2*/, TEST_LOCATION );
634 DALI_TEST_EQUALS( boundTextures[1], 8u/*unique to actor1*/, TEST_LOCATION );
637 BitmapImage img3 = BitmapImage::New( 1,1 );
638 ImageActor actor3 = ImageActor::New( img3 );
641 // Force actor3 to be rendered before actor2
642 layer = Layer::New();
643 Stage::GetCurrent().Add( layer );
645 layer.LowerToBottom();
647 // Update & Render all actors
648 application.GetGlAbstraction().ClearBoundTextures();
649 application.SendNotification();
650 application.Render();
652 // Check that the actors were rendered
653 DALI_TEST_EQUALS( boundTextures.size(), 3u, TEST_LOCATION );
655 if ( boundTextures.size() )
657 DALI_TEST_EQUALS( boundTextures[0], 10u/*unique to actor3*/, TEST_LOCATION );
658 DALI_TEST_EQUALS( boundTextures[1], 9u/*unique to actor2*/, TEST_LOCATION );
659 DALI_TEST_EQUALS( boundTextures[2], 8u/*unique to actor1*/, TEST_LOCATION );
662 // Both actors are now connected to the root node
663 // Setup 2 render-tasks - the first will render from the root-node, and the second from actor2
665 // Not exclusive is the default
666 RenderTask task1 = taskList.GetTask( 0u );
667 DALI_TEST_CHECK( false == task1.IsExclusive() );
669 RenderTask task2 = taskList.CreateTask();
670 DALI_TEST_CHECK( false == task2.IsExclusive() );
671 task2.SetSourceActor( actor2 );
673 // Task1 should render all actors, and task 2 should render only actor2
675 application.GetGlAbstraction().ClearBoundTextures();
676 application.SendNotification();
677 application.Render();
679 DALI_TEST_EQUALS( boundTextures.size(), 4u, TEST_LOCATION );
681 if ( boundTextures.size() == 4 )
683 // Test that task 1 renders actor3, then actor2 & then actor1
684 DALI_TEST_CHECK( boundTextures[0] == 10u );
685 DALI_TEST_CHECK( boundTextures[1] == 9u );
686 DALI_TEST_CHECK( boundTextures[2] == 8u );
688 // Test that task 2 renders actor2
689 DALI_TEST_EQUALS( boundTextures[3], 9u, TEST_LOCATION );
692 // Make actor2 exclusive to task2
694 task2.SetExclusive( true );
695 DALI_TEST_CHECK( true == task2.IsExclusive() );
697 // Task1 should render only actor1, and task 2 should render only actor2
699 application.GetGlAbstraction().ClearBoundTextures();
700 application.SendNotification();
701 application.Render();
703 DALI_TEST_EQUALS( boundTextures.size(), 3u, TEST_LOCATION );
704 if ( boundTextures.size() == 3 )
706 // Test that task 1 renders actor3 & actor1
707 DALI_TEST_CHECK( boundTextures[0] == 10u );
708 DALI_TEST_CHECK( boundTextures[1] == 8u );
710 // Test that task 2 renders actor2
711 DALI_TEST_CHECK( boundTextures[2] == 9u );
716 int UtcDaliRenderTaskIsExclusive(void)
718 TestApplication application;
720 tet_infoline("Testing RenderTask::IsExclusive()");
722 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
724 // Not exclusive is the default
725 RenderTask task = taskList.GetTask( 0u );
726 DALI_TEST_CHECK( false == task.IsExclusive() );
728 RenderTask newTask = taskList.CreateTask();
729 DALI_TEST_CHECK( false == newTask.IsExclusive() );
733 int UtcDaliRenderTaskSetInputEnabled(void)
735 TestApplication application;
737 tet_infoline("Testing RenderTask::SetInputEnabled()");
739 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
741 // Input is enabled by default
742 RenderTask task = taskList.GetTask( 0u );
743 DALI_TEST_CHECK( true == task.GetInputEnabled() );
745 task.SetInputEnabled( false );
746 DALI_TEST_CHECK( false == task.GetInputEnabled() );
748 task.SetInputEnabled( true );
749 DALI_TEST_CHECK( true == task.GetInputEnabled() );
753 int UtcDaliRenderTaskGetInputEnabled(void)
755 TestApplication application;
757 tet_infoline("Testing RenderTask::GetInputEnabled()");
759 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
761 // Input is enabled by default
762 RenderTask task = taskList.GetTask( 0u );
763 DALI_TEST_CHECK( true == task.GetInputEnabled() );
765 RenderTask newTask = taskList.CreateTask();
766 DALI_TEST_CHECK( true == newTask.GetInputEnabled() );
770 int UtcDaliRenderTaskSetCameraActor(void)
772 TestApplication application;
774 tet_infoline("Testing RenderTask::SetCameraActor()");
776 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
778 RenderTask task = taskList.GetTask( 0u );
780 Actor actor = task.GetCameraActor();
781 DALI_TEST_CHECK( actor );
783 CameraActor newActor = CameraActor::New();
784 DALI_TEST_CHECK( newActor );
786 task.SetCameraActor( newActor );
787 DALI_TEST_CHECK( task.GetCameraActor() != actor );
788 DALI_TEST_CHECK( task.GetCameraActor() == newActor );
792 int UtcDaliRenderTaskGetCameraActor(void)
794 TestApplication application;
796 tet_infoline("Testing RenderTask::GetCameraActor()");
798 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
800 RenderTask task = taskList.GetTask( 0u );
802 Actor actor = task.GetCameraActor();
803 DALI_TEST_CHECK( actor );
805 RenderTask newTask = taskList.CreateTask();
806 DALI_TEST_CHECK( actor == newTask.GetCameraActor() );
810 int UtcDaliRenderTaskSetTargetFrameBuffer(void)
812 TestApplication application;
814 tet_infoline("Testing RenderTask::SetTargetFrameBuffer()");
816 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
818 RenderTask task = taskList.GetTask( 0u );
820 // By default render-tasks do not render off-screen
821 FrameBufferImage image = task.GetTargetFrameBuffer();
822 DALI_TEST_CHECK( !image );
824 FrameBufferImage newImage = FrameBufferImage::New();
826 task.SetTargetFrameBuffer( newImage );
827 DALI_TEST_CHECK( task.GetTargetFrameBuffer() == newImage );
831 int UtcDaliRenderTaskGetTargetFrameBuffer(void)
833 TestApplication application;
835 tet_infoline("Testing RenderTask::GetTargetFrameBuffer()");
837 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
839 RenderTask task = taskList.GetTask( 0u );
841 // By default render-tasks do not render off-screen
842 FrameBufferImage image = task.GetTargetFrameBuffer();
843 DALI_TEST_CHECK( !image );
845 RenderTask newTask = taskList.CreateTask();
846 DALI_TEST_CHECK( !newTask.GetTargetFrameBuffer() );
850 int UtcDaliRenderTaskSetScreenToFrameBufferFunction(void)
852 TestApplication application;
854 tet_infoline("Testing RenderTask::SetScreenToFrameBufferFunction()");
856 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
858 RenderTask task = taskList.GetTask( 0u );
860 task.SetScreenToFrameBufferFunction( TestScreenToFrameBufferFunction );
862 Vector2 coordinates( 5, 10 );
863 Vector2 convertedCoordinates( 6, 12 ); // + Vector(1, 2)
865 RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction();
866 DALI_TEST_CHECK( func( coordinates ) );
867 DALI_TEST_CHECK( coordinates == convertedCoordinates );
869 task.SetScreenToFrameBufferFunction( RenderTask::FULLSCREEN_FRAMEBUFFER_FUNCTION );
870 func = task.GetScreenToFrameBufferFunction();
871 DALI_TEST_CHECK( func( coordinates ) );
873 task.SetScreenToFrameBufferFunction( RenderTask::DEFAULT_SCREEN_TO_FRAMEBUFFER_FUNCTION );
874 func = task.GetScreenToFrameBufferFunction();
875 DALI_TEST_CHECK( ! func( coordinates ) );
879 int UtcDaliRenderTaskGetScreenToFrameBufferFunction(void)
881 TestApplication application;
883 tet_infoline("Testing RenderTask::GetScreenToFrameBufferFunction()");
885 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
887 RenderTask task = taskList.GetTask( 0u );
889 Vector2 originalCoordinates( 5, 10 );
890 Vector2 coordinates( 5, 10 );
892 RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction();
893 DALI_TEST_CHECK( !func( coordinates ) ); // conversion should fail by default
894 DALI_TEST_CHECK( coordinates == originalCoordinates ); // coordinates should not be modified
899 int UtcDaliRenderTaskGetScreenToFrameBufferMappingActor(void)
901 TestApplication application;
902 tet_infoline("Testing RenderTask::GetScreenToFrameBufferMappingActor ");
904 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
905 RenderTask renderTask = taskList.CreateTask();
906 Actor mappingActor = Actor::New();
907 renderTask.SetScreenToFrameBufferMappingActor(mappingActor);
909 DALI_TEST_CHECK( mappingActor == renderTask.GetScreenToFrameBufferMappingActor() );
913 int UtcDaliRenderTaskSetViewport(void)
915 TestApplication application;
917 tet_infoline("Testing RenderTask::SetViewport()");
919 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
921 RenderTask task = taskList.GetTask( 0u );
923 Viewport viewport = task.GetViewport();
925 // By default the viewport should match the stage width/height
927 Vector2 stageSize = Stage::GetCurrent().GetSize();
928 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
929 DALI_TEST_CHECK( viewport == expectedViewport );
931 Viewport newViewport( 0, 0, stageSize.width * 0.5f, stageSize.height * 0.5f );
932 task.SetViewport( newViewport );
934 // Update (viewport is a property)
935 application.SendNotification();
936 application.Render();
938 DALI_TEST_CHECK( task.GetViewport() == newViewport );
942 int UtcDaliRenderTaskGetViewport(void)
944 TestApplication application;
946 tet_infoline("Testing RenderTask::GetViewport()");
948 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
950 RenderTask task = taskList.GetTask( 0u );
952 Viewport viewport = task.GetViewport();
954 // By default the viewport should match the stage width/height
956 Vector2 stageSize = Stage::GetCurrent().GetSize();
957 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
958 DALI_TEST_CHECK( viewport == expectedViewport );
960 RenderTask newTask = taskList.CreateTask();
961 DALI_TEST_CHECK( newTask.GetViewport() == expectedViewport );
965 int UtcDaliRenderTaskSetViewportPosition(void)
967 TestApplication application;
969 tet_infoline("Testing RenderTask::SetViewportPosition()");
971 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
973 RenderTask task = taskList.GetTask( 0u );
975 Viewport viewport = task.GetViewport();
977 // By default the viewport should match the stage width/height
979 Vector2 stageSize = Stage::GetCurrent().GetSize();
980 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
981 DALI_TEST_CHECK( viewport == expectedViewport );
984 Vector2 newPosition(25.0f, 50.0f);
985 task.SetViewportPosition( newPosition );
987 // Update (viewport is a property)
988 application.SendNotification();
989 application.Render();
991 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition, Math::MACHINE_EPSILON_1, TEST_LOCATION );
993 // Set by Property test
994 Vector2 newPosition2(32.0f, 32.0f);
995 task.SetProperty( RenderTask::VIEWPORT_POSITION, newPosition2 );
998 application.SendNotification();
999 application.Render();
1001 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition2, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1003 Vector2 newPosition3(64.0f, 0.0f);
1004 Animation animation = Animation::New(1.0f);
1005 animation.AnimateTo( Property( task, RenderTask::VIEWPORT_POSITION ), newPosition3, AlphaFunctions::Linear );
1008 // Perform 1000ms worth of updates at which point animation should have completed.
1009 Wait(application, 1000);
1010 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1014 int UtcDaliRenderTaskSetViewportSize(void)
1016 TestApplication application;
1018 tet_infoline("Testing RenderTask::SetViewportSize()");
1020 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1022 RenderTask task = taskList.GetTask( 0u );
1024 Viewport viewport = task.GetViewport();
1026 // By default the viewport should match the stage width/height
1028 Vector2 stageSize = Stage::GetCurrent().GetSize();
1029 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
1030 DALI_TEST_CHECK( viewport == expectedViewport );
1032 Vector2 newSize(128.0f, 64.0f);
1033 task.SetViewportSize( newSize );
1035 // Update (viewport is a property)
1036 application.SendNotification();
1037 application.Render();
1039 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1041 // Set by Property test
1042 Vector2 newSize2(50.0f, 50.0f);
1043 task.SetProperty( RenderTask::VIEWPORT_SIZE, newSize2 );
1046 application.SendNotification();
1047 application.Render();
1049 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize2, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1051 Vector2 newSize3(10.0f, 10.0f);
1052 Animation animation = Animation::New(1.0f);
1053 animation.AnimateTo( Property( task, RenderTask::VIEWPORT_SIZE ), newSize3, AlphaFunctions::Linear );
1056 // Perform 1000ms worth of updates at which point animation should have completed.
1057 Wait(application, 1000);
1058 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1063 int UtcDaliRenderTaskSetClearColor(void)
1065 TestApplication application;
1067 tet_infoline("Testing RenderTask::SetClearColor()");
1069 Vector4 testColor( 1.0f, 2.0f, 3.0f, 4.0f );
1070 Vector4 testColor2( 5.0f, 6.0f, 7.0f, 8.0f );
1072 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1074 RenderTask task = taskList.GetTask( 0u );
1075 DALI_TEST_CHECK( task.GetClearColor() != testColor );
1077 task.SetClearColor( testColor );
1082 DALI_TEST_EQUALS( task.GetClearColor(), testColor, TEST_LOCATION );
1084 task.SetProperty( RenderTask::CLEAR_COLOR, testColor2 );
1089 DALI_TEST_EQUALS( task.GetClearColor(), testColor2, TEST_LOCATION );
1093 int UtcDaliRenderTaskGetClearColor(void)
1095 TestApplication application;
1097 tet_infoline("Testing RenderTask::GetClearColor()");
1099 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1100 RenderTask task = taskList.GetTask( 0u );
1101 DALI_TEST_EQUALS( task.GetClearColor(), RenderTask::DEFAULT_CLEAR_COLOR, TEST_LOCATION );
1105 int UtcDaliRenderTaskSetClearEnabled(void)
1107 TestApplication application;
1109 tet_infoline("Testing RenderTask::SetClearEnabled()");
1111 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1113 RenderTask task = taskList.GetTask( 0u );
1114 DALI_TEST_CHECK( !task.GetClearEnabled() ); // defaults to false
1116 task.SetClearEnabled( true );
1117 DALI_TEST_EQUALS( task.GetClearEnabled(), true, TEST_LOCATION );
1119 task.SetClearEnabled( false );
1120 DALI_TEST_EQUALS( task.GetClearEnabled(), false, TEST_LOCATION );
1124 int UtcDaliRenderTaskGetClearEnabled(void)
1126 TestApplication application;
1128 tet_infoline("Testing RenderTask::GetClearEnabled()");
1130 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1132 RenderTask task = taskList.GetTask( 0u );
1133 DALI_TEST_CHECK( !task.GetClearEnabled() ); // defaults to false
1137 int UtcDaliRenderTaskSetRefreshRate(void)
1139 TestApplication application;
1141 tet_infoline("Testing RenderTask::SetRefreshRate()");
1143 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1145 // By default tasks will be processed every frame
1146 RenderTask task = taskList.GetTask( 0u );
1147 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
1149 task.SetRefreshRate( 2u ); // every-other frame
1150 DALI_TEST_CHECK( 2u == task.GetRefreshRate() );
1152 task.SetRefreshRate( RenderTask::REFRESH_ALWAYS );
1153 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
1157 int UtcDaliRenderTaskGetRefreshRate(void)
1159 TestApplication application;
1161 tet_infoline("Testing RenderTask::GetRefreshRate()");
1163 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1165 // By default tasks will be processed every frame
1166 RenderTask task = taskList.GetTask( 0u );
1167 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
1169 RenderTask newTask = taskList.CreateTask();
1170 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == newTask.GetRefreshRate() );
1174 int UtcDaliRenderTaskSignalFinished(void)
1176 TestApplication application;
1178 tet_infoline("Testing RenderTask::SignalFinished()");
1180 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1181 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1183 CameraActor offscreenCameraActor = CameraActor::New();
1185 Stage::GetCurrent().Add( offscreenCameraActor );
1187 BitmapImage image = BitmapImage::New( 10, 10 );
1188 ImageActor rootActor = ImageActor::New( image );
1189 rootActor.SetSize( 10, 10 );
1190 Stage::GetCurrent().Add( rootActor );
1192 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1193 NativeImagePtr testNativeImagePtr = new TestNativeImage(10, 10);
1194 FrameBufferImage frameBufferImage = FrameBufferImage::New( *testNativeImagePtr.Get() );
1196 // Flush all outstanding messages
1197 application.SendNotification();
1198 application.Render();
1200 RenderTask newTask = taskList.CreateTask();
1201 newTask.SetCameraActor( offscreenCameraActor );
1202 newTask.SetSourceActor( rootActor );
1203 newTask.SetInputEnabled( false );
1204 newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
1205 newTask.SetClearEnabled( true );
1206 newTask.SetExclusive( true );
1207 newTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
1208 newTask.SetTargetFrameBuffer( frameBufferImage );
1210 // Framebuffer doesn't actually get created until Connected, i.e. by previous line
1212 bool finished = false;
1213 RenderTaskFinished renderTaskFinished( finished );
1214 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1216 // Flush the queue and render.
1217 application.SendNotification();
1219 // 1 render to process render task, then wait for sync before finished msg is sent
1220 // from update to the event thread.
1222 application.Render();
1223 application.SendNotification();
1224 DALI_TEST_CHECK( !finished );
1226 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1227 DALI_TEST_CHECK( lastSyncObj != NULL );
1229 application.Render();
1230 DALI_TEST_EQUALS( (application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
1231 application.SendNotification();
1232 DALI_TEST_CHECK( !finished );
1234 application.Render();
1235 DALI_TEST_EQUALS( (application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
1236 application.SendNotification();
1237 DALI_TEST_CHECK( ! finished );
1239 sync.SetObjectSynced( lastSyncObj, true );
1241 application.Render();
1242 application.SendNotification();
1243 DALI_TEST_CHECK( !finished );
1245 application.Render();
1246 application.SendNotification();
1247 DALI_TEST_CHECK( finished );
1250 application.Render(); // Double check no more finished signal
1251 application.SendNotification();
1252 DALI_TEST_CHECK( ! finished );
1257 int UtcDaliRenderTaskContinuous01(void)
1259 TestApplication application;
1261 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (source actor not staged)\nPOST:continuous renders, no Finished signal");
1263 // SETUP AN OFFSCREEN RENDER TASK
1264 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1265 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1266 drawTrace.Enable(true);
1268 Actor rootActor = Actor::New();
1269 Stage::GetCurrent().Add( rootActor );
1271 CameraActor offscreenCameraActor = CameraActor::New();
1272 Stage::GetCurrent().Add( offscreenCameraActor );
1274 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1275 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1276 Integration::ResourceId imageRequestId = imageRequest->GetId();
1277 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1279 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1280 bool finished = false;
1281 RenderTaskFinished renderTaskFinished( finished );
1282 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1283 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1284 application.SendNotification();
1286 // START PROCESS/RENDER Input, Expected Input, Expected, KeepUpdating
1287 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1288 application.GetPlatform().ClearReadyResources();
1290 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false ) );
1292 // ADD SOURCE ACTOR TO STAGE - expect continuous renders to start, no finished signal
1293 Stage::GetCurrent().Add(secondRootActor);
1294 application.SendNotification();
1296 // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
1297 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1298 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1303 int UtcDaliRenderTaskContinuous02(void)
1305 TestApplication application;
1307 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (source actor not visible)\nPOST:continuous renders, no Finished signal");
1309 // SETUP AN OFFSCREEN RENDER TASK
1310 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1311 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1312 drawTrace.Enable(true);
1314 Actor rootActor = Actor::New();
1315 Stage::GetCurrent().Add( rootActor );
1317 CameraActor offscreenCameraActor = CameraActor::New();
1318 Stage::GetCurrent().Add( offscreenCameraActor );
1320 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1321 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1322 Integration::ResourceId imageRequestId = imageRequest->GetId();
1323 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1324 Stage::GetCurrent().Add(secondRootActor);
1325 secondRootActor.SetVisible(false);
1327 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1328 bool finished = false;
1329 RenderTaskFinished renderTaskFinished( finished );
1330 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1331 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1332 application.SendNotification();
1334 // START PROCESS/RENDER Input, Expected Input, Expected
1335 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1336 application.GetPlatform().ClearReadyResources();
1337 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false ) );
1339 // MAKE SOURCE ACTOR VISIBLE - expect continuous renders to start, no finished signal
1340 secondRootActor.SetVisible(true);
1341 application.SendNotification();
1343 // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
1344 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1345 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1349 int UtcDaliRenderTaskContinuous03(void)
1351 TestApplication application;
1353 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (camera actor not staged)\nPOST:continuous renders, no Finished signal");
1355 // SETUP AN OFFSCREEN RENDER TASK
1356 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1357 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1358 drawTrace.Enable(true);
1360 Actor rootActor = Actor::New();
1361 Stage::GetCurrent().Add( rootActor );
1363 CameraActor offscreenCameraActor = CameraActor::New();
1364 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1365 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1366 Integration::ResourceId imageRequestId = imageRequest->GetId();
1367 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1368 Stage::GetCurrent().Add(secondRootActor);
1370 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1371 bool finished = false;
1372 RenderTaskFinished renderTaskFinished( finished );
1373 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1374 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1375 application.SendNotification();
1377 // START PROCESS/RENDER Input, Expected Input, Expected
1378 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1379 application.GetPlatform().ClearReadyResources();
1380 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false ) );
1382 // ADD CAMERA ACTOR TO STAGE - expect continuous renders to start, no finished signal
1383 Stage::GetCurrent().Add( offscreenCameraActor );
1384 application.SendNotification();
1386 // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
1387 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1388 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1393 int UtcDaliRenderTaskContinuous04(void)
1395 TestApplication application;
1397 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: Resource not ready\nPOST:continuous renders, no Finished signal");
1399 // SETUP AN OFFSCREEN RENDER TASK
1400 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1401 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1402 drawTrace.Enable(true);
1404 Actor rootActor = Actor::New();
1405 Stage::GetCurrent().Add( rootActor );
1407 CameraActor offscreenCameraActor = CameraActor::New();
1408 Stage::GetCurrent().Add( offscreenCameraActor );
1409 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1410 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1411 Integration::ResourceId imageRequestId = imageRequest->GetId();
1412 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1413 Stage::GetCurrent().Add(secondRootActor);
1415 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1416 bool finished = false;
1417 RenderTaskFinished renderTaskFinished( finished );
1418 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1419 application.SendNotification();
1421 // START PROCESS/RENDER Input, Expected Input, Expected
1422 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1423 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1425 // FINISH RESOURCE LOADING - expect 'continuous' renders to start, no finished signal
1426 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1427 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1432 int UtcDaliRenderTaskOnce01(void)
1434 TestApplication application;
1436 tet_infoline("Testing RenderTask Render Once GlSync, using loading image\nPRE: Resources not ready, Source not visible\nPOST: Finished signal sent once only");
1438 // SETUP AN OFFSCREEN RENDER TASK
1439 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1440 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1441 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1442 drawTrace.Enable(true);
1444 Actor rootActor = Actor::New();
1445 Stage::GetCurrent().Add( rootActor );
1447 CameraActor offscreenCameraActor = CameraActor::New();
1448 Stage::GetCurrent().Add( offscreenCameraActor );
1449 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1450 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1451 Integration::ResourceId imageRequestId = imageRequest->GetId();
1452 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1454 Stage::GetCurrent().Add(secondRootActor);
1455 secondRootActor.SetVisible(false);
1457 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, true);
1458 bool finished = false;
1459 RenderTaskFinished renderTaskFinished( finished );
1460 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1461 application.SendNotification();
1463 // START PROCESS/RENDER Input, Expected Input, Expected
1464 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1465 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1467 // MAKE SOURCE VISIBLE
1468 secondRootActor.SetVisible(true);
1469 application.SendNotification();
1470 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1471 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1473 // FINISH RESOURCE LOADING - expect no rendering yet
1474 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1475 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1476 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1477 DALI_TEST_CHECK( lastSyncObj != NULL );
1479 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1480 application.GetPlatform().ClearReadyResources();
1481 sync.SetObjectSynced( lastSyncObj, true );
1482 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1483 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1487 int UtcDaliRenderTaskOnce02(void)
1489 TestApplication application;
1491 tet_infoline("Testing RenderTask Render Once GlSync, using loading image. Switch from render always after ready to render once\n"
1492 "PRE: Render task ready, Image not loaded\n"
1493 "POST: Finished signal sent only once");
1495 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1496 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1497 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1498 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1499 drawTrace.Enable(true);
1501 Actor rootActor = Actor::New();
1502 Stage::GetCurrent().Add( rootActor );
1504 CameraActor offscreenCameraActor = CameraActor::New();
1505 Stage::GetCurrent().Add( offscreenCameraActor );
1506 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1507 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1508 Integration::ResourceId imageRequestId = imageRequest->GetId();
1509 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1510 Stage::GetCurrent().Add(secondRootActor);
1512 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1513 bool finished = false;
1514 RenderTaskFinished renderTaskFinished( finished );
1515 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1516 application.SendNotification();
1518 // START PROCESS/RENDER Input, Expected Input, Expected
1519 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1520 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1522 // FINISH RESOURCE LOADING
1523 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1524 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1525 application.GetPlatform().ClearReadyResources();
1526 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1528 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1529 application.SendNotification(); // Input, Expected Input, Expected
1530 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1531 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1532 DALI_TEST_CHECK( lastSyncObj != NULL );
1534 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1535 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1536 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1537 sync.SetObjectSynced( lastSyncObj, true );
1538 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1539 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1545 int UtcDaliRenderTaskOnce03(void)
1547 TestApplication application;
1549 tet_infoline("Testing RenderTask Render Once GlSync\n"
1550 "Switch from Render always after ready to render once with resources unready\n"
1551 "PRE: Everything ready to render\n"
1552 "POST: Finished signal sent once");
1554 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1555 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1556 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1557 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1558 drawTrace.Enable(true);
1560 Actor rootActor = Actor::New();
1561 Stage::GetCurrent().Add( rootActor );
1563 CameraActor offscreenCameraActor = CameraActor::New();
1564 Stage::GetCurrent().Add( offscreenCameraActor );
1565 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1566 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1567 Integration::ResourceId imageRequestId = imageRequest->GetId();
1568 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1569 Stage::GetCurrent().Add(secondRootActor);
1571 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1572 bool finished = false;
1573 RenderTaskFinished renderTaskFinished( finished );
1574 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1575 application.SendNotification();
1577 // START PROCESS/RENDER Input, Expected Input, Expected
1578 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1579 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1581 // CHANGE TO RENDER ONCE
1582 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1583 application.SendNotification(); // Input, Expected Input, Expected
1584 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1585 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1587 // FINISH RESOURCE LOADING
1588 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1589 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1590 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1591 DALI_TEST_CHECK( lastSyncObj != NULL );
1592 application.GetPlatform().ClearReadyResources();
1594 sync.SetObjectSynced( lastSyncObj, true );
1595 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1596 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1602 //int UtcDaliRenderTaskOnce04(void)
1604 TestApplication application;
1606 tet_infoline("Testing RenderTask Render Once GlSync\n"
1607 "During RenderOnce, make ready resources unready before sending first finished signal\n"
1608 "PRE: Everything ready.\n"
1609 "POST: Finished signal sent only once");
1611 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1612 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1613 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1614 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1615 drawTrace.Enable(true);
1617 Actor rootActor = Actor::New();
1618 Stage::GetCurrent().Add( rootActor );
1620 CameraActor offscreenCameraActor = CameraActor::New();
1621 Stage::GetCurrent().Add( offscreenCameraActor );
1622 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1623 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1624 Integration::ResourceId imageRequestId = imageRequest->GetId();
1625 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1626 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1627 application.Render();
1629 Stage::GetCurrent().Add(secondRootActor);
1630 application.GetPlatform().ClearReadyResources();
1632 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1633 bool finished = false;
1634 RenderTaskFinished renderTaskFinished( finished );
1635 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1636 application.SendNotification();
1638 // START PROCESS/RENDER Input, Expected Input, Expected
1639 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1640 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1642 // CHANGE TO RENDER ONCE, RESOURCES BECOME NOT READY
1643 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1646 ReloadImage(application, secondRootActor.GetImage());
1647 application.SendNotification(); // Input, Expected Input, Expected
1649 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1650 DALI_TEST_EQUALS( secondRootActor.GetImage().GetLoadingState(), Dali::ResourceLoading, TEST_LOCATION);
1651 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1653 // FINISH RESOURCE LOADING
1654 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1655 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1656 application.GetPlatform().ClearReadyResources();
1657 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1658 DALI_TEST_CHECK( lastSyncObj != NULL );
1660 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1661 sync.SetObjectSynced( lastSyncObj, true );
1662 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1663 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, true ) );
1665 // Finished rendering - expect no more renders, no more signals:
1666 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1667 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1668 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1669 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1670 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1671 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1676 int UtcDaliRenderTaskOnce05(void)
1678 TestApplication application;
1680 tet_infoline("Testing RenderTask Render Once GLSync\n"
1681 "Render once, Second call to SetRefreshRate(ONCE) triggers only one more finished signal\n"
1682 "PRE: Everything ready\n"
1683 "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)");
1685 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1686 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1687 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1688 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1689 drawTrace.Enable(true);
1691 Actor rootActor = Actor::New();
1692 Stage::GetCurrent().Add( rootActor );
1694 CameraActor offscreenCameraActor = CameraActor::New();
1695 Stage::GetCurrent().Add( offscreenCameraActor );
1696 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1697 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1698 Integration::ResourceId imageRequestId = imageRequest->GetId();
1699 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1700 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1701 application.Render();
1702 application.GetPlatform().ClearReadyResources();
1704 Stage::GetCurrent().Add(secondRootActor);
1706 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1707 bool finished = false;
1708 RenderTaskFinished renderTaskFinished( finished );
1709 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1710 application.SendNotification();
1712 // START PROCESS/RENDER Input, Expected Input, Expected
1713 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1714 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1716 // CHANGE TO RENDER ONCE,
1717 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1718 application.SendNotification();
1719 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1720 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1721 DALI_TEST_CHECK( lastSyncObj != NULL );
1723 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1724 sync.SetObjectSynced( lastSyncObj, true );
1725 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1726 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1728 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1729 application.SendNotification();
1730 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1731 lastSyncObj = sync.GetLastSyncObject();
1732 DALI_TEST_CHECK( lastSyncObj != NULL );
1734 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1735 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1736 sync.SetObjectSynced( lastSyncObj, true );
1737 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1738 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1742 int UtcDaliRenderTaskOnce06(void)
1744 TestApplication application;
1746 tet_infoline("Testing RenderTask Render Once GLSync\n"
1747 "Render once, Call to SetRefreshRate(ONCE) in Finished signal callback triggers "
1748 "another render & another finished signal\n"
1749 "PRE: Everything ready\n"
1750 "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)");
1753 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1754 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1755 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1756 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1757 drawTrace.Enable(true);
1759 Actor rootActor = Actor::New();
1760 Stage::GetCurrent().Add( rootActor );
1762 CameraActor offscreenCameraActor = CameraActor::New();
1763 Stage::GetCurrent().Add( offscreenCameraActor );
1764 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1765 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1766 Integration::ResourceId imageRequestId = imageRequest->GetId();
1767 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1768 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1769 application.Render();
1770 application.GetPlatform().ClearReadyResources();
1772 Stage::GetCurrent().Add(secondRootActor);
1774 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1775 bool finished = false;
1777 ConnectionTracker connectionTracker;
1778 RenderTaskFinishedRenderAgain renderTaskFinishedRenderAgain( finished );
1779 newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinishedRenderAgain );
1781 application.SendNotification();
1783 // Expect 2 frames to be drawn.
1784 // START PROCESS/RENDER Input, Expected Input, Expected
1785 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1786 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1787 DALI_TEST_CHECK( lastSyncObj == NULL );
1788 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1790 // CHANGE TO RENDER ONCE,
1791 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1792 application.SendNotification();
1793 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1794 lastSyncObj = sync.GetLastSyncObject();
1795 DALI_TEST_CHECK( lastSyncObj != NULL );
1797 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1798 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1800 sync.SetObjectSynced( lastSyncObj, true );
1801 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1802 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1803 application.SendNotification();
1805 // Expect SetRefreshRate to have been called again
1806 // Prevent next finished signal calling refresh once again
1807 RenderTaskFinished renderTaskFinished( finished );
1808 connectionTracker.DisconnectAll();
1809 newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinished );
1810 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1811 lastSyncObj = sync.GetLastSyncObject();
1812 DALI_TEST_CHECK( lastSyncObj != NULL );
1814 sync.SetObjectSynced( lastSyncObj, true );
1815 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1816 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1821 int UtcDaliRenderTaskOnce07(void)
1823 TestApplication application;
1825 tet_infoline("Testing RenderTask Render Once GlSync\n"
1826 "SetRefreshRate(ONCE) again before first finished signal has been sent.\n"
1827 "PRE: resources ready\n"
1828 "POST: Only 1 finished signal sent.");
1830 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1831 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1832 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1833 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1834 drawTrace.Enable(true);
1836 Actor rootActor = Actor::New();
1837 Stage::GetCurrent().Add( rootActor );
1839 CameraActor offscreenCameraActor = CameraActor::New();
1840 Stage::GetCurrent().Add( offscreenCameraActor );
1841 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1842 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1843 Integration::ResourceId imageRequestId = imageRequest->GetId();
1844 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1845 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1846 application.Render();
1847 application.GetPlatform().ClearReadyResources();
1849 Stage::GetCurrent().Add(secondRootActor);
1851 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1852 bool finished = false;
1853 RenderTaskFinished renderTaskFinished( finished );
1854 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1855 application.SendNotification();
1857 // START PROCESS/RENDER Input, Expected Input, Expected
1858 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1859 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1861 // CHANGE TO RENDER ONCE,
1862 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1863 application.SendNotification();
1864 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1865 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1866 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1868 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1869 application.SendNotification();
1870 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1871 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1872 DALI_TEST_CHECK( lastSyncObj != NULL );
1874 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1875 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1876 sync.SetObjectSynced( lastSyncObj, true );
1877 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1878 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1885 int UtcDaliRenderTaskOnce08(void)
1887 TestApplication application;
1889 tet_infoline("Testing RenderTask Render Once GlSync\n"
1890 "SetRefreshRate(ONCE), resource load failed completes render task.\n"
1891 "PRE: resources not ready\n"
1892 "POST: Only 1 finished signal sent.");
1894 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1895 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1896 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1897 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1898 drawTrace.Enable(true);
1900 Actor rootActor = Actor::New();
1901 Stage::GetCurrent().Add( rootActor );
1903 CameraActor offscreenCameraActor = CameraActor::New();
1904 Stage::GetCurrent().Add( offscreenCameraActor );
1905 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1906 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1907 Integration::ResourceId imageRequestId = imageRequest->GetId();
1908 Stage::GetCurrent().Add(secondRootActor);
1910 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1911 bool finished = false;
1912 RenderTaskFinished renderTaskFinished( finished );
1913 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1914 application.SendNotification();
1916 // START PROCESS/RENDER Input, Expected Input, Expected
1917 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1918 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1920 // CHANGE TO RENDER ONCE,
1921 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1922 application.SendNotification();
1923 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1924 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1925 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1927 tet_printf(" FailImageLoad\n");
1929 FailImageLoad(application, imageRequestId); // Need to run Update again for this to complete
1930 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); // nothing to draw
1931 application.SendNotification();
1933 // Drawing empty framebuffer, so will still get a GL sync
1934 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1935 DALI_TEST_CHECK( lastSyncObj != NULL );
1937 // Expect finished signal, as all resources are complete
1938 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, true, false ) );
1945 int UtcDaliRenderTaskOnceNoSync01(void)
1947 TestApplication application;
1949 tet_infoline("Testing RenderTask Render Once, using loading image\nPRE: Resources not ready, Source not visible\nPOST: Finished signal sent once only");
1951 // SETUP AN OFFSCREEN RENDER TASK
1952 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1953 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1954 drawTrace.Enable(true);
1956 Actor rootActor = Actor::New();
1957 Stage::GetCurrent().Add( rootActor );
1959 CameraActor offscreenCameraActor = CameraActor::New();
1960 Stage::GetCurrent().Add( offscreenCameraActor );
1961 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1962 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1963 Integration::ResourceId imageRequestId = imageRequest->GetId();
1964 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1966 Stage::GetCurrent().Add(secondRootActor);
1967 secondRootActor.SetVisible(false);
1969 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, false);
1970 bool finished = false;
1971 RenderTaskFinished renderTaskFinished( finished );
1972 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1973 application.SendNotification();
1975 // START PROCESS/RENDER Input, Expected Input, Expected
1976 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1977 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1979 // MAKE SOURCE VISIBLE
1980 secondRootActor.SetVisible(true);
1981 application.SendNotification();
1982 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1983 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1985 // FINISH RESOURCE LOADING - expect immediate rendering yet
1986 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1987 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1988 application.GetPlatform().ClearReadyResources();
1989 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1993 int UtcDaliRenderTaskOnceNoSync02(void)
1995 TestApplication application;
1997 tet_infoline("Testing RenderTask Render Once, using loading image. Switch from render always after ready to render once\n"
1998 "PRE: Render task ready, Image not loaded\n"
1999 "POST: Finished signal sent only once");
2001 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2002 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2003 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2004 drawTrace.Enable(true);
2006 Actor rootActor = Actor::New();
2007 Stage::GetCurrent().Add( rootActor );
2009 CameraActor offscreenCameraActor = CameraActor::New();
2010 Stage::GetCurrent().Add( offscreenCameraActor );
2011 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
2012 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2013 Integration::ResourceId imageRequestId = imageRequest->GetId();
2014 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2015 Stage::GetCurrent().Add(secondRootActor);
2017 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2018 bool finished = false;
2019 RenderTaskFinished renderTaskFinished( finished );
2020 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2021 application.SendNotification();
2023 // START PROCESS/RENDER Input, Expected Input, Expected
2024 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2025 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2027 // FINISH RESOURCE LOADING
2028 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2029 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
2030 application.GetPlatform().ClearReadyResources();
2032 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2033 application.SendNotification(); // Input, Expected Input, Expected
2034 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2035 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2040 int UtcDaliRenderTaskOnceNoSync03(void)
2042 TestApplication application;
2044 tet_infoline("Testing RenderTask Render Once\n"
2045 "Switch from Render always after ready to render once with resources unready\n"
2046 "PRE: Everything ready to render\n"
2047 "POST: Finished signal sent once");
2049 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2050 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2051 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2052 drawTrace.Enable(true);
2054 Actor rootActor = Actor::New();
2055 Stage::GetCurrent().Add( rootActor );
2057 CameraActor offscreenCameraActor = CameraActor::New();
2058 Stage::GetCurrent().Add( offscreenCameraActor );
2059 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
2060 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2061 Integration::ResourceId imageRequestId = imageRequest->GetId();
2062 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2063 Stage::GetCurrent().Add(secondRootActor);
2065 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2066 bool finished = false;
2067 RenderTaskFinished renderTaskFinished( finished );
2068 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2069 application.SendNotification();
2071 // START PROCESS/RENDER Input, Expected Input, Expected
2072 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2073 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2075 // CHANGE TO RENDER ONCE
2076 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2077 application.SendNotification(); // Input, Expected Input, Expected
2078 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2079 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2081 // FINISH RESOURCE LOADING
2082 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2083 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2084 application.GetPlatform().ClearReadyResources();
2085 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2090 //int UtcDaliRenderTaskOnceNoSync04(void)
2092 TestApplication application;
2094 tet_infoline("Testing RenderTask Render Once\n"
2095 "During RenderOnce, make ready resources unready before sending first finished signal\n"
2096 "PRE: Everything ready.\n"
2097 "POST: Finished signal sent only once");
2099 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2100 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2101 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2102 drawTrace.Enable(true);
2104 Actor rootActor = Actor::New();
2105 Stage::GetCurrent().Add( rootActor );
2107 CameraActor offscreenCameraActor = CameraActor::New();
2108 Stage::GetCurrent().Add( offscreenCameraActor );
2109 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
2110 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2111 Integration::ResourceId imageRequestId = imageRequest->GetId();
2112 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2113 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2114 application.Render();
2115 application.GetPlatform().ClearReadyResources();
2117 Stage::GetCurrent().Add(secondRootActor);
2119 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2120 bool finished = false;
2121 RenderTaskFinished renderTaskFinished( finished );
2122 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2123 application.SendNotification();
2125 // START PROCESS/RENDER Input, Expected Input, Expected
2126 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2127 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
2129 // CHANGE TO RENDER ONCE, RESOURCES BECOME NOT READY
2130 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2133 ReloadImage(application, secondRootActor.GetImage());
2134 application.SendNotification(); // Input, Expected Input, Expected
2136 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2137 DALI_TEST_EQUALS( secondRootActor.GetImage().GetLoadingState(), Dali::ResourceLoading, TEST_LOCATION);
2138 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2140 // FINISH RESOURCE LOADING
2141 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2142 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, true, true ) );
2143 application.GetPlatform().ClearReadyResources();
2144 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2145 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2146 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2147 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2152 int UtcDaliRenderTaskOnceNoSync05(void)
2154 TestApplication application;
2156 tet_infoline("Testing RenderTask Render Once\n"
2157 "Render once, Second call to SetRefreshRate(ONCE) triggers only one more finished signal\n"
2158 "PRE: Everything ready\n"
2159 "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)");
2161 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2162 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2163 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2164 drawTrace.Enable(true);
2166 Actor rootActor = Actor::New();
2167 Stage::GetCurrent().Add( rootActor );
2169 CameraActor offscreenCameraActor = CameraActor::New();
2170 Stage::GetCurrent().Add( offscreenCameraActor );
2171 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
2172 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2173 Integration::ResourceId imageRequestId = imageRequest->GetId();
2174 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2175 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2176 application.Render();
2177 application.GetPlatform().ClearReadyResources();
2179 Stage::GetCurrent().Add(secondRootActor);
2181 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2182 bool finished = false;
2183 RenderTaskFinished renderTaskFinished( finished );
2184 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2185 application.SendNotification();
2187 // START PROCESS/RENDER Input, Expected Input, Expected
2188 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2189 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
2191 // CHANGE TO RENDER ONCE,
2192 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2193 application.SendNotification();
2194 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2195 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2197 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2198 application.SendNotification();
2199 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2200 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2204 int UtcDaliRenderTaskOnceNoSync06(void)
2206 TestApplication application;
2208 tet_infoline("Testing RenderTask Render Once\n"
2209 "Render once, Call to SetRefreshRate(ONCE) in Finished signal callback triggers\n"
2210 "another render & another finished signal\n"
2211 "PRE: Everything ready\n"
2212 "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)");
2215 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2216 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2217 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2218 drawTrace.Enable(true);
2220 Actor rootActor = Actor::New();
2221 Stage::GetCurrent().Add( rootActor );
2223 CameraActor offscreenCameraActor = CameraActor::New();
2224 Stage::GetCurrent().Add( offscreenCameraActor );
2225 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
2226 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2227 Integration::ResourceId imageRequestId = imageRequest->GetId();
2228 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2229 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2230 application.Render();
2231 application.GetPlatform().ClearReadyResources();
2233 Stage::GetCurrent().Add(secondRootActor);
2235 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2236 bool finished = false;
2238 ConnectionTracker connectionTracker;
2239 RenderTaskFinishedRenderAgain renderTaskFinishedRenderAgain( finished );
2240 newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinishedRenderAgain );
2242 application.SendNotification();
2244 // START PROCESS/RENDER Input, Expected Input, Expected
2245 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2246 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
2248 // CHANGE TO RENDER ONCE,
2249 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2250 application.SendNotification();
2251 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2252 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2254 // Expect SetRefreshRate to have been called again
2255 // Prevent next finished signal calling refresh once again
2256 RenderTaskFinished renderTaskFinished( finished );
2257 connectionTracker.DisconnectAll();
2258 newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinished );
2260 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2261 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2266 int UtcDaliRenderTaskOnceNoSync07(void)
2268 TestApplication application;
2270 tet_infoline("Testing RenderTask Render Once\n"
2271 "SetRefreshRate(ONCE) again before first finished signal has been sent.\n"
2272 "PRE: resources ready\n"
2273 "POST: Only 1 finished signal sent.");
2275 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2276 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2277 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2278 drawTrace.Enable(true);
2280 Actor rootActor = Actor::New();
2281 Stage::GetCurrent().Add( rootActor );
2283 CameraActor offscreenCameraActor = CameraActor::New();
2284 Stage::GetCurrent().Add( offscreenCameraActor );
2285 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
2286 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2287 Integration::ResourceId imageRequestId = imageRequest->GetId();
2288 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2289 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2290 application.Render();
2291 application.GetPlatform().ClearReadyResources();
2293 Stage::GetCurrent().Add(secondRootActor);
2295 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2296 bool finished = false;
2297 RenderTaskFinished renderTaskFinished( finished );
2298 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2299 application.SendNotification();
2301 // START PROCESS/RENDER Input, Expected Input, Expected
2302 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2303 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
2305 // CHANGE TO RENDER ONCE,
2306 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2307 application.SendNotification();
2308 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2309 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2311 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2312 application.SendNotification();
2313 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2314 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2318 int UtcDaliRenderTaskOnceNoSync08(void)
2320 TestApplication application;
2322 tet_infoline("Testing RenderTask Render Once\n"
2323 "SetRefreshRate(ONCE), resource load failed, completes render task.\n"
2324 "PRE: resources not ready\n"
2325 "POST: Only 1 finished signal sent.");
2327 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2328 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2329 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2330 drawTrace.Enable(true);
2332 Actor rootActor = Actor::New();
2333 Stage::GetCurrent().Add( rootActor );
2335 CameraActor offscreenCameraActor = CameraActor::New();
2336 Stage::GetCurrent().Add( offscreenCameraActor );
2337 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
2338 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2339 Integration::ResourceId imageRequestId = imageRequest->GetId();
2340 Stage::GetCurrent().Add(secondRootActor);
2342 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2343 bool finished = false;
2344 RenderTaskFinished renderTaskFinished( finished );
2345 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2346 application.SendNotification();
2348 // START PROCESS/RENDER Input, Expected Input, Expected
2349 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2350 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2352 // CHANGE TO RENDER ONCE,
2353 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2354 application.SendNotification();
2355 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2356 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2357 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2359 FailImageLoad(application, imageRequestId); // Need to run Update again for this to complete
2360 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); // nothing to draw
2361 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2368 int UtcDaliRenderTaskOnceChain01(void)
2370 TestApplication application;
2372 tet_infoline("Testing RenderTask Render Once Chained render tasks\n"
2373 "SetRefreshRate(ONCE), resource load completes, both render tasks render.\n"
2374 "PRE: resources not ready\n"
2375 "POST: 2 finished signals sent.");
2377 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2378 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2379 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2380 drawTrace.Enable(true);
2382 Actor defaultRootActor = Actor::New(); // Root for default RT
2383 Stage::GetCurrent().Add( defaultRootActor );
2385 CameraActor offscreenCameraActor = CameraActor::New();
2386 Stage::GetCurrent().Add( offscreenCameraActor );
2387 ImageActor firstRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
2388 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2389 Integration::ResourceId imageRequestId = imageRequest->GetId();
2390 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2391 Stage::GetCurrent().Add(firstRootActor);
2393 // first render task
2394 RenderTask firstTask = CreateRenderTask(application, offscreenCameraActor, defaultRootActor, firstRootActor, RenderTask::REFRESH_ONCE, false);
2395 bool firstFinished = false;
2396 RenderTaskFinished renderTask1Finished( firstFinished );
2397 firstTask.FinishedSignal().Connect( &application, renderTask1Finished );
2399 // Second render task
2400 FrameBufferImage fbo = firstTask.GetTargetFrameBuffer();
2401 ImageActor secondRootActor = ImageActor::New( fbo );
2402 Stage::GetCurrent().Add(secondRootActor);
2403 RenderTask secondTask = CreateRenderTask(application, offscreenCameraActor, defaultRootActor, secondRootActor, RenderTask::REFRESH_ONCE, false);
2404 bool secondFinished = false;
2405 RenderTaskFinished renderTask2Finished( secondFinished );
2406 secondTask.FinishedSignal().Connect( &application, renderTask2Finished );
2408 application.SendNotification();
2410 // START PROCESS/RENDER Input, Expected Input, Expected
2411 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false, true ) );
2412 DALI_TEST_CHECK( secondFinished == false );
2413 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false, true ) );
2414 DALI_TEST_CHECK( secondFinished == false );
2416 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2417 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false, true ) );
2418 DALI_TEST_CHECK( secondFinished == false );
2419 application.GetPlatform().ClearReadyResources();
2421 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, firstFinished, true, false ) );
2422 DALI_TEST_CHECK( secondFinished == true );
2427 int UtcDaliRenderTaskProperties(void)
2429 TestApplication application;
2431 RenderTask task = Stage::GetCurrent().GetRenderTaskList().CreateTask();
2433 Property::IndexContainer indices;
2434 task.GetPropertyIndices( indices );
2435 DALI_TEST_CHECK( ! indices.empty() );
2436 DALI_TEST_EQUALS( indices.size(), task.GetPropertyCount(), TEST_LOCATION );
2440 int UtcDaliRenderTaskSetScreenToFrameBufferMappingActor(void)
2442 TestApplication application;
2443 tet_infoline("Testing RenderTask::SetScreenToFrameBufferMappingActor ");
2445 Stage stage = Stage::GetCurrent();
2446 Size stageSize = stage.GetSize();
2447 Actor mappingActor = Actor::New();
2448 Vector2 scale( 0.6f, 0.75f);
2449 Vector2 offset( stageSize.x*0.1f, stageSize.y*0.15f);
2450 mappingActor.SetSize( stageSize * scale );
2451 mappingActor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
2452 mappingActor.SetPosition( offset.x, offset.y );
2453 stage.Add( mappingActor );
2455 Actor offscreenActor = Actor::New();
2456 offscreenActor.SetSize( stageSize );
2457 offscreenActor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
2458 stage.Add( offscreenActor );
2460 RenderTaskList taskList = stage.GetRenderTaskList();
2461 RenderTask renderTask = taskList.CreateTask();
2462 FrameBufferImage frameBufferImage = FrameBufferImage::New(stageSize.width*scale.x, stageSize.height*scale.y, Pixel::A8, Image::Never);
2463 renderTask.SetSourceActor( offscreenActor );
2464 renderTask.SetExclusive( true );
2465 renderTask.SetInputEnabled( true );
2466 renderTask.SetTargetFrameBuffer( frameBufferImage );
2467 renderTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
2468 renderTask.SetScreenToFrameBufferMappingActor( mappingActor );
2469 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2471 // Render and notify
2472 application.SendNotification();
2473 application.Render();
2474 application.Render();
2475 application.SendNotification();
2477 Vector2 screenCoordinates( stageSize.x * 0.05f, stageSize.y * 0.05f );
2478 Dali::HitTestAlgorithm::Results results;
2479 DALI_TEST_CHECK( !results.actor );
2480 DALI_TEST_EQUALS( Vector2::ZERO, results.actorCoordinates, 0.1f, TEST_LOCATION );
2481 // miss expected, results not changed
2482 DALI_TEST_CHECK( false == Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction ) );
2483 DALI_TEST_CHECK( !results.actor );
2484 DALI_TEST_EQUALS( Vector2::ZERO, results.actorCoordinates, 0.1f, TEST_LOCATION );
2486 screenCoordinates.x = stageSize.x * 0.265f;
2487 screenCoordinates.y = stageSize.y * 0.33f;
2488 results.actor = Actor();
2489 results.actorCoordinates = Vector2::ZERO;
2490 // hit expected, results changed
2491 DALI_TEST_CHECK( true == Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction ) );
2492 DALI_TEST_CHECK( results.actor == offscreenActor );
2493 DALI_TEST_EQUALS( (screenCoordinates-offset)/scale , results.actorCoordinates, 0.1f, TEST_LOCATION );
2495 screenCoordinates.x = stageSize.x * 0.435f;
2496 screenCoordinates.y = stageSize.y * 0.52f;
2497 // hit expected, results changed
2498 DALI_TEST_CHECK( true == Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction ) );
2499 DALI_TEST_CHECK( results.actor == offscreenActor );
2500 const Vector2 expectedCoordinates = (screenCoordinates-offset)/scale;
2501 DALI_TEST_EQUALS( expectedCoordinates , results.actorCoordinates, 0.1f, TEST_LOCATION );
2503 screenCoordinates.x = stageSize.x * 0.65f;
2504 screenCoordinates.y = stageSize.y * 0.95f;
2505 // miss expected, results not changed
2506 DALI_TEST_CHECK( false == Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction ) );
2507 DALI_TEST_CHECK( results.actor == offscreenActor );
2508 DALI_TEST_EQUALS( expectedCoordinates , results.actorCoordinates, 0.1f, TEST_LOCATION );