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 BufferImage img = BufferImage::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 BufferImage img = BufferImage::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 BufferImage img = BufferImage::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 BufferImage img1 = BufferImage::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 BufferImage img2 = BufferImage::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 BufferImage img3 = BufferImage::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::Property::ViewportPosition, 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::Property::ViewportPosition ), 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::Property::ViewportSize, 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::Property::ViewportSize ), 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::Property::ClearColor, 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 BufferImage image = BufferImage::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);
1402 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, true);
1403 bool finished = false;
1404 RenderTaskFinished renderTaskFinished( finished );
1405 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1406 application.SendNotification();
1408 // START PROCESS/RENDER Input, Expected Input, Expected
1409 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1410 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1412 // MAKE SOURCE VISIBLE
1413 secondRootActor.SetVisible(true);
1414 application.SendNotification();
1415 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1416 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1418 // FINISH RESOURCE LOADING - expect no rendering yet
1419 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1420 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1421 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1422 DALI_TEST_CHECK( lastSyncObj != NULL );
1424 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1425 application.GetPlatform().ClearReadyResources();
1426 sync.SetObjectSynced( lastSyncObj, true );
1427 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1428 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1432 int UtcDaliRenderTaskOnce02(void)
1434 TestApplication application;
1436 tet_infoline("Testing RenderTask Render Once GlSync, using loading image. Switch from render always after ready to render once\n"
1437 "PRE: Render task ready, Image not loaded\n"
1438 "POST: Finished signal sent only once");
1440 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1441 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1442 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1443 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1444 drawTrace.Enable(true);
1446 Actor rootActor = Actor::New();
1447 Stage::GetCurrent().Add( rootActor );
1449 CameraActor offscreenCameraActor = CameraActor::New();
1450 Stage::GetCurrent().Add( offscreenCameraActor );
1451 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1452 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1453 Integration::ResourceId imageRequestId = imageRequest->GetId();
1454 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1455 Stage::GetCurrent().Add(secondRootActor);
1457 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1458 bool finished = false;
1459 RenderTaskFinished renderTaskFinished( finished );
1460 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1461 application.SendNotification();
1463 // START PROCESS/RENDER Input, Expected Input, Expected
1464 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1465 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1467 // FINISH RESOURCE LOADING
1468 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1469 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1470 application.GetPlatform().ClearReadyResources();
1471 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1473 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1474 application.SendNotification(); // Input, Expected Input, Expected
1475 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1476 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1477 DALI_TEST_CHECK( lastSyncObj != NULL );
1479 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1480 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1481 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1482 sync.SetObjectSynced( lastSyncObj, true );
1483 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1484 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1490 int UtcDaliRenderTaskOnce03(void)
1492 TestApplication application;
1494 tet_infoline("Testing RenderTask Render Once GlSync\n"
1495 "Switch from Render always after ready to render once with resources unready\n"
1496 "PRE: Everything ready to render\n"
1497 "POST: Finished signal sent once");
1499 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1500 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1501 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1502 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1503 drawTrace.Enable(true);
1505 Actor rootActor = Actor::New();
1506 Stage::GetCurrent().Add( rootActor );
1508 CameraActor offscreenCameraActor = CameraActor::New();
1509 Stage::GetCurrent().Add( offscreenCameraActor );
1510 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1511 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1512 Integration::ResourceId imageRequestId = imageRequest->GetId();
1513 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1514 Stage::GetCurrent().Add(secondRootActor);
1516 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1517 bool finished = false;
1518 RenderTaskFinished renderTaskFinished( finished );
1519 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1520 application.SendNotification();
1522 // START PROCESS/RENDER Input, Expected Input, Expected
1523 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1524 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1526 // CHANGE TO RENDER ONCE
1527 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1528 application.SendNotification(); // Input, Expected Input, Expected
1529 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1530 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1532 // FINISH RESOURCE LOADING
1533 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1534 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1535 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1536 DALI_TEST_CHECK( lastSyncObj != NULL );
1537 application.GetPlatform().ClearReadyResources();
1539 sync.SetObjectSynced( lastSyncObj, true );
1540 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1541 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1547 //int UtcDaliRenderTaskOnce04(void)
1549 TestApplication application;
1551 tet_infoline("Testing RenderTask Render Once GlSync\n"
1552 "During RenderOnce, make ready resources unready before sending first finished signal\n"
1553 "PRE: Everything ready.\n"
1554 "POST: Finished signal sent only once");
1556 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1557 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1558 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1559 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1560 drawTrace.Enable(true);
1562 Actor rootActor = Actor::New();
1563 Stage::GetCurrent().Add( rootActor );
1565 CameraActor offscreenCameraActor = CameraActor::New();
1566 Stage::GetCurrent().Add( offscreenCameraActor );
1567 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1568 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1569 Integration::ResourceId imageRequestId = imageRequest->GetId();
1570 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1571 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1572 application.Render();
1574 Stage::GetCurrent().Add(secondRootActor);
1575 application.GetPlatform().ClearReadyResources();
1577 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1578 bool finished = false;
1579 RenderTaskFinished renderTaskFinished( finished );
1580 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1581 application.SendNotification();
1583 // START PROCESS/RENDER Input, Expected Input, Expected
1584 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1585 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1587 // CHANGE TO RENDER ONCE, RESOURCES BECOME NOT READY
1588 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1591 ReloadImage(application, secondRootActor.GetImage());
1592 application.SendNotification(); // Input, Expected Input, Expected
1594 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1595 DALI_TEST_EQUALS( secondRootActor.GetImage().GetLoadingState(), Dali::ResourceLoading, TEST_LOCATION);
1596 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1598 // FINISH RESOURCE LOADING
1599 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1600 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1601 application.GetPlatform().ClearReadyResources();
1602 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1603 DALI_TEST_CHECK( lastSyncObj != NULL );
1605 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1606 sync.SetObjectSynced( lastSyncObj, true );
1607 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1608 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, true ) );
1610 // Finished rendering - expect no more renders, no more signals:
1611 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
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 ) );
1621 int UtcDaliRenderTaskOnce05(void)
1623 TestApplication application;
1625 tet_infoline("Testing RenderTask Render Once GLSync\n"
1626 "Render once, Second call to SetRefreshRate(ONCE) triggers only one more finished signal\n"
1627 "PRE: Everything ready\n"
1628 "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)");
1630 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1631 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1632 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1633 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1634 drawTrace.Enable(true);
1636 Actor rootActor = Actor::New();
1637 Stage::GetCurrent().Add( rootActor );
1639 CameraActor offscreenCameraActor = CameraActor::New();
1640 Stage::GetCurrent().Add( offscreenCameraActor );
1641 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1642 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1643 Integration::ResourceId imageRequestId = imageRequest->GetId();
1644 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1645 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1646 application.Render();
1647 application.GetPlatform().ClearReadyResources();
1649 Stage::GetCurrent().Add(secondRootActor);
1651 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1652 bool finished = false;
1653 RenderTaskFinished renderTaskFinished( finished );
1654 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1655 application.SendNotification();
1657 // START PROCESS/RENDER Input, Expected Input, Expected
1658 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1659 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1661 // CHANGE TO RENDER ONCE,
1662 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1663 application.SendNotification();
1664 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1665 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1666 DALI_TEST_CHECK( lastSyncObj != NULL );
1668 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1669 sync.SetObjectSynced( lastSyncObj, true );
1670 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1671 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1673 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1674 application.SendNotification();
1675 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1676 lastSyncObj = sync.GetLastSyncObject();
1677 DALI_TEST_CHECK( lastSyncObj != NULL );
1679 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1680 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1681 sync.SetObjectSynced( lastSyncObj, true );
1682 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1683 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1687 int UtcDaliRenderTaskOnce06(void)
1689 TestApplication application;
1691 tet_infoline("Testing RenderTask Render Once GLSync\n"
1692 "Render once, Call to SetRefreshRate(ONCE) in Finished signal callback triggers "
1693 "another render & another finished signal\n"
1694 "PRE: Everything ready\n"
1695 "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)");
1698 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1699 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1700 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1701 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1702 drawTrace.Enable(true);
1704 Actor rootActor = Actor::New();
1705 Stage::GetCurrent().Add( rootActor );
1707 CameraActor offscreenCameraActor = CameraActor::New();
1708 Stage::GetCurrent().Add( offscreenCameraActor );
1709 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1710 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1711 Integration::ResourceId imageRequestId = imageRequest->GetId();
1712 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1713 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1714 application.Render();
1715 application.GetPlatform().ClearReadyResources();
1717 Stage::GetCurrent().Add(secondRootActor);
1719 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1720 bool finished = false;
1722 ConnectionTracker connectionTracker;
1723 RenderTaskFinishedRenderAgain renderTaskFinishedRenderAgain( finished );
1724 newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinishedRenderAgain );
1726 application.SendNotification();
1728 // Expect 2 frames to be drawn.
1729 // START PROCESS/RENDER Input, Expected Input, Expected
1730 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1731 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1732 DALI_TEST_CHECK( lastSyncObj == NULL );
1733 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1735 // CHANGE TO RENDER ONCE,
1736 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1737 application.SendNotification();
1738 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1739 lastSyncObj = sync.GetLastSyncObject();
1740 DALI_TEST_CHECK( lastSyncObj != NULL );
1742 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1743 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1745 sync.SetObjectSynced( lastSyncObj, true );
1746 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1747 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1748 application.SendNotification();
1750 // Expect SetRefreshRate to have been called again
1751 // Prevent next finished signal calling refresh once again
1752 RenderTaskFinished renderTaskFinished( finished );
1753 connectionTracker.DisconnectAll();
1754 newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinished );
1755 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1756 lastSyncObj = sync.GetLastSyncObject();
1757 DALI_TEST_CHECK( lastSyncObj != NULL );
1759 sync.SetObjectSynced( lastSyncObj, true );
1760 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1761 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1766 int UtcDaliRenderTaskOnce07(void)
1768 TestApplication application;
1770 tet_infoline("Testing RenderTask Render Once GlSync\n"
1771 "SetRefreshRate(ONCE) again before first finished signal has been sent.\n"
1772 "PRE: resources ready\n"
1773 "POST: Only 1 finished signal sent.");
1775 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1776 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1777 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1778 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1779 drawTrace.Enable(true);
1781 Actor rootActor = Actor::New();
1782 Stage::GetCurrent().Add( rootActor );
1784 CameraActor offscreenCameraActor = CameraActor::New();
1785 Stage::GetCurrent().Add( offscreenCameraActor );
1786 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1787 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1788 Integration::ResourceId imageRequestId = imageRequest->GetId();
1789 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1790 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1791 application.Render();
1792 application.GetPlatform().ClearReadyResources();
1794 Stage::GetCurrent().Add(secondRootActor);
1796 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1797 bool finished = false;
1798 RenderTaskFinished renderTaskFinished( finished );
1799 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1800 application.SendNotification();
1802 // START PROCESS/RENDER Input, Expected Input, Expected
1803 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1804 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1806 // CHANGE TO RENDER ONCE,
1807 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1808 application.SendNotification();
1809 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1810 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1811 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1813 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1814 application.SendNotification();
1815 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1816 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1817 DALI_TEST_CHECK( lastSyncObj != NULL );
1819 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1820 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1821 sync.SetObjectSynced( lastSyncObj, true );
1822 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1823 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1830 int UtcDaliRenderTaskOnce08(void)
1832 TestApplication application;
1834 tet_infoline("Testing RenderTask Render Once GlSync\n"
1835 "SetRefreshRate(ONCE), resource load failed completes render task.\n"
1836 "PRE: resources not ready\n"
1837 "POST: Only 1 finished signal sent.");
1839 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1840 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1841 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1842 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1843 drawTrace.Enable(true);
1845 Actor rootActor = Actor::New();
1846 Stage::GetCurrent().Add( rootActor );
1848 CameraActor offscreenCameraActor = CameraActor::New();
1849 Stage::GetCurrent().Add( offscreenCameraActor );
1850 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1851 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1852 Integration::ResourceId imageRequestId = imageRequest->GetId();
1853 Stage::GetCurrent().Add(secondRootActor);
1855 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1856 bool finished = false;
1857 RenderTaskFinished renderTaskFinished( finished );
1858 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1859 application.SendNotification();
1861 // START PROCESS/RENDER Input, Expected Input, Expected
1862 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1863 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1865 // CHANGE TO RENDER ONCE,
1866 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1867 application.SendNotification();
1868 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1869 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1870 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1872 tet_printf(" FailImageLoad\n");
1874 FailImageLoad(application, imageRequestId); // Need to run Update again for this to complete
1875 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); // nothing to draw
1876 application.SendNotification();
1878 // Drawing empty framebuffer, so will still get a GL sync
1879 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1880 DALI_TEST_CHECK( lastSyncObj != NULL );
1882 // Expect finished signal, as all resources are complete
1883 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, true, false ) );
1890 int UtcDaliRenderTaskOnceNoSync01(void)
1892 TestApplication application;
1894 tet_infoline("Testing RenderTask Render Once, using loading image\nPRE: Resources not ready, Source not visible\nPOST: Finished signal sent once only");
1896 // SETUP AN OFFSCREEN RENDER TASK
1897 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1898 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1899 drawTrace.Enable(true);
1901 Actor rootActor = Actor::New();
1902 Stage::GetCurrent().Add( rootActor );
1904 CameraActor offscreenCameraActor = CameraActor::New();
1905 Stage::GetCurrent().Add( offscreenCameraActor );
1906 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1907 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1908 Integration::ResourceId imageRequestId = imageRequest->GetId();
1909 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1911 Stage::GetCurrent().Add(secondRootActor);
1913 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, false);
1914 bool finished = false;
1915 RenderTaskFinished renderTaskFinished( finished );
1916 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1917 application.SendNotification();
1919 // START PROCESS/RENDER Input, Expected Input, Expected
1920 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1921 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1923 // FINISH RESOURCE LOADING - expect immediate rendering yet
1924 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1925 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1926 application.GetPlatform().ClearReadyResources();
1927 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1931 int UtcDaliRenderTaskOnceNoSync02(void)
1933 TestApplication application;
1935 tet_infoline("Testing RenderTask Render Once, using loading image. Switch from render always after ready to render once\n"
1936 "PRE: Render task ready, Image not loaded\n"
1937 "POST: Finished signal sent only once");
1939 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1940 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1941 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1942 drawTrace.Enable(true);
1944 Actor rootActor = Actor::New();
1945 Stage::GetCurrent().Add( rootActor );
1947 CameraActor offscreenCameraActor = CameraActor::New();
1948 Stage::GetCurrent().Add( offscreenCameraActor );
1949 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1950 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1951 Integration::ResourceId imageRequestId = imageRequest->GetId();
1952 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1953 Stage::GetCurrent().Add(secondRootActor);
1955 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
1956 bool finished = false;
1957 RenderTaskFinished renderTaskFinished( finished );
1958 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1959 application.SendNotification();
1961 // START PROCESS/RENDER Input, Expected Input, Expected
1962 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1963 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
1965 // FINISH RESOURCE LOADING
1966 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1967 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
1968 application.GetPlatform().ClearReadyResources();
1970 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1971 application.SendNotification(); // Input, Expected Input, Expected
1972 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
1973 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
1978 int UtcDaliRenderTaskOnceNoSync03(void)
1980 TestApplication application;
1982 tet_infoline("Testing RenderTask Render Once\n"
1983 "Switch from Render always after ready to render once with resources unready\n"
1984 "PRE: Everything ready to render\n"
1985 "POST: Finished signal sent once");
1987 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1988 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1989 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1990 drawTrace.Enable(true);
1992 Actor rootActor = Actor::New();
1993 Stage::GetCurrent().Add( rootActor );
1995 CameraActor offscreenCameraActor = CameraActor::New();
1996 Stage::GetCurrent().Add( offscreenCameraActor );
1997 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
1998 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1999 Integration::ResourceId imageRequestId = imageRequest->GetId();
2000 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2001 Stage::GetCurrent().Add(secondRootActor);
2003 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2004 bool finished = false;
2005 RenderTaskFinished renderTaskFinished( finished );
2006 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2007 application.SendNotification();
2009 // START PROCESS/RENDER Input, Expected Input, Expected
2010 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2011 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2013 // CHANGE TO RENDER ONCE
2014 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2015 application.SendNotification(); // Input, Expected Input, Expected
2016 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2017 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2019 // FINISH RESOURCE LOADING
2020 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2021 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2022 application.GetPlatform().ClearReadyResources();
2023 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2028 //int UtcDaliRenderTaskOnceNoSync04(void)
2030 TestApplication application;
2032 tet_infoline("Testing RenderTask Render Once\n"
2033 "During RenderOnce, make ready resources unready before sending first finished signal\n"
2034 "PRE: Everything ready.\n"
2035 "POST: Finished signal sent only once");
2037 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2038 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2039 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2040 drawTrace.Enable(true);
2042 Actor rootActor = Actor::New();
2043 Stage::GetCurrent().Add( rootActor );
2045 CameraActor offscreenCameraActor = CameraActor::New();
2046 Stage::GetCurrent().Add( offscreenCameraActor );
2047 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
2048 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2049 Integration::ResourceId imageRequestId = imageRequest->GetId();
2050 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2051 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2052 application.Render();
2053 application.GetPlatform().ClearReadyResources();
2055 Stage::GetCurrent().Add(secondRootActor);
2057 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2058 bool finished = false;
2059 RenderTaskFinished renderTaskFinished( finished );
2060 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2061 application.SendNotification();
2063 // START PROCESS/RENDER Input, Expected Input, Expected
2064 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2065 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
2067 // CHANGE TO RENDER ONCE, RESOURCES BECOME NOT READY
2068 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2071 ReloadImage(application, secondRootActor.GetImage());
2072 application.SendNotification(); // Input, Expected Input, Expected
2074 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2075 DALI_TEST_EQUALS( secondRootActor.GetImage().GetLoadingState(), Dali::ResourceLoading, TEST_LOCATION);
2076 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2078 // FINISH RESOURCE LOADING
2079 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2080 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, true, true ) );
2081 application.GetPlatform().ClearReadyResources();
2082 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2083 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2084 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2085 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2090 int UtcDaliRenderTaskOnceNoSync05(void)
2092 TestApplication application;
2094 tet_infoline("Testing RenderTask Render Once\n"
2095 "Render once, Second call to SetRefreshRate(ONCE) triggers only one more finished signal\n"
2096 "PRE: Everything ready\n"
2097 "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)");
2099 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2100 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2101 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2102 drawTrace.Enable(true);
2104 Actor rootActor = Actor::New();
2105 Stage::GetCurrent().Add( rootActor );
2107 CameraActor offscreenCameraActor = CameraActor::New();
2108 Stage::GetCurrent().Add( offscreenCameraActor );
2109 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
2110 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2111 Integration::ResourceId imageRequestId = imageRequest->GetId();
2112 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2113 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2114 application.Render();
2115 application.GetPlatform().ClearReadyResources();
2117 Stage::GetCurrent().Add(secondRootActor);
2119 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2120 bool finished = false;
2121 RenderTaskFinished renderTaskFinished( finished );
2122 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2123 application.SendNotification();
2125 // START PROCESS/RENDER Input, Expected Input, Expected
2126 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2127 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
2129 // CHANGE TO RENDER ONCE,
2130 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2131 application.SendNotification();
2132 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2133 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2135 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2136 application.SendNotification();
2137 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2138 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2142 int UtcDaliRenderTaskOnceNoSync06(void)
2144 TestApplication application;
2146 tet_infoline("Testing RenderTask Render Once\n"
2147 "Render once, Call to SetRefreshRate(ONCE) in Finished signal callback triggers\n"
2148 "another render & another finished signal\n"
2149 "PRE: Everything ready\n"
2150 "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)");
2153 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2154 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2155 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2156 drawTrace.Enable(true);
2158 Actor rootActor = Actor::New();
2159 Stage::GetCurrent().Add( rootActor );
2161 CameraActor offscreenCameraActor = CameraActor::New();
2162 Stage::GetCurrent().Add( offscreenCameraActor );
2163 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
2164 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2165 Integration::ResourceId imageRequestId = imageRequest->GetId();
2166 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2167 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2168 application.Render();
2169 application.GetPlatform().ClearReadyResources();
2171 Stage::GetCurrent().Add(secondRootActor);
2173 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2174 bool finished = false;
2176 ConnectionTracker connectionTracker;
2177 RenderTaskFinishedRenderAgain renderTaskFinishedRenderAgain( finished );
2178 newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinishedRenderAgain );
2180 application.SendNotification();
2182 // START PROCESS/RENDER Input, Expected Input, Expected
2183 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2184 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
2186 // CHANGE TO RENDER ONCE,
2187 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2188 application.SendNotification();
2189 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2190 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2192 // Expect SetRefreshRate to have been called again
2193 // Prevent next finished signal calling refresh once again
2194 RenderTaskFinished renderTaskFinished( finished );
2195 connectionTracker.DisconnectAll();
2196 newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinished );
2198 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2199 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2204 int UtcDaliRenderTaskOnceNoSync07(void)
2206 TestApplication application;
2208 tet_infoline("Testing RenderTask Render Once\n"
2209 "SetRefreshRate(ONCE) again before first finished signal has been sent.\n"
2210 "PRE: resources ready\n"
2211 "POST: Only 1 finished signal sent.");
2213 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2214 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2215 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2216 drawTrace.Enable(true);
2218 Actor rootActor = Actor::New();
2219 Stage::GetCurrent().Add( rootActor );
2221 CameraActor offscreenCameraActor = CameraActor::New();
2222 Stage::GetCurrent().Add( offscreenCameraActor );
2223 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
2224 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2225 Integration::ResourceId imageRequestId = imageRequest->GetId();
2226 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2227 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2228 application.Render();
2229 application.GetPlatform().ClearReadyResources();
2231 Stage::GetCurrent().Add(secondRootActor);
2233 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2234 bool finished = false;
2235 RenderTaskFinished renderTaskFinished( finished );
2236 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2237 application.SendNotification();
2239 // START PROCESS/RENDER Input, Expected Input, Expected
2240 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2241 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) );
2243 // CHANGE TO RENDER ONCE,
2244 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2245 application.SendNotification();
2246 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2247 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2249 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2250 application.SendNotification();
2251 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) );
2252 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2256 int UtcDaliRenderTaskOnceNoSync08(void)
2258 TestApplication application;
2260 tet_infoline("Testing RenderTask Render Once\n"
2261 "SetRefreshRate(ONCE), resource load failed, completes render task.\n"
2262 "PRE: resources not ready\n"
2263 "POST: Only 1 finished signal sent.");
2265 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2266 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2267 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2268 drawTrace.Enable(true);
2270 Actor rootActor = Actor::New();
2271 Stage::GetCurrent().Add( rootActor );
2273 CameraActor offscreenCameraActor = CameraActor::New();
2274 Stage::GetCurrent().Add( offscreenCameraActor );
2275 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
2276 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2277 Integration::ResourceId imageRequestId = imageRequest->GetId();
2278 Stage::GetCurrent().Add(secondRootActor);
2280 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2281 bool finished = false;
2282 RenderTaskFinished renderTaskFinished( finished );
2283 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2284 application.SendNotification();
2286 // START PROCESS/RENDER Input, Expected Input, Expected
2287 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2288 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2290 // CHANGE TO RENDER ONCE,
2291 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2292 application.SendNotification();
2293 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2294 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2295 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) );
2297 FailImageLoad(application, imageRequestId); // Need to run Update again for this to complete
2298 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); // nothing to draw
2299 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) );
2306 int UtcDaliRenderTaskOnceChain01(void)
2308 TestApplication application;
2310 tet_infoline("Testing RenderTask Render Once Chained render tasks\n"
2311 "SetRefreshRate(ONCE), resource load completes, both render tasks render.\n"
2312 "PRE: resources not ready\n"
2313 "POST: 2 finished signals sent.");
2315 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2316 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2317 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2318 drawTrace.Enable(true);
2320 Actor defaultRootActor = Actor::New(); // Root for default RT
2321 Stage::GetCurrent().Add( defaultRootActor );
2323 CameraActor offscreenCameraActor = CameraActor::New();
2324 Stage::GetCurrent().Add( offscreenCameraActor );
2325 ImageActor firstRootActor = CreateLoadingImage(application, "aFile.jpg", ResourceImage::IMMEDIATE, Image::UNUSED);
2326 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2327 Integration::ResourceId imageRequestId = imageRequest->GetId();
2328 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2329 Stage::GetCurrent().Add(firstRootActor);
2331 // first render task
2332 RenderTask firstTask = CreateRenderTask(application, offscreenCameraActor, defaultRootActor, firstRootActor, RenderTask::REFRESH_ONCE, false);
2333 bool firstFinished = false;
2334 RenderTaskFinished renderTask1Finished( firstFinished );
2335 firstTask.FinishedSignal().Connect( &application, renderTask1Finished );
2337 // Second render task
2338 FrameBufferImage fbo = firstTask.GetTargetFrameBuffer();
2339 ImageActor secondRootActor = ImageActor::New( fbo );
2340 Stage::GetCurrent().Add(secondRootActor);
2341 RenderTask secondTask = CreateRenderTask(application, offscreenCameraActor, defaultRootActor, secondRootActor, RenderTask::REFRESH_ONCE, false);
2342 bool secondFinished = false;
2343 RenderTaskFinished renderTask2Finished( secondFinished );
2344 secondTask.FinishedSignal().Connect( &application, renderTask2Finished );
2346 application.SendNotification();
2348 // START PROCESS/RENDER Input, Expected Input, Expected
2349 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false, true ) );
2350 DALI_TEST_CHECK( secondFinished == false );
2351 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false, true ) );
2352 DALI_TEST_CHECK( secondFinished == false );
2354 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2355 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false, true ) );
2356 DALI_TEST_CHECK( secondFinished == false );
2357 application.GetPlatform().ClearReadyResources();
2359 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, firstFinished, true, false ) );
2360 DALI_TEST_CHECK( secondFinished == true );
2365 int UtcDaliRenderTaskProperties(void)
2367 TestApplication application;
2369 RenderTask task = Stage::GetCurrent().GetRenderTaskList().CreateTask();
2371 Property::IndexContainer indices;
2372 task.GetPropertyIndices( indices );
2373 DALI_TEST_CHECK( ! indices.empty() );
2374 DALI_TEST_EQUALS( indices.size(), task.GetPropertyCount(), TEST_LOCATION );
2378 int UtcDaliRenderTaskSetScreenToFrameBufferMappingActor(void)
2380 TestApplication application;
2381 tet_infoline("Testing RenderTask::SetScreenToFrameBufferMappingActor ");
2383 Stage stage = Stage::GetCurrent();
2384 Size stageSize = stage.GetSize();
2385 Actor mappingActor = Actor::New();
2386 Vector2 scale( 0.6f, 0.75f);
2387 Vector2 offset( stageSize.x*0.1f, stageSize.y*0.15f);
2388 mappingActor.SetSize( stageSize * scale );
2389 mappingActor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
2390 mappingActor.SetPosition( offset.x, offset.y );
2391 stage.Add( mappingActor );
2393 Actor offscreenActor = Actor::New();
2394 offscreenActor.SetSize( stageSize );
2395 offscreenActor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
2396 stage.Add( offscreenActor );
2398 RenderTaskList taskList = stage.GetRenderTaskList();
2399 RenderTask renderTask = taskList.CreateTask();
2400 FrameBufferImage frameBufferImage = FrameBufferImage::New(stageSize.width*scale.x, stageSize.height*scale.y, Pixel::A8, Image::NEVER);
2401 renderTask.SetSourceActor( offscreenActor );
2402 renderTask.SetExclusive( true );
2403 renderTask.SetInputEnabled( true );
2404 renderTask.SetTargetFrameBuffer( frameBufferImage );
2405 renderTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
2406 renderTask.SetScreenToFrameBufferMappingActor( mappingActor );
2407 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2409 // Render and notify
2410 application.SendNotification();
2411 application.Render();
2412 application.Render();
2413 application.SendNotification();
2415 Vector2 screenCoordinates( stageSize.x * 0.05f, stageSize.y * 0.05f );
2416 Dali::HitTestAlgorithm::Results results;
2417 DALI_TEST_CHECK( !results.actor );
2418 DALI_TEST_EQUALS( Vector2::ZERO, results.actorCoordinates, 0.1f, TEST_LOCATION );
2419 // miss expected, results not changed
2420 DALI_TEST_CHECK( false == Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction ) );
2421 DALI_TEST_CHECK( !results.actor );
2422 DALI_TEST_EQUALS( Vector2::ZERO, results.actorCoordinates, 0.1f, TEST_LOCATION );
2424 screenCoordinates.x = stageSize.x * 0.265f;
2425 screenCoordinates.y = stageSize.y * 0.33f;
2426 results.actor = Actor();
2427 results.actorCoordinates = Vector2::ZERO;
2428 // hit expected, results changed
2429 DALI_TEST_CHECK( true == Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction ) );
2430 DALI_TEST_CHECK( results.actor == offscreenActor );
2431 DALI_TEST_EQUALS( (screenCoordinates-offset)/scale , results.actorCoordinates, 0.1f, TEST_LOCATION );
2433 screenCoordinates.x = stageSize.x * 0.435f;
2434 screenCoordinates.y = stageSize.y * 0.52f;
2435 // hit expected, results changed
2436 DALI_TEST_CHECK( true == Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction ) );
2437 DALI_TEST_CHECK( results.actor == offscreenActor );
2438 const Vector2 expectedCoordinates = (screenCoordinates-offset)/scale;
2439 DALI_TEST_EQUALS( expectedCoordinates , results.actorCoordinates, 0.1f, TEST_LOCATION );
2441 screenCoordinates.x = stageSize.x * 0.65f;
2442 screenCoordinates.y = stageSize.y * 0.95f;
2443 // miss expected, results not changed
2444 DALI_TEST_CHECK( false == Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction ) );
2445 DALI_TEST_CHECK( results.actor == offscreenActor );
2446 DALI_TEST_EQUALS( expectedCoordinates , results.actorCoordinates, 0.1f, TEST_LOCATION );
2450 int UtcDaliRenderTaskFinishInvisibleSourceActor(void)
2452 TestApplication application;
2454 tet_infoline("Testing RenderTask::SignalFinished()");
2456 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2457 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2459 CameraActor offscreenCameraActor = CameraActor::New();
2461 Stage::GetCurrent().Add( offscreenCameraActor );
2463 BufferImage image = BufferImage::New( 10, 10 );
2464 ImageActor rootActor = ImageActor::New( image );
2465 rootActor.SetSize( 10, 10 );
2466 rootActor.SetVisible(false);
2467 Stage::GetCurrent().Add( rootActor );
2469 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
2470 NativeImageInterfacePtr testNativeImagePtr = TestNativeImage::New(10, 10);
2471 FrameBufferImage frameBufferImage = FrameBufferImage::New( *testNativeImagePtr.Get() );
2473 // Flush all outstanding messages
2474 application.SendNotification();
2475 application.Render();
2477 RenderTask newTask = taskList.CreateTask();
2478 newTask.SetCameraActor( offscreenCameraActor );
2479 newTask.SetSourceActor( rootActor );
2480 newTask.SetInputEnabled( false );
2481 newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
2482 newTask.SetClearEnabled( true );
2483 newTask.SetExclusive( true );
2484 newTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
2485 newTask.SetTargetFrameBuffer( frameBufferImage );
2487 // Framebuffer doesn't actually get created until Connected, i.e. by previous line
2489 bool finished = false;
2490 RenderTaskFinished renderTaskFinished( finished );
2491 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2493 // Flush the queue and render.
2494 application.SendNotification();
2496 // 1 render to process render task, then wait for sync before finished msg is sent
2497 // from update to the event thread.
2499 application.Render();
2500 application.SendNotification();
2501 DALI_TEST_CHECK( !finished );
2503 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2504 DALI_TEST_CHECK( lastSyncObj != NULL );
2506 application.Render();
2507 DALI_TEST_EQUALS( (application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
2508 application.SendNotification();
2509 DALI_TEST_CHECK( !finished );
2511 application.Render();
2512 DALI_TEST_EQUALS( (application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
2513 application.SendNotification();
2514 DALI_TEST_CHECK( ! finished );
2516 sync.SetObjectSynced( lastSyncObj, true );
2518 application.Render();
2519 application.SendNotification();
2520 DALI_TEST_CHECK( !finished );
2522 application.Render();
2523 application.SendNotification();
2524 DALI_TEST_CHECK( finished );
2527 application.Render(); // Double check no more finished signal
2528 application.SendNotification();
2529 DALI_TEST_CHECK( ! finished );