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>
24 #include <test-native-image.h>
26 #define BOOLSTR(x) ((x)?"T":"F")
31 void utc_dali_render_task_startup(void)
33 test_return_value = TET_UNDEF;
36 void utc_dali_render_task_cleanup(void)
38 test_return_value = TET_PASS;
41 namespace // unnamed namespace
44 const int RENDER_FRAME_INTERVAL = 16; ///< Duration of each frame in ms. (at approx 60FPS)
47 * Simulate time passed by.
49 * @note this will always process at least 1 frame (1/60 sec)
51 * @param application Test application instance
52 * @param duration Time to pass in milliseconds.
53 * @return The actual time passed in milliseconds
55 int Wait(TestApplication& application, int duration = 0)
59 for(int i = 0; i <= ( duration / RENDER_FRAME_INTERVAL); i++)
61 application.SendNotification();
62 application.Render(RENDER_FRAME_INTERVAL);
63 time += RENDER_FRAME_INTERVAL;
69 struct RenderTaskFinished
71 RenderTaskFinished( bool& finished )
72 : finished( finished )
76 void operator()( RenderTask& renderTask )
84 struct RenderTaskFinishedRemoveSource
86 RenderTaskFinishedRemoveSource( bool& finished )
87 : finished( finished ),
92 void operator()( RenderTask& renderTask )
94 DALI_TEST_CHECK(finishedOnce == false);
97 Actor srcActor = renderTask.GetSourceActor();
98 UnparentAndReset(srcActor);
105 struct RenderTaskFinishedRenderAgain
107 RenderTaskFinishedRenderAgain( bool& finished )
108 : finished( finished ),
113 void operator()( RenderTask& renderTask )
115 DALI_TEST_CHECK(finishedOnce == false);
118 renderTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
126 bool TestScreenToFrameBufferFunction( Vector2& coordinates )
128 coordinates = coordinates + Vector2( 1, 2 );
133 ImageActor CreateLoadingImage(TestApplication& application, std::string filename, ResourceImage::LoadPolicy loadPolicy, Image::ReleasePolicy releasePolicy)
135 Image image = ResourceImage::New(filename, loadPolicy, releasePolicy);
136 DALI_TEST_CHECK( image );
137 application.SendNotification();
138 application.Render(16);
139 DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
140 ImageActor actor = ImageActor::New(image);
141 actor.SetSize( 80, 80 );
142 application.SendNotification();
143 application.Render(16);
147 void CompleteImageLoad(TestApplication& application, Integration::ResourceId resourceId, Integration::ResourceTypeId requestType)
149 std::vector<GLuint> ids;
151 application.GetGlAbstraction().SetNextTextureIds( ids );
153 Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
154 Integration::ResourcePointer resource(bitmap);
155 bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
157 application.GetPlatform().SetResourceLoaded(resourceId, requestType, resource);
160 void FailImageLoad(TestApplication& application, Integration::ResourceId resourceId )
162 application.GetPlatform().SetResourceLoadFailed(resourceId, Integration::FailureUnknown);
165 void ReloadImage(TestApplication& application, ResourceImage image)
167 application.GetPlatform().ClearReadyResources();
168 application.GetPlatform().DiscardRequest();
169 application.GetPlatform().ResetTrace();
170 application.GetPlatform().SetClosestImageSize(Vector2(80.0f, 80.0f)); // Ensure reload is called.
174 RenderTask CreateRenderTask(TestApplication& application,
175 CameraActor offscreenCamera,
176 Actor rootActor, // Reset default render task to point at this actor
177 Actor secondRootActor, // Source actor
178 unsigned int refreshRate,
181 // Change main render task to use a different root
182 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
183 taskList.GetTask(0u).SetSourceActor( rootActor );
185 FrameBufferImage frameBufferImage;
188 NativeImageInterfacePtr testNativeImagePtr = TestNativeImage::New(10, 10);
189 frameBufferImage= FrameBufferImage::New( *(testNativeImagePtr.Get()) );
193 frameBufferImage = FrameBufferImage::New( 10, 10 );
196 // Don't draw output framebuffer
198 RenderTask newTask = taskList.CreateTask();
199 newTask.SetCameraActor( offscreenCamera );
200 newTask.SetSourceActor( secondRootActor );
201 newTask.SetInputEnabled( false );
202 newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
203 newTask.SetClearEnabled( true );
204 newTask.SetExclusive( true );
205 newTask.SetRefreshRate( refreshRate );
206 newTask.SetTargetFrameBuffer( frameBufferImage );
210 bool UpdateRender(TestApplication& application, TraceCallStack& callStack, bool testDrawn, bool& finishedSig, bool testFinished, bool testKeepUpdating )
214 application.Render(16);
215 application.SendNotification();
217 bool sigPassed = false;
220 sigPassed = finishedSig;
224 sigPassed = ! finishedSig;
227 bool drawResult = callStack.FindMethod("DrawElements") || callStack.FindMethod("DrawArrays");
229 bool drawPassed = false;
232 drawPassed = drawResult;
236 drawPassed = !drawResult;
239 bool keepUpdating = (application.GetUpdateStatus() != 0);
240 bool keepUpdatingPassed = false;
241 if( testKeepUpdating )
243 keepUpdatingPassed = keepUpdating;
247 keepUpdatingPassed = !keepUpdating;
250 bool result = (sigPassed && drawPassed && keepUpdatingPassed);
252 tet_printf("UpdateRender: Expected: Draw:%s Signal:%s Keep Updating: %s Actual: Draw:%s Signal:%s KeepUpdating: %s %s\n",
253 BOOLSTR(testDrawn), BOOLSTR(testFinished), BOOLSTR(testKeepUpdating),
254 BOOLSTR(drawResult), BOOLSTR(finishedSig), BOOLSTR(keepUpdating),
255 result ? "Passed":"Failed");
260 // The functor to be used in the hit-test algorithm to check whether the actor is hittable.
261 bool IsActorHittableFunction(Actor actor, Dali::HitTestAlgorithm::TraverseType type)
263 bool hittable = false;
267 case Dali::HitTestAlgorithm::CHECK_ACTOR:
269 // Check whether the actor is visible and not fully transparent.
270 if( actor.IsVisible()
271 && actor.GetCurrentWorldColor().a > 0.01f) // not FULLY_TRANSPARENT
278 case Dali::HitTestAlgorithm::DESCEND_ACTOR_TREE:
280 if( actor.IsVisible() ) // Actor is visible, if not visible then none of its children are visible.
295 } // unnamed namespace
298 /****************************************************************************************************/
299 /****************************************************************************************************/
300 /******************************** TEST CASES BELOW **********************************************/
301 /****************************************************************************************************/
302 /****************************************************************************************************/
304 int UtcDaliRenderTaskDownCast(void)
306 TestApplication application;
308 tet_infoline("Testing RenderTask::DownCast()");
310 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
312 BaseHandle base = taskList.GetTask( 0u );
313 DALI_TEST_CHECK( base );
315 RenderTask task = RenderTask::DownCast( base );
316 DALI_TEST_CHECK( task );
318 // Try calling a method
319 DALI_TEST_CHECK( task.GetSourceActor() );
323 int UtcDaliRenderTaskSetSourceActor(void)
325 TestApplication application;
327 tet_infoline("Testing RenderTask::SetSourceActor()");
329 Stage stage = Stage::GetCurrent();
331 const std::vector<GLuint>& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 );
333 RenderTaskList taskList = stage.GetRenderTaskList();
335 RenderTask task = taskList.GetTask( 0u );
337 Actor actor = task.GetSourceActor();
338 DALI_TEST_CHECK( actor );
340 std::vector<GLuint> ids;
342 application.GetGlAbstraction().SetNextTextureIds( ids );
344 BitmapImage img = BitmapImage::New( 1,1 );
345 ImageActor newActor = ImageActor::New( img );
346 newActor.SetSize(1,1);
347 stage.Add( newActor );
349 Actor nonRenderableActor = Actor::New();
350 stage.Add( nonRenderableActor );
352 // Stop the newActor from being rendered by changing the source actor
353 DALI_TEST_CHECK( nonRenderableActor );
354 task.SetSourceActor( nonRenderableActor );
355 DALI_TEST_CHECK( task.GetSourceActor() != actor );
356 DALI_TEST_CHECK( task.GetSourceActor() == nonRenderableActor );
358 // Update & Render nothing!
359 application.GetGlAbstraction().ClearBoundTextures();
360 application.SendNotification();
361 application.Render();
363 // Check that nothing was rendered
364 DALI_TEST_EQUALS( boundTextures.size(), 0u, TEST_LOCATION );
366 // Set newActor as the new source Actor
367 task.SetSourceActor( newActor );
368 DALI_TEST_CHECK( task.GetSourceActor() != actor );
369 DALI_TEST_CHECK( task.GetSourceActor() == newActor );
371 // Update & Render the newActor
372 application.GetGlAbstraction().ClearBoundTextures();
373 application.SendNotification();
374 application.Render();
376 // Check that the newActor was rendered
377 DALI_TEST_EQUALS( boundTextures.size(), 1u, TEST_LOCATION );
378 if ( boundTextures.size() )
380 DALI_TEST_EQUALS( boundTextures[0], 7u, TEST_LOCATION );
385 int UtcDaliRenderTaskSetSourceActorOffStage(void)
387 TestApplication application;
389 tet_infoline("Testing RenderTask::SetSourceActor (on/off stage testing)");
391 Stage stage = Stage::GetCurrent();
393 const std::vector<GLuint>& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 );
395 RenderTaskList taskList = stage.GetRenderTaskList();
397 RenderTask task = taskList.GetTask( 0u );
399 Actor actor = task.GetSourceActor();
400 DALI_TEST_CHECK( actor );
402 std::vector<GLuint> ids;
403 GLuint expectedTextureId( 3 );
404 ids.push_back( expectedTextureId );
405 application.GetGlAbstraction().SetNextTextureIds( ids );
407 BitmapImage img = BitmapImage::New( 1,1 );
408 ImageActor newActor = ImageActor::New( img );
409 newActor.SetSize(1,1);
410 task.SetSourceActor( newActor );
411 // Don't add newActor to stage yet
413 // Update & Render with the actor initially off-stage
414 application.GetGlAbstraction().ClearBoundTextures();
415 application.SendNotification();
416 application.Render();
418 // Check that nothing was rendered
419 DALI_TEST_EQUALS( boundTextures.size(), 0u, TEST_LOCATION );
422 stage.Add( newActor );
424 // Update & Render with the actor on-stage
425 application.GetGlAbstraction().ClearBoundTextures();
426 application.SendNotification();
427 application.Render();
429 // Check that the newActor was rendered
430 DALI_TEST_EQUALS( boundTextures.size(), 1u, TEST_LOCATION );
431 if ( boundTextures.size() )
433 DALI_TEST_EQUALS( boundTextures[0], expectedTextureId, TEST_LOCATION );
436 // Now remove from stage
437 stage.Remove( newActor );
439 // Update & Render with the actor off-stage
440 application.GetGlAbstraction().ClearBoundTextures();
441 application.SendNotification();
442 application.Render();
446 int UtcDaliRenderTaskSetSourceActorEmpty(void)
448 TestApplication application;
450 tet_infoline("Testing RenderTask::SetSourceActor (empty handle case)");
452 Stage stage = Stage::GetCurrent();
454 const std::vector<GLuint>& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 );
456 RenderTaskList taskList = stage.GetRenderTaskList();
458 RenderTask task = taskList.GetTask( 0u );
460 Actor actor = task.GetSourceActor();
461 DALI_TEST_CHECK( actor );
463 std::vector<GLuint> ids;
464 GLuint expectedTextureId( 5 );
465 ids.push_back( expectedTextureId );
466 application.GetGlAbstraction().SetNextTextureIds( ids );
468 BitmapImage img = BitmapImage::New( 1,1 );
469 ImageActor newActor = ImageActor::New( img );
470 newActor.SetSize(1,1);
471 stage.Add( newActor );
473 Actor nonRenderableActor = Actor::New();
474 stage.Add( nonRenderableActor );
476 // Set with empty handle
477 task.SetSourceActor( Actor() );
478 DALI_TEST_CHECK( ! task.GetSourceActor() );
480 // Update & Render nothing!
481 application.GetGlAbstraction().ClearBoundTextures();
482 application.SendNotification();
483 application.Render();
485 // Check that nothing was rendered
486 DALI_TEST_EQUALS( boundTextures.size(), 0u, TEST_LOCATION );
488 // Set with non-empty handle
489 task.SetSourceActor( newActor );
490 DALI_TEST_CHECK( task.GetSourceActor() == newActor );
492 // Update & Render the newActor
493 application.GetGlAbstraction().ClearBoundTextures();
494 application.SendNotification();
495 application.Render();
497 // Check that the newActor was rendered
498 DALI_TEST_EQUALS( boundTextures.size(), 1u, TEST_LOCATION );
499 if ( boundTextures.size() )
501 DALI_TEST_EQUALS( boundTextures[0], expectedTextureId, TEST_LOCATION );
506 int UtcDaliRenderTaskGetSourceActor(void)
508 TestApplication application;
510 tet_infoline("Testing RenderTask::GetSourceActor()");
512 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
514 RenderTask task = taskList.GetTask( 0u );
516 Actor actor = task.GetSourceActor();
517 DALI_TEST_CHECK( actor );
519 // By default the entire scene should be rendered
520 Actor root = Stage::GetCurrent().GetLayer( 0 );
521 DALI_TEST_CHECK( root == actor );
525 int UtcDaliRenderTaskSetExclusive(void)
527 TestApplication application;
529 tet_infoline("Testing RenderTask::SetExclusive()");
531 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
533 // Manipulate the GenTextures behaviour, to identify different ImageActors
535 std::vector<GLuint> ids;
536 ids.push_back( 8 ); // 8 = actor1
537 ids.push_back( 9 ); // 9 = actor2
538 ids.push_back( 10 ); // 10 = actor3
539 application.GetGlAbstraction().SetNextTextureIds( ids );
541 BitmapImage img1 = BitmapImage::New( 1,1 );
542 ImageActor actor1 = ImageActor::New( img1 );
544 Stage::GetCurrent().Add( actor1 );
546 // Update & Render actor1
547 application.SendNotification();
548 application.Render();
550 // Check that the actor1 was rendered
551 const std::vector<GLuint>& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 );
552 DALI_TEST_EQUALS( boundTextures.size(), 1u, TEST_LOCATION );
554 if ( boundTextures.size() )
556 DALI_TEST_EQUALS( boundTextures[0], 8u/*unique to actor1*/, TEST_LOCATION );
559 BitmapImage img2 = BitmapImage::New( 1,1 );
560 ImageActor actor2 = ImageActor::New( img2 );
563 // Force actor2 to be rendered before actor1
564 Layer layer = Layer::New();
565 Stage::GetCurrent().Add( layer );
567 layer.LowerToBottom();
570 application.GetGlAbstraction().ClearBoundTextures();
571 application.SendNotification();
572 application.Render();
574 // Check that the actors were rendered
575 DALI_TEST_EQUALS( boundTextures.size(), 2u, TEST_LOCATION );
577 if ( boundTextures.size() )
579 DALI_TEST_EQUALS( boundTextures[0], 9u/*unique to actor2*/, TEST_LOCATION );
580 DALI_TEST_EQUALS( boundTextures[1], 8u/*unique to actor1*/, TEST_LOCATION );
583 BitmapImage img3 = BitmapImage::New( 1,1 );
584 ImageActor actor3 = ImageActor::New( img3 );
587 // Force actor3 to be rendered before actor2
588 layer = Layer::New();
589 Stage::GetCurrent().Add( layer );
591 layer.LowerToBottom();
593 // Update & Render all actors
594 application.GetGlAbstraction().ClearBoundTextures();
595 application.SendNotification();
596 application.Render();
598 // Check that the actors were rendered
599 DALI_TEST_EQUALS( boundTextures.size(), 3u, TEST_LOCATION );
601 if ( boundTextures.size() )
603 DALI_TEST_EQUALS( boundTextures[0], 10u/*unique to actor3*/, TEST_LOCATION );
604 DALI_TEST_EQUALS( boundTextures[1], 9u/*unique to actor2*/, TEST_LOCATION );
605 DALI_TEST_EQUALS( boundTextures[2], 8u/*unique to actor1*/, TEST_LOCATION );
608 // Both actors are now connected to the root node
609 // Setup 2 render-tasks - the first will render from the root-node, and the second from actor2
611 // Not exclusive is the default
612 RenderTask task1 = taskList.GetTask( 0u );
613 DALI_TEST_CHECK( false == task1.IsExclusive() );
615 RenderTask task2 = taskList.CreateTask();
616 DALI_TEST_CHECK( false == task2.IsExclusive() );
617 task2.SetSourceActor( actor2 );
619 // Task1 should render all actors, and task 2 should render only actor2
621 application.GetGlAbstraction().ClearBoundTextures();
622 application.SendNotification();
623 application.Render();
625 DALI_TEST_EQUALS( boundTextures.size(), 4u, TEST_LOCATION );
627 if ( boundTextures.size() == 4 )
629 // Test that task 1 renders actor3, then actor2 & then actor1
630 DALI_TEST_CHECK( boundTextures[0] == 10u );
631 DALI_TEST_CHECK( boundTextures[1] == 9u );
632 DALI_TEST_CHECK( boundTextures[2] == 8u );
634 // Test that task 2 renders actor2
635 DALI_TEST_EQUALS( boundTextures[3], 9u, TEST_LOCATION );
638 // Make actor2 exclusive to task2
640 task2.SetExclusive( true );
641 DALI_TEST_CHECK( true == task2.IsExclusive() );
643 // Task1 should render only actor1, and task 2 should render only actor2
645 application.GetGlAbstraction().ClearBoundTextures();
646 application.SendNotification();
647 application.Render();
649 DALI_TEST_EQUALS( boundTextures.size(), 3u, TEST_LOCATION );
650 if ( boundTextures.size() == 3 )
652 // Test that task 1 renders actor3 & actor1
653 DALI_TEST_CHECK( boundTextures[0] == 10u );
654 DALI_TEST_CHECK( boundTextures[1] == 8u );
656 // Test that task 2 renders actor2
657 DALI_TEST_CHECK( boundTextures[2] == 9u );
662 int UtcDaliRenderTaskIsExclusive(void)
664 TestApplication application;
666 tet_infoline("Testing RenderTask::IsExclusive()");
668 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
670 // Not exclusive is the default
671 RenderTask task = taskList.GetTask( 0u );
672 DALI_TEST_CHECK( false == task.IsExclusive() );
674 RenderTask newTask = taskList.CreateTask();
675 DALI_TEST_CHECK( false == newTask.IsExclusive() );
679 int UtcDaliRenderTaskSetInputEnabled(void)
681 TestApplication application;
683 tet_infoline("Testing RenderTask::SetInputEnabled()");
685 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
687 // Input is enabled by default
688 RenderTask task = taskList.GetTask( 0u );
689 DALI_TEST_CHECK( true == task.GetInputEnabled() );
691 task.SetInputEnabled( false );
692 DALI_TEST_CHECK( false == task.GetInputEnabled() );
694 task.SetInputEnabled( true );
695 DALI_TEST_CHECK( true == task.GetInputEnabled() );
699 int UtcDaliRenderTaskGetInputEnabled(void)
701 TestApplication application;
703 tet_infoline("Testing RenderTask::GetInputEnabled()");
705 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
707 // Input is enabled by default
708 RenderTask task = taskList.GetTask( 0u );
709 DALI_TEST_CHECK( true == task.GetInputEnabled() );
711 RenderTask newTask = taskList.CreateTask();
712 DALI_TEST_CHECK( true == newTask.GetInputEnabled() );
716 int UtcDaliRenderTaskSetCameraActor(void)
718 TestApplication application;
720 tet_infoline("Testing RenderTask::SetCameraActor()");
722 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
724 RenderTask task = taskList.GetTask( 0u );
726 Actor actor = task.GetCameraActor();
727 DALI_TEST_CHECK( actor );
729 CameraActor newActor = CameraActor::New();
730 DALI_TEST_CHECK( newActor );
732 task.SetCameraActor( newActor );
733 DALI_TEST_CHECK( task.GetCameraActor() != actor );
734 DALI_TEST_CHECK( task.GetCameraActor() == newActor );
738 int UtcDaliRenderTaskGetCameraActor(void)
740 TestApplication application;
742 tet_infoline("Testing RenderTask::GetCameraActor()");
744 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
746 RenderTask task = taskList.GetTask( 0u );
748 Actor actor = task.GetCameraActor();
749 DALI_TEST_CHECK( actor );
751 RenderTask newTask = taskList.CreateTask();
752 DALI_TEST_CHECK( actor == newTask.GetCameraActor() );
756 int UtcDaliRenderTaskSetTargetFrameBuffer(void)
758 TestApplication application;
760 tet_infoline("Testing RenderTask::SetTargetFrameBuffer()");
762 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
764 RenderTask task = taskList.GetTask( 0u );
766 // By default render-tasks do not render off-screen
767 FrameBufferImage image = task.GetTargetFrameBuffer();
768 DALI_TEST_CHECK( !image );
770 FrameBufferImage newImage = FrameBufferImage::New();
772 task.SetTargetFrameBuffer( newImage );
773 DALI_TEST_CHECK( task.GetTargetFrameBuffer() == newImage );
777 int UtcDaliRenderTaskGetTargetFrameBuffer(void)
779 TestApplication application;
781 tet_infoline("Testing RenderTask::GetTargetFrameBuffer()");
783 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
785 RenderTask task = taskList.GetTask( 0u );
787 // By default render-tasks do not render off-screen
788 FrameBufferImage image = task.GetTargetFrameBuffer();
789 DALI_TEST_CHECK( !image );
791 RenderTask newTask = taskList.CreateTask();
792 DALI_TEST_CHECK( !newTask.GetTargetFrameBuffer() );
796 int UtcDaliRenderTaskSetScreenToFrameBufferFunction(void)
798 TestApplication application;
800 tet_infoline("Testing RenderTask::SetScreenToFrameBufferFunction()");
802 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
804 RenderTask task = taskList.GetTask( 0u );
806 task.SetScreenToFrameBufferFunction( TestScreenToFrameBufferFunction );
808 Vector2 coordinates( 5, 10 );
809 Vector2 convertedCoordinates( 6, 12 ); // + Vector(1, 2)
811 RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction();
812 DALI_TEST_CHECK( func( coordinates ) );
813 DALI_TEST_CHECK( coordinates == convertedCoordinates );
815 task.SetScreenToFrameBufferFunction( RenderTask::FULLSCREEN_FRAMEBUFFER_FUNCTION );
816 func = task.GetScreenToFrameBufferFunction();
817 DALI_TEST_CHECK( func( coordinates ) );
819 task.SetScreenToFrameBufferFunction( RenderTask::DEFAULT_SCREEN_TO_FRAMEBUFFER_FUNCTION );
820 func = task.GetScreenToFrameBufferFunction();
821 DALI_TEST_CHECK( ! func( coordinates ) );
825 int UtcDaliRenderTaskGetScreenToFrameBufferFunction(void)
827 TestApplication application;
829 tet_infoline("Testing RenderTask::GetScreenToFrameBufferFunction()");
831 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
833 RenderTask task = taskList.GetTask( 0u );
835 Vector2 originalCoordinates( 5, 10 );
836 Vector2 coordinates( 5, 10 );
838 RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction();
839 DALI_TEST_CHECK( !func( coordinates ) ); // conversion should fail by default
840 DALI_TEST_CHECK( coordinates == originalCoordinates ); // coordinates should not be modified
845 int UtcDaliRenderTaskGetScreenToFrameBufferMappingActor(void)
847 TestApplication application;
848 tet_infoline("Testing RenderTask::GetScreenToFrameBufferMappingActor ");
850 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
851 RenderTask renderTask = taskList.CreateTask();
852 Actor mappingActor = Actor::New();
853 renderTask.SetScreenToFrameBufferMappingActor(mappingActor);
855 DALI_TEST_CHECK( mappingActor == renderTask.GetScreenToFrameBufferMappingActor() );
859 int UtcDaliRenderTaskSetViewport(void)
861 TestApplication application;
863 tet_infoline("Testing RenderTask::SetViewport()");
865 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
867 RenderTask task = taskList.GetTask( 0u );
869 Viewport viewport = task.GetViewport();
871 // By default the viewport should match the stage width/height
873 Vector2 stageSize = Stage::GetCurrent().GetSize();
874 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
875 DALI_TEST_CHECK( viewport == expectedViewport );
877 Viewport newViewport( 0, 0, stageSize.width * 0.5f, stageSize.height * 0.5f );
878 task.SetViewport( newViewport );
880 // Update (viewport is a property)
881 application.SendNotification();
882 application.Render();
884 DALI_TEST_CHECK( task.GetViewport() == newViewport );
888 int UtcDaliRenderTaskGetViewport(void)
890 TestApplication application;
892 tet_infoline("Testing RenderTask::GetViewport()");
894 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
896 RenderTask task = taskList.GetTask( 0u );
898 Viewport viewport = task.GetViewport();
900 // By default the viewport should match the stage width/height
902 Vector2 stageSize = Stage::GetCurrent().GetSize();
903 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
904 DALI_TEST_CHECK( viewport == expectedViewport );
906 RenderTask newTask = taskList.CreateTask();
907 DALI_TEST_CHECK( newTask.GetViewport() == expectedViewport );
911 int UtcDaliRenderTaskSetViewportPosition(void)
913 TestApplication application;
915 tet_infoline("Testing RenderTask::SetViewportPosition()");
917 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
919 RenderTask task = taskList.GetTask( 0u );
921 Viewport viewport = task.GetViewport();
923 // By default the viewport should match the stage width/height
925 Vector2 stageSize = Stage::GetCurrent().GetSize();
926 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
927 DALI_TEST_CHECK( viewport == expectedViewport );
930 Vector2 newPosition(25.0f, 50.0f);
931 task.SetViewportPosition( newPosition );
933 // Update (viewport is a property)
934 application.SendNotification();
935 application.Render();
937 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition, Math::MACHINE_EPSILON_1, TEST_LOCATION );
939 // Set by Property test
940 Vector2 newPosition2(32.0f, 32.0f);
941 task.SetProperty( RenderTask::VIEWPORT_POSITION, newPosition2 );
944 application.SendNotification();
945 application.Render();
947 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition2, Math::MACHINE_EPSILON_1, TEST_LOCATION );
949 Vector2 newPosition3(64.0f, 0.0f);
950 Animation animation = Animation::New(1.0f);
951 animation.AnimateTo( Property( task, RenderTask::VIEWPORT_POSITION ), newPosition3, AlphaFunctions::Linear );
954 // Perform 1000ms worth of updates at which point animation should have completed.
955 Wait(application, 1000);
956 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
960 int UtcDaliRenderTaskSetViewportSize(void)
962 TestApplication application;
964 tet_infoline("Testing RenderTask::SetViewportSize()");
966 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
968 RenderTask task = taskList.GetTask( 0u );
970 Viewport viewport = task.GetViewport();
972 // By default the viewport should match the stage width/height
974 Vector2 stageSize = Stage::GetCurrent().GetSize();
975 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
976 DALI_TEST_CHECK( viewport == expectedViewport );
978 Vector2 newSize(128.0f, 64.0f);
979 task.SetViewportSize( newSize );
981 // Update (viewport is a property)
982 application.SendNotification();
983 application.Render();
985 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize, Math::MACHINE_EPSILON_1, TEST_LOCATION );
987 // Set by Property test
988 Vector2 newSize2(50.0f, 50.0f);
989 task.SetProperty( RenderTask::VIEWPORT_SIZE, newSize2 );
992 application.SendNotification();
993 application.Render();
995 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize2, Math::MACHINE_EPSILON_1, TEST_LOCATION );
997 Vector2 newSize3(10.0f, 10.0f);
998 Animation animation = Animation::New(1.0f);
999 animation.AnimateTo( Property( task, RenderTask::VIEWPORT_SIZE ), newSize3, AlphaFunctions::Linear );
1002 // Perform 1000ms worth of updates at which point animation should have completed.
1003 Wait(application, 1000);
1004 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1009 int UtcDaliRenderTaskSetClearColor(void)
1011 TestApplication application;
1013 tet_infoline("Testing RenderTask::SetClearColor()");
1015 Vector4 testColor( 1.0f, 2.0f, 3.0f, 4.0f );
1016 Vector4 testColor2( 5.0f, 6.0f, 7.0f, 8.0f );
1018 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1020 RenderTask task = taskList.GetTask( 0u );
1021 DALI_TEST_CHECK( task.GetClearColor() != testColor );
1023 task.SetClearColor( testColor );
1028 DALI_TEST_EQUALS( task.GetClearColor(), testColor, TEST_LOCATION );
1030 task.SetProperty( RenderTask::CLEAR_COLOR, testColor2 );
1035 DALI_TEST_EQUALS( task.GetClearColor(), testColor2, TEST_LOCATION );
1039 int UtcDaliRenderTaskGetClearColor(void)
1041 TestApplication application;
1043 tet_infoline("Testing RenderTask::GetClearColor()");
1045 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1046 RenderTask task = taskList.GetTask( 0u );
1047 DALI_TEST_EQUALS( task.GetClearColor(), RenderTask::DEFAULT_CLEAR_COLOR, TEST_LOCATION );
1051 int UtcDaliRenderTaskSetClearEnabled(void)
1053 TestApplication application;
1055 tet_infoline("Testing RenderTask::SetClearEnabled()");
1057 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1059 RenderTask task = taskList.GetTask( 0u );
1060 DALI_TEST_CHECK( !task.GetClearEnabled() ); // defaults to false
1062 task.SetClearEnabled( true );
1063 DALI_TEST_EQUALS( task.GetClearEnabled(), true, TEST_LOCATION );
1065 task.SetClearEnabled( false );
1066 DALI_TEST_EQUALS( task.GetClearEnabled(), false, TEST_LOCATION );
1070 int UtcDaliRenderTaskGetClearEnabled(void)
1072 TestApplication application;
1074 tet_infoline("Testing RenderTask::GetClearEnabled()");
1076 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1078 RenderTask task = taskList.GetTask( 0u );
1079 DALI_TEST_CHECK( !task.GetClearEnabled() ); // defaults to false
1083 int UtcDaliRenderTaskSetRefreshRate(void)
1085 TestApplication application;
1087 tet_infoline("Testing RenderTask::SetRefreshRate()");
1089 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1091 // By default tasks will be processed every frame
1092 RenderTask task = taskList.GetTask( 0u );
1093 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
1095 task.SetRefreshRate( 2u ); // every-other frame
1096 DALI_TEST_CHECK( 2u == task.GetRefreshRate() );
1098 task.SetRefreshRate( RenderTask::REFRESH_ALWAYS );
1099 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
1103 int UtcDaliRenderTaskGetRefreshRate(void)
1105 TestApplication application;
1107 tet_infoline("Testing RenderTask::GetRefreshRate()");
1109 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1111 // By default tasks will be processed every frame
1112 RenderTask task = taskList.GetTask( 0u );
1113 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
1115 RenderTask newTask = taskList.CreateTask();
1116 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == newTask.GetRefreshRate() );
1120 int UtcDaliRenderTaskSignalFinished(void)
1122 TestApplication application;
1124 tet_infoline("Testing RenderTask::SignalFinished()");
1126 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1127 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1129 CameraActor offscreenCameraActor = CameraActor::New();
1131 Stage::GetCurrent().Add( offscreenCameraActor );
1133 BitmapImage image = BitmapImage::New( 10, 10 );
1134 ImageActor rootActor = ImageActor::New( image );
1135 rootActor.SetSize( 10, 10 );
1136 Stage::GetCurrent().Add( rootActor );
1138 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1139 NativeImageInterfacePtr testNativeImagePtr = TestNativeImage::New(10, 10);
1140 FrameBufferImage frameBufferImage = FrameBufferImage::New( *testNativeImagePtr.Get() );
1142 // Flush all outstanding messages
1143 application.SendNotification();
1144 application.Render();
1146 RenderTask newTask = taskList.CreateTask();
1147 newTask.SetCameraActor( offscreenCameraActor );
1148 newTask.SetSourceActor( rootActor );
1149 newTask.SetInputEnabled( false );
1150 newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
1151 newTask.SetClearEnabled( true );
1152 newTask.SetExclusive( true );
1153 newTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
1154 newTask.SetTargetFrameBuffer( frameBufferImage );
1156 // Framebuffer doesn't actually get created until Connected, i.e. by previous line
1158 bool finished = false;
1159 RenderTaskFinished renderTaskFinished( finished );
1160 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1162 // Flush the queue and render.
1163 application.SendNotification();
1165 // 1 render to process render task, then wait for sync before finished msg is sent
1166 // from update to the event thread.
1168 application.Render();
1169 application.SendNotification();
1170 DALI_TEST_CHECK( !finished );
1172 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1173 DALI_TEST_CHECK( lastSyncObj != NULL );
1175 application.Render();
1176 DALI_TEST_EQUALS( (application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
1177 application.SendNotification();
1178 DALI_TEST_CHECK( !finished );
1180 application.Render();
1181 DALI_TEST_EQUALS( (application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
1182 application.SendNotification();
1183 DALI_TEST_CHECK( ! finished );
1185 sync.SetObjectSynced( lastSyncObj, true );
1187 application.Render();
1188 application.SendNotification();
1189 DALI_TEST_CHECK( !finished );
1191 application.Render();
1192 application.SendNotification();
1193 DALI_TEST_CHECK( finished );
1196 application.Render(); // Double check no more finished signal
1197 application.SendNotification();
1198 DALI_TEST_CHECK( ! finished );
1203 int UtcDaliRenderTaskContinuous01(void)
1205 TestApplication application;
1207 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (source actor not staged)\nPOST:continuous renders, no Finished signal");
1209 // SETUP AN OFFSCREEN RENDER TASK
1210 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1211 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1212 drawTrace.Enable(true);
1214 Actor rootActor = Actor::New();
1215 Stage::GetCurrent().Add( rootActor );
1217 CameraActor offscreenCameraActor = CameraActor::New();
1218 Stage::GetCurrent().Add( offscreenCameraActor );
1220 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1221 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1222 Integration::ResourceId imageRequestId = imageRequest->GetId();
1223 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1225 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1226 bool finished = false;
1227 RenderTaskFinished renderTaskFinished( finished );
1228 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1229 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1230 application.SendNotification();
1232 // START PROCESS/RENDER Input, Expected Input, Expected, KeepUpdating
1233 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1234 application.GetPlatform().ClearReadyResources();
1236 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false ) );
1238 // ADD SOURCE ACTOR TO STAGE - expect continuous renders to start, no finished signal
1239 Stage::GetCurrent().Add(secondRootActor);
1240 application.SendNotification();
1242 // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
1243 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1244 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1249 int UtcDaliRenderTaskContinuous02(void)
1251 TestApplication application;
1253 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (source actor not visible)\nPOST:continuous renders, no Finished signal");
1255 // SETUP AN OFFSCREEN RENDER TASK
1256 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1257 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1258 drawTrace.Enable(true);
1260 Actor rootActor = Actor::New();
1261 Stage::GetCurrent().Add( rootActor );
1263 CameraActor offscreenCameraActor = CameraActor::New();
1264 Stage::GetCurrent().Add( offscreenCameraActor );
1266 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1267 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1268 Integration::ResourceId imageRequestId = imageRequest->GetId();
1269 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1270 Stage::GetCurrent().Add(secondRootActor);
1271 secondRootActor.SetVisible(false);
1273 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1274 bool finished = false;
1275 RenderTaskFinished renderTaskFinished( finished );
1276 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1277 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1278 application.SendNotification();
1280 // START PROCESS/RENDER Input, Expected Input, Expected
1281 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1282 application.GetPlatform().ClearReadyResources();
1283 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false ) );
1285 // MAKE SOURCE ACTOR VISIBLE - expect continuous renders to start, no finished signal
1286 secondRootActor.SetVisible(true);
1287 application.SendNotification();
1289 // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
1290 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1291 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1295 int UtcDaliRenderTaskContinuous03(void)
1297 TestApplication application;
1299 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (camera actor not staged)\nPOST:continuous renders, no Finished signal");
1301 // SETUP AN OFFSCREEN RENDER TASK
1302 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1303 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1304 drawTrace.Enable(true);
1306 Actor rootActor = Actor::New();
1307 Stage::GetCurrent().Add( rootActor );
1309 CameraActor offscreenCameraActor = CameraActor::New();
1310 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1311 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1312 Integration::ResourceId imageRequestId = imageRequest->GetId();
1313 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1314 Stage::GetCurrent().Add(secondRootActor);
1316 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1317 bool finished = false;
1318 RenderTaskFinished renderTaskFinished( finished );
1319 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1320 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1321 application.SendNotification();
1323 // START PROCESS/RENDER Input, Expected Input, Expected
1324 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1325 application.GetPlatform().ClearReadyResources();
1326 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false ) );
1328 // ADD CAMERA ACTOR TO STAGE - expect continuous renders to start, no finished signal
1329 Stage::GetCurrent().Add( offscreenCameraActor );
1330 application.SendNotification();
1332 // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
1333 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1334 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1339 int UtcDaliRenderTaskContinuous04(void)
1341 TestApplication application;
1343 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: Resource not ready\nPOST:continuous renders, no Finished signal");
1345 // SETUP AN OFFSCREEN RENDER TASK
1346 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1347 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1348 drawTrace.Enable(true);
1350 Actor rootActor = Actor::New();
1351 Stage::GetCurrent().Add( rootActor );
1353 CameraActor offscreenCameraActor = CameraActor::New();
1354 Stage::GetCurrent().Add( offscreenCameraActor );
1355 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1356 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1357 Integration::ResourceId imageRequestId = imageRequest->GetId();
1358 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1359 Stage::GetCurrent().Add(secondRootActor);
1361 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1362 bool finished = false;
1363 RenderTaskFinished renderTaskFinished( finished );
1364 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1365 application.SendNotification();
1367 // START PROCESS/RENDER Input, Expected Input, Expected
1368 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1369 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1371 // FINISH RESOURCE LOADING - expect 'continuous' renders to start, no finished signal
1372 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1373 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1378 int UtcDaliRenderTaskOnce01(void)
1380 TestApplication application;
1382 tet_infoline("Testing RenderTask Render Once GlSync, using loading image\nPRE: Resources not ready, Source not visible\nPOST: Finished signal sent once only");
1384 // SETUP AN OFFSCREEN RENDER TASK
1385 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1386 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1387 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1388 drawTrace.Enable(true);
1390 Actor rootActor = Actor::New();
1391 Stage::GetCurrent().Add( rootActor );
1393 CameraActor offscreenCameraActor = CameraActor::New();
1394 Stage::GetCurrent().Add( offscreenCameraActor );
1395 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1396 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1397 Integration::ResourceId imageRequestId = imageRequest->GetId();
1398 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1400 Stage::GetCurrent().Add(secondRootActor);
1401 secondRootActor.SetVisible(false);
1403 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, true);
1404 bool finished = false;
1405 RenderTaskFinished renderTaskFinished( finished );
1406 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1407 application.SendNotification();
1409 // START PROCESS/RENDER Input, Expected Input, Expected
1410 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1411 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1413 // MAKE SOURCE VISIBLE
1414 secondRootActor.SetVisible(true);
1415 application.SendNotification();
1416 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1417 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1419 // FINISH RESOURCE LOADING - expect no rendering yet
1420 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1421 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1422 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1423 DALI_TEST_CHECK( lastSyncObj != NULL );
1425 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1426 application.GetPlatform().ClearReadyResources();
1427 sync.SetObjectSynced( lastSyncObj, true );
1428 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1429 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1433 int UtcDaliRenderTaskOnce02(void)
1435 TestApplication application;
1437 tet_infoline("Testing RenderTask Render Once GlSync, using loading image. Switch from render always after ready to render once\n"
1438 "PRE: Render task ready, Image not loaded\n"
1439 "POST: Finished signal sent only once");
1441 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1442 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1443 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1444 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1445 drawTrace.Enable(true);
1447 Actor rootActor = Actor::New();
1448 Stage::GetCurrent().Add( rootActor );
1450 CameraActor offscreenCameraActor = CameraActor::New();
1451 Stage::GetCurrent().Add( offscreenCameraActor );
1452 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1453 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1454 Integration::ResourceId imageRequestId = imageRequest->GetId();
1455 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1456 Stage::GetCurrent().Add(secondRootActor);
1458 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1459 bool finished = false;
1460 RenderTaskFinished renderTaskFinished( finished );
1461 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1462 application.SendNotification();
1464 // START PROCESS/RENDER Input, Expected Input, Expected
1465 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1466 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1468 // FINISH RESOURCE LOADING
1469 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1470 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1471 application.GetPlatform().ClearReadyResources();
1472 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1474 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1475 application.SendNotification(); // Input, Expected Input, Expected
1476 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1477 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1478 DALI_TEST_CHECK( lastSyncObj != NULL );
1480 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1481 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1482 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1483 sync.SetObjectSynced( lastSyncObj, true );
1484 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1485 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1491 int UtcDaliRenderTaskOnce03(void)
1493 TestApplication application;
1495 tet_infoline("Testing RenderTask Render Once GlSync\n"
1496 "Switch from Render always after ready to render once with resources unready\n"
1497 "PRE: Everything ready to render\n"
1498 "POST: Finished signal sent once");
1500 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1501 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1502 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1503 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1504 drawTrace.Enable(true);
1506 Actor rootActor = Actor::New();
1507 Stage::GetCurrent().Add( rootActor );
1509 CameraActor offscreenCameraActor = CameraActor::New();
1510 Stage::GetCurrent().Add( offscreenCameraActor );
1511 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1512 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1513 Integration::ResourceId imageRequestId = imageRequest->GetId();
1514 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1515 Stage::GetCurrent().Add(secondRootActor);
1517 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1518 bool finished = false;
1519 RenderTaskFinished renderTaskFinished( finished );
1520 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1521 application.SendNotification();
1523 // START PROCESS/RENDER Input, Expected Input, Expected
1524 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1525 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1527 // CHANGE TO RENDER ONCE
1528 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1529 application.SendNotification(); // Input, Expected Input, Expected
1530 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1531 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1533 // FINISH RESOURCE LOADING
1534 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1535 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1536 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1537 DALI_TEST_CHECK( lastSyncObj != NULL );
1538 application.GetPlatform().ClearReadyResources();
1540 sync.SetObjectSynced( lastSyncObj, true );
1541 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1542 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1548 //int UtcDaliRenderTaskOnce04(void)
1550 TestApplication application;
1552 tet_infoline("Testing RenderTask Render Once GlSync\n"
1553 "During RenderOnce, make ready resources unready before sending first finished signal\n"
1554 "PRE: Everything ready.\n"
1555 "POST: Finished signal sent only once");
1557 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1558 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1559 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1560 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1561 drawTrace.Enable(true);
1563 Actor rootActor = Actor::New();
1564 Stage::GetCurrent().Add( rootActor );
1566 CameraActor offscreenCameraActor = CameraActor::New();
1567 Stage::GetCurrent().Add( offscreenCameraActor );
1568 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1569 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1570 Integration::ResourceId imageRequestId = imageRequest->GetId();
1571 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1572 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1573 application.Render();
1575 Stage::GetCurrent().Add(secondRootActor);
1576 application.GetPlatform().ClearReadyResources();
1578 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1579 bool finished = false;
1580 RenderTaskFinished renderTaskFinished( finished );
1581 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1582 application.SendNotification();
1584 // START PROCESS/RENDER Input, Expected Input, Expected
1585 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1586 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1588 // CHANGE TO RENDER ONCE, RESOURCES BECOME NOT READY
1589 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1592 ReloadImage(application, secondRootActor.GetImage());
1593 application.SendNotification(); // Input, Expected Input, Expected
1595 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1596 DALI_TEST_EQUALS( secondRootActor.GetImage().GetLoadingState(), Dali::ResourceLoading, TEST_LOCATION);
1597 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1599 // FINISH RESOURCE LOADING
1600 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1601 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1602 application.GetPlatform().ClearReadyResources();
1603 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1604 DALI_TEST_CHECK( lastSyncObj != NULL );
1606 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1607 sync.SetObjectSynced( lastSyncObj, true );
1608 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1609 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, true ) );
1611 // Finished rendering - expect no more renders, no more signals:
1612 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1613 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1614 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1615 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1616 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1617 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1622 int UtcDaliRenderTaskOnce05(void)
1624 TestApplication application;
1626 tet_infoline("Testing RenderTask Render Once GLSync\n"
1627 "Render once, Second call to SetRefreshRate(ONCE) triggers only one more finished signal\n"
1628 "PRE: Everything ready\n"
1629 "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)");
1631 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1632 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1633 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1634 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1635 drawTrace.Enable(true);
1637 Actor rootActor = Actor::New();
1638 Stage::GetCurrent().Add( rootActor );
1640 CameraActor offscreenCameraActor = CameraActor::New();
1641 Stage::GetCurrent().Add( offscreenCameraActor );
1642 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1643 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1644 Integration::ResourceId imageRequestId = imageRequest->GetId();
1645 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1646 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1647 application.Render();
1648 application.GetPlatform().ClearReadyResources();
1650 Stage::GetCurrent().Add(secondRootActor);
1652 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1653 bool finished = false;
1654 RenderTaskFinished renderTaskFinished( finished );
1655 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1656 application.SendNotification();
1658 // START PROCESS/RENDER Input, Expected Input, Expected
1659 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1660 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1662 // CHANGE TO RENDER ONCE,
1663 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1664 application.SendNotification();
1665 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1666 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1667 DALI_TEST_CHECK( lastSyncObj != NULL );
1669 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1670 sync.SetObjectSynced( lastSyncObj, true );
1671 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1672 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1674 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1675 application.SendNotification();
1676 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1677 lastSyncObj = sync.GetLastSyncObject();
1678 DALI_TEST_CHECK( lastSyncObj != NULL );
1680 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1681 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1682 sync.SetObjectSynced( lastSyncObj, true );
1683 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1684 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1688 int UtcDaliRenderTaskOnce06(void)
1690 TestApplication application;
1692 tet_infoline("Testing RenderTask Render Once GLSync\n"
1693 "Render once, Call to SetRefreshRate(ONCE) in Finished signal callback triggers "
1694 "another render & another finished signal\n"
1695 "PRE: Everything ready\n"
1696 "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)");
1699 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1700 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1701 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1702 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1703 drawTrace.Enable(true);
1705 Actor rootActor = Actor::New();
1706 Stage::GetCurrent().Add( rootActor );
1708 CameraActor offscreenCameraActor = CameraActor::New();
1709 Stage::GetCurrent().Add( offscreenCameraActor );
1710 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1711 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1712 Integration::ResourceId imageRequestId = imageRequest->GetId();
1713 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1714 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1715 application.Render();
1716 application.GetPlatform().ClearReadyResources();
1718 Stage::GetCurrent().Add(secondRootActor);
1720 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1721 bool finished = false;
1723 ConnectionTracker connectionTracker;
1724 RenderTaskFinishedRenderAgain renderTaskFinishedRenderAgain( finished );
1725 newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinishedRenderAgain );
1727 application.SendNotification();
1729 // Expect 2 frames to be drawn.
1730 // START PROCESS/RENDER Input, Expected Input, Expected
1731 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1732 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1733 DALI_TEST_CHECK( lastSyncObj == NULL );
1734 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1736 // CHANGE TO RENDER ONCE,
1737 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1738 application.SendNotification();
1739 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1740 lastSyncObj = sync.GetLastSyncObject();
1741 DALI_TEST_CHECK( lastSyncObj != NULL );
1743 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1744 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1746 sync.SetObjectSynced( lastSyncObj, true );
1747 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1748 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1749 application.SendNotification();
1751 // Expect SetRefreshRate to have been called again
1752 // Prevent next finished signal calling refresh once again
1753 RenderTaskFinished renderTaskFinished( finished );
1754 connectionTracker.DisconnectAll();
1755 newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinished );
1756 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1757 lastSyncObj = sync.GetLastSyncObject();
1758 DALI_TEST_CHECK( lastSyncObj != NULL );
1760 sync.SetObjectSynced( lastSyncObj, true );
1761 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1762 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1767 int UtcDaliRenderTaskOnce07(void)
1769 TestApplication application;
1771 tet_infoline("Testing RenderTask Render Once GlSync\n"
1772 "SetRefreshRate(ONCE) again before first finished signal has been sent.\n"
1773 "PRE: resources ready\n"
1774 "POST: Only 1 finished signal sent.");
1776 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1777 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1778 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1779 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1780 drawTrace.Enable(true);
1782 Actor rootActor = Actor::New();
1783 Stage::GetCurrent().Add( rootActor );
1785 CameraActor offscreenCameraActor = CameraActor::New();
1786 Stage::GetCurrent().Add( offscreenCameraActor );
1787 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1788 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1789 Integration::ResourceId imageRequestId = imageRequest->GetId();
1790 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1791 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1792 application.Render();
1793 application.GetPlatform().ClearReadyResources();
1795 Stage::GetCurrent().Add(secondRootActor);
1797 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1798 bool finished = false;
1799 RenderTaskFinished renderTaskFinished( finished );
1800 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1801 application.SendNotification();
1803 // START PROCESS/RENDER Input, Expected Input, Expected
1804 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1805 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1807 // CHANGE TO RENDER ONCE,
1808 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1809 application.SendNotification();
1810 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1811 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1812 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1814 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1815 application.SendNotification();
1816 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1817 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1818 DALI_TEST_CHECK( lastSyncObj != NULL );
1820 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1821 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1822 sync.SetObjectSynced( lastSyncObj, true );
1823 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1824 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1831 int UtcDaliRenderTaskOnce08(void)
1833 TestApplication application;
1835 tet_infoline("Testing RenderTask Render Once GlSync\n"
1836 "SetRefreshRate(ONCE), resource load failed completes render task.\n"
1837 "PRE: resources not ready\n"
1838 "POST: Only 1 finished signal sent.");
1840 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1841 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1842 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1843 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1844 drawTrace.Enable(true);
1846 Actor rootActor = Actor::New();
1847 Stage::GetCurrent().Add( rootActor );
1849 CameraActor offscreenCameraActor = CameraActor::New();
1850 Stage::GetCurrent().Add( offscreenCameraActor );
1851 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1852 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1853 Integration::ResourceId imageRequestId = imageRequest->GetId();
1854 Stage::GetCurrent().Add(secondRootActor);
1856 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1857 bool finished = false;
1858 RenderTaskFinished renderTaskFinished( finished );
1859 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1860 application.SendNotification();
1862 // START PROCESS/RENDER Input, Expected Input, Expected
1863 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1864 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1866 // CHANGE TO RENDER ONCE,
1867 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1868 application.SendNotification();
1869 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1870 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1871 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1873 tet_printf(" FailImageLoad\n");
1875 FailImageLoad(application, imageRequestId); // Need to run Update again for this to complete
1876 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); // nothing to draw
1877 application.SendNotification();
1879 // Drawing empty framebuffer, so will still get a GL sync
1880 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1881 DALI_TEST_CHECK( lastSyncObj != NULL );
1883 // Expect finished signal, as all resources are complete
1884 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, true, false ) );
1891 int UtcDaliRenderTaskOnceNoSync01(void)
1893 TestApplication application;
1895 tet_infoline("Testing RenderTask Render Once, using loading image\nPRE: Resources not ready, Source not visible\nPOST: Finished signal sent once only");
1897 // SETUP AN OFFSCREEN RENDER TASK
1898 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1899 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1900 drawTrace.Enable(true);
1902 Actor rootActor = Actor::New();
1903 Stage::GetCurrent().Add( rootActor );
1905 CameraActor offscreenCameraActor = CameraActor::New();
1906 Stage::GetCurrent().Add( offscreenCameraActor );
1907 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1908 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1909 Integration::ResourceId imageRequestId = imageRequest->GetId();
1910 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1912 Stage::GetCurrent().Add(secondRootActor);
1913 secondRootActor.SetVisible(false);
1915 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, false);
1916 bool finished = false;
1917 RenderTaskFinished renderTaskFinished( finished );
1918 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1919 application.SendNotification();
1921 // START PROCESS/RENDER Input, Expected Input, Expected
1922 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1923 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1925 // MAKE SOURCE VISIBLE
1926 secondRootActor.SetVisible(true);
1927 application.SendNotification();
1928 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1929 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1931 // FINISH RESOURCE LOADING - expect immediate rendering yet
1932 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1933 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1934 application.GetPlatform().ClearReadyResources();
1935 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1939 int UtcDaliRenderTaskOnceNoSync02(void)
1941 TestApplication application;
1943 tet_infoline("Testing RenderTask Render Once, using loading image. Switch from render always after ready to render once\n"
1944 "PRE: Render task ready, Image not loaded\n"
1945 "POST: Finished signal sent only once");
1947 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1948 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1949 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1950 drawTrace.Enable(true);
1952 Actor rootActor = Actor::New();
1953 Stage::GetCurrent().Add( rootActor );
1955 CameraActor offscreenCameraActor = CameraActor::New();
1956 Stage::GetCurrent().Add( offscreenCameraActor );
1957 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1958 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1959 Integration::ResourceId imageRequestId = imageRequest->GetId();
1960 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1961 Stage::GetCurrent().Add(secondRootActor);
1963 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
1964 bool finished = false;
1965 RenderTaskFinished renderTaskFinished( finished );
1966 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1967 application.SendNotification();
1969 // START PROCESS/RENDER Input, Expected Input, Expected
1970 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1971 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1973 // FINISH RESOURCE LOADING
1974 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1975 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1976 application.GetPlatform().ClearReadyResources();
1978 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1979 application.SendNotification(); // Input, Expected Input, Expected
1980 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1981 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1986 int UtcDaliRenderTaskOnceNoSync03(void)
1988 TestApplication application;
1990 tet_infoline("Testing RenderTask Render Once\n"
1991 "Switch from Render always after ready to render once with resources unready\n"
1992 "PRE: Everything ready to render\n"
1993 "POST: Finished signal sent once");
1995 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1996 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1997 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1998 drawTrace.Enable(true);
2000 Actor rootActor = Actor::New();
2001 Stage::GetCurrent().Add( rootActor );
2003 CameraActor offscreenCameraActor = CameraActor::New();
2004 Stage::GetCurrent().Add( offscreenCameraActor );
2005 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
2006 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2007 Integration::ResourceId imageRequestId = imageRequest->GetId();
2008 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2009 Stage::GetCurrent().Add(secondRootActor);
2011 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2012 bool finished = false;
2013 RenderTaskFinished renderTaskFinished( finished );
2014 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2015 application.SendNotification();
2017 // START PROCESS/RENDER Input, Expected Input, Expected
2018 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2019 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2021 // CHANGE TO RENDER ONCE
2022 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2023 application.SendNotification(); // 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, true ) );
2030 application.GetPlatform().ClearReadyResources();
2031 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2036 //int UtcDaliRenderTaskOnceNoSync04(void)
2038 TestApplication application;
2040 tet_infoline("Testing RenderTask Render Once\n"
2041 "During RenderOnce, make ready resources unready before sending first finished signal\n"
2042 "PRE: Everything ready.\n"
2043 "POST: Finished signal sent only once");
2045 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2046 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2047 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2048 drawTrace.Enable(true);
2050 Actor rootActor = Actor::New();
2051 Stage::GetCurrent().Add( rootActor );
2053 CameraActor offscreenCameraActor = CameraActor::New();
2054 Stage::GetCurrent().Add( offscreenCameraActor );
2055 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
2056 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2057 Integration::ResourceId imageRequestId = imageRequest->GetId();
2058 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2059 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2060 application.Render();
2061 application.GetPlatform().ClearReadyResources();
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, true, finished, false, true ) );
2073 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
2075 // CHANGE TO RENDER ONCE, RESOURCES BECOME NOT READY
2076 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2079 ReloadImage(application, secondRootActor.GetImage());
2080 application.SendNotification(); // Input, Expected Input, Expected
2082 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2083 DALI_TEST_EQUALS( secondRootActor.GetImage().GetLoadingState(), Dali::ResourceLoading, TEST_LOCATION);
2084 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2086 // FINISH RESOURCE LOADING
2087 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2088 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, true, true ) );
2089 application.GetPlatform().ClearReadyResources();
2090 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2091 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2092 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2093 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2098 int UtcDaliRenderTaskOnceNoSync05(void)
2100 TestApplication application;
2102 tet_infoline("Testing RenderTask Render Once\n"
2103 "Render once, Second call to SetRefreshRate(ONCE) triggers only one more finished signal\n"
2104 "PRE: Everything ready\n"
2105 "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)");
2107 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2108 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2109 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2110 drawTrace.Enable(true);
2112 Actor rootActor = Actor::New();
2113 Stage::GetCurrent().Add( rootActor );
2115 CameraActor offscreenCameraActor = CameraActor::New();
2116 Stage::GetCurrent().Add( offscreenCameraActor );
2117 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
2118 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2119 Integration::ResourceId imageRequestId = imageRequest->GetId();
2120 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2121 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2122 application.Render();
2123 application.GetPlatform().ClearReadyResources();
2125 Stage::GetCurrent().Add(secondRootActor);
2127 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2128 bool finished = false;
2129 RenderTaskFinished renderTaskFinished( finished );
2130 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2131 application.SendNotification();
2133 // START PROCESS/RENDER Input, Expected Input, Expected
2134 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2135 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
2137 // CHANGE TO RENDER ONCE,
2138 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2139 application.SendNotification();
2140 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2141 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2143 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2144 application.SendNotification();
2145 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2146 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2150 int UtcDaliRenderTaskOnceNoSync06(void)
2152 TestApplication application;
2154 tet_infoline("Testing RenderTask Render Once\n"
2155 "Render once, Call to SetRefreshRate(ONCE) in Finished signal callback triggers\n"
2156 "another render & another finished signal\n"
2157 "PRE: Everything ready\n"
2158 "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", ResourceImage::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;
2184 ConnectionTracker connectionTracker;
2185 RenderTaskFinishedRenderAgain renderTaskFinishedRenderAgain( finished );
2186 newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinishedRenderAgain );
2188 application.SendNotification();
2190 // START PROCESS/RENDER Input, Expected Input, Expected
2191 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2192 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
2194 // CHANGE TO RENDER ONCE,
2195 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2196 application.SendNotification();
2197 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2198 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2200 // Expect SetRefreshRate to have been called again
2201 // Prevent next finished signal calling refresh once again
2202 RenderTaskFinished renderTaskFinished( finished );
2203 connectionTracker.DisconnectAll();
2204 newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinished );
2206 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2207 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2212 int UtcDaliRenderTaskOnceNoSync07(void)
2214 TestApplication application;
2216 tet_infoline("Testing RenderTask Render Once\n"
2217 "SetRefreshRate(ONCE) again before first finished signal has been sent.\n"
2218 "PRE: resources ready\n"
2219 "POST: Only 1 finished signal sent.");
2221 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2222 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2223 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2224 drawTrace.Enable(true);
2226 Actor rootActor = Actor::New();
2227 Stage::GetCurrent().Add( rootActor );
2229 CameraActor offscreenCameraActor = CameraActor::New();
2230 Stage::GetCurrent().Add( offscreenCameraActor );
2231 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
2232 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2233 Integration::ResourceId imageRequestId = imageRequest->GetId();
2234 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2235 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2236 application.Render();
2237 application.GetPlatform().ClearReadyResources();
2239 Stage::GetCurrent().Add(secondRootActor);
2241 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2242 bool finished = false;
2243 RenderTaskFinished renderTaskFinished( finished );
2244 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2245 application.SendNotification();
2247 // START PROCESS/RENDER Input, Expected Input, Expected
2248 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2249 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
2251 // CHANGE TO RENDER ONCE,
2252 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2253 application.SendNotification();
2254 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2255 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2257 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2258 application.SendNotification();
2259 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2260 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2264 int UtcDaliRenderTaskOnceNoSync08(void)
2266 TestApplication application;
2268 tet_infoline("Testing RenderTask Render Once\n"
2269 "SetRefreshRate(ONCE), resource load failed, completes render task.\n"
2270 "PRE: resources not ready\n"
2271 "POST: Only 1 finished signal sent.");
2273 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2274 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2275 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2276 drawTrace.Enable(true);
2278 Actor rootActor = Actor::New();
2279 Stage::GetCurrent().Add( rootActor );
2281 CameraActor offscreenCameraActor = CameraActor::New();
2282 Stage::GetCurrent().Add( offscreenCameraActor );
2283 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
2284 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2285 Integration::ResourceId imageRequestId = imageRequest->GetId();
2286 Stage::GetCurrent().Add(secondRootActor);
2288 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2289 bool finished = false;
2290 RenderTaskFinished renderTaskFinished( finished );
2291 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2292 application.SendNotification();
2294 // START PROCESS/RENDER Input, Expected Input, Expected
2295 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2296 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2298 // CHANGE TO RENDER ONCE,
2299 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2300 application.SendNotification();
2301 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2302 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2303 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2305 FailImageLoad(application, imageRequestId); // Need to run Update again for this to complete
2306 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); // nothing to draw
2307 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2314 int UtcDaliRenderTaskOnceChain01(void)
2316 TestApplication application;
2318 tet_infoline("Testing RenderTask Render Once Chained render tasks\n"
2319 "SetRefreshRate(ONCE), resource load completes, both render tasks render.\n"
2320 "PRE: resources not ready\n"
2321 "POST: 2 finished signals sent.");
2323 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2324 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2325 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2326 drawTrace.Enable(true);
2328 Actor defaultRootActor = Actor::New(); // Root for default RT
2329 Stage::GetCurrent().Add( defaultRootActor );
2331 CameraActor offscreenCameraActor = CameraActor::New();
2332 Stage::GetCurrent().Add( offscreenCameraActor );
2333 ImageActor firstRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
2334 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2335 Integration::ResourceId imageRequestId = imageRequest->GetId();
2336 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2337 Stage::GetCurrent().Add(firstRootActor);
2339 // first render task
2340 RenderTask firstTask = CreateRenderTask(application, offscreenCameraActor, defaultRootActor, firstRootActor, RenderTask::REFRESH_ONCE, false);
2341 bool firstFinished = false;
2342 RenderTaskFinished renderTask1Finished( firstFinished );
2343 firstTask.FinishedSignal().Connect( &application, renderTask1Finished );
2345 // Second render task
2346 FrameBufferImage fbo = firstTask.GetTargetFrameBuffer();
2347 ImageActor secondRootActor = ImageActor::New( fbo );
2348 Stage::GetCurrent().Add(secondRootActor);
2349 RenderTask secondTask = CreateRenderTask(application, offscreenCameraActor, defaultRootActor, secondRootActor, RenderTask::REFRESH_ONCE, false);
2350 bool secondFinished = false;
2351 RenderTaskFinished renderTask2Finished( secondFinished );
2352 secondTask.FinishedSignal().Connect( &application, renderTask2Finished );
2354 application.SendNotification();
2356 // START PROCESS/RENDER Input, Expected Input, Expected
2357 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false, true ) );
2358 DALI_TEST_CHECK( secondFinished == false );
2359 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false, true ) );
2360 DALI_TEST_CHECK( secondFinished == false );
2362 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2363 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false, true ) );
2364 DALI_TEST_CHECK( secondFinished == false );
2365 application.GetPlatform().ClearReadyResources();
2367 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, firstFinished, true, false ) );
2368 DALI_TEST_CHECK( secondFinished == true );
2373 int UtcDaliRenderTaskProperties(void)
2375 TestApplication application;
2377 RenderTask task = Stage::GetCurrent().GetRenderTaskList().CreateTask();
2379 Property::IndexContainer indices;
2380 task.GetPropertyIndices( indices );
2381 DALI_TEST_CHECK( ! indices.empty() );
2382 DALI_TEST_EQUALS( indices.size(), task.GetPropertyCount(), TEST_LOCATION );
2386 int UtcDaliRenderTaskSetScreenToFrameBufferMappingActor(void)
2388 TestApplication application;
2389 tet_infoline("Testing RenderTask::SetScreenToFrameBufferMappingActor ");
2391 Stage stage = Stage::GetCurrent();
2392 Size stageSize = stage.GetSize();
2393 Actor mappingActor = Actor::New();
2394 Vector2 scale( 0.6f, 0.75f);
2395 Vector2 offset( stageSize.x*0.1f, stageSize.y*0.15f);
2396 mappingActor.SetSize( stageSize * scale );
2397 mappingActor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
2398 mappingActor.SetPosition( offset.x, offset.y );
2399 stage.Add( mappingActor );
2401 Actor offscreenActor = Actor::New();
2402 offscreenActor.SetSize( stageSize );
2403 offscreenActor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
2404 stage.Add( offscreenActor );
2406 RenderTaskList taskList = stage.GetRenderTaskList();
2407 RenderTask renderTask = taskList.CreateTask();
2408 FrameBufferImage frameBufferImage = FrameBufferImage::New(stageSize.width*scale.x, stageSize.height*scale.y, Pixel::A8, Image::NEVER);
2409 renderTask.SetSourceActor( offscreenActor );
2410 renderTask.SetExclusive( true );
2411 renderTask.SetInputEnabled( true );
2412 renderTask.SetTargetFrameBuffer( frameBufferImage );
2413 renderTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
2414 renderTask.SetScreenToFrameBufferMappingActor( mappingActor );
2415 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2417 // Render and notify
2418 application.SendNotification();
2419 application.Render();
2420 application.Render();
2421 application.SendNotification();
2423 Vector2 screenCoordinates( stageSize.x * 0.05f, stageSize.y * 0.05f );
2424 Dali::HitTestAlgorithm::Results results;
2425 DALI_TEST_CHECK( !results.actor );
2426 DALI_TEST_EQUALS( Vector2::ZERO, results.actorCoordinates, 0.1f, TEST_LOCATION );
2427 // miss expected, results not changed
2428 DALI_TEST_CHECK( false == Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction ) );
2429 DALI_TEST_CHECK( !results.actor );
2430 DALI_TEST_EQUALS( Vector2::ZERO, results.actorCoordinates, 0.1f, TEST_LOCATION );
2432 screenCoordinates.x = stageSize.x * 0.265f;
2433 screenCoordinates.y = stageSize.y * 0.33f;
2434 results.actor = Actor();
2435 results.actorCoordinates = Vector2::ZERO;
2436 // hit expected, results changed
2437 DALI_TEST_CHECK( true == Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction ) );
2438 DALI_TEST_CHECK( results.actor == offscreenActor );
2439 DALI_TEST_EQUALS( (screenCoordinates-offset)/scale , results.actorCoordinates, 0.1f, TEST_LOCATION );
2441 screenCoordinates.x = stageSize.x * 0.435f;
2442 screenCoordinates.y = stageSize.y * 0.52f;
2443 // hit expected, results changed
2444 DALI_TEST_CHECK( true == Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction ) );
2445 DALI_TEST_CHECK( results.actor == offscreenActor );
2446 const Vector2 expectedCoordinates = (screenCoordinates-offset)/scale;
2447 DALI_TEST_EQUALS( expectedCoordinates , results.actorCoordinates, 0.1f, TEST_LOCATION );
2449 screenCoordinates.x = stageSize.x * 0.65f;
2450 screenCoordinates.y = stageSize.y * 0.95f;
2451 // miss expected, results not changed
2452 DALI_TEST_CHECK( false == Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction ) );
2453 DALI_TEST_CHECK( results.actor == offscreenActor );
2454 DALI_TEST_EQUALS( expectedCoordinates , results.actorCoordinates, 0.1f, TEST_LOCATION );