2 * Copyright (c) 2020 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.
20 #include <dali/public-api/dali-core.h>
21 #include <dali/devel-api/events/hit-test-algorithm.h>
22 #include <dali-test-suite-utils.h>
23 #include <dali/integration-api/debug.h>
24 #include <test-native-image.h>
26 #include <mesh-builder.h>
28 #define BOOLSTR(x) ((x)?"T":"F")
30 //& set: DaliRenderTask
34 void utc_dali_render_task_startup(void)
36 test_return_value = TET_UNDEF;
39 void utc_dali_render_task_cleanup(void)
41 test_return_value = TET_PASS;
47 * Constructor, Destructor, DownCast, New, copy constructor, assignment operator
49 * SetSourceActor 2+ve, 1-ve
50 * GetSourceActor 1+ve, 1-ve
51 * SetExclusive 2+ve, 0-ve
52 * IsExclusive 2+ve, 0-ve
53 * SetInputEnabled 1+ve, 0-ve
54 * GetInputEnabled 1+ve, 0-ve
55 * SetCameraActor 1+ve, 1-ve
56 * GetCameraActor 1+ve, 1-ve
57 * SetTargetFrameBuffer 1+ve, 1-ve
58 * GetTargetFrameBuffer 1+ve, 1-ve
59 * SetScreenToFrameBufferFunction 1+ve, 1-ve
60 * GetScreenToFrameBufferFunction 1+ve, 1-ve
61 * SetScreenToFrameBufferMappingActor 1+ve, 1-ve
62 * GetScreenToFrameBufferMappingActor 1+ve, 1-ve
63 * SetViewportPosition 1+ve
64 * GetCurrentViewportPosition 1+ve
65 * SetViewportSize 1+ve
66 * GetCurrentViewportSize 1+ve
67 * SetViewport 2+ve, 1-ve
68 * GetViewport 2+ve, 1-ve
69 * SetClearColor 1+ve, 1-ve
70 * GetClearColor 1+ve, 1-ve
71 * SetClearEnabled 1+ve, 1-ve
72 * GetClearEnabled 1+ve, 1-ve
80 namespace // unnamed namespace
83 const int RENDER_FRAME_INTERVAL = 16; ///< Duration of each frame in ms. (at approx 60FPS)
86 * Simulate time passed by.
88 * @note this will always process at least 1 frame (1/60 sec)
90 * @param application Test application instance
91 * @param duration Time to pass in milliseconds.
92 * @return The actual time passed in milliseconds
94 int Wait(TestApplication& application, int duration = 0)
98 for(int i = 0; i <= ( duration / RENDER_FRAME_INTERVAL); i++)
100 application.SendNotification();
101 application.Render(RENDER_FRAME_INTERVAL);
102 time += RENDER_FRAME_INTERVAL;
108 struct RenderTaskFinished
110 RenderTaskFinished( bool& finished )
111 : finished( finished )
115 void operator()( RenderTask& renderTask )
123 struct RenderTaskFinishedRemoveSource
125 RenderTaskFinishedRemoveSource( bool& finished )
126 : finished( finished ),
131 void operator()( RenderTask& renderTask )
133 DALI_TEST_CHECK(finishedOnce == false);
136 Actor srcActor = renderTask.GetSourceActor();
137 UnparentAndReset(srcActor);
144 struct RenderTaskFinishedRenderAgain
146 RenderTaskFinishedRenderAgain( bool& finished )
147 : finished( finished ),
152 void operator()( RenderTask& renderTask )
154 DALI_TEST_CHECK(finishedOnce == false);
157 renderTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
165 bool TestScreenToFrameBufferFunction( Vector2& coordinates )
167 coordinates = coordinates + Vector2( 1, 2 );
172 Actor CreateRenderableActorSuccess(TestApplication& application, std::string filename)
174 PrepareResourceImage( application, 80u, 80u, Pixel::RGBA8888 );
175 Image image = ResourceImage::New(filename);
176 Actor actor = CreateRenderableActor(image);
177 actor.SetSize( 80, 80 );
181 Actor CreateRenderableActorFailed(TestApplication& application, std::string filename)
183 Image image = ResourceImage::New(filename);
184 DALI_TEST_CHECK( image );
185 Actor actor = CreateRenderableActor(image);
186 actor.SetSize( 80, 80 );
190 Image CreateResourceImage(TestApplication& application, std::string filename)
192 PrepareResourceImage( application, 80u, 80u, Pixel::RGBA8888 );
193 Image image = ResourceImage::New(filename);
194 DALI_TEST_CHECK( image );
198 RenderTask CreateRenderTask(TestApplication& application,
199 CameraActor offscreenCamera,
200 Actor rootActor, // Reset default render task to point at this actor
201 Actor secondRootActor, // Source actor
202 unsigned int refreshRate,
205 // Change main render task to use a different root
206 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
207 taskList.GetTask(0u).SetSourceActor( rootActor );
209 FrameBufferImage frameBufferImage;
212 NativeImageInterfacePtr testNativeImagePtr = TestNativeImage::New(10, 10);
213 frameBufferImage= FrameBufferImage::New( *(testNativeImagePtr.Get()) );
217 frameBufferImage = FrameBufferImage::New( 10, 10 );
220 // Don't draw output framebuffer // '
222 RenderTask newTask = taskList.CreateTask();
223 newTask.SetCameraActor( offscreenCamera );
224 newTask.SetSourceActor( secondRootActor );
225 newTask.SetInputEnabled( false );
226 newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
227 newTask.SetClearEnabled( true );
228 newTask.SetExclusive( true );
229 newTask.SetRefreshRate( refreshRate );
230 newTask.SetTargetFrameBuffer( frameBufferImage );
231 newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, glSync );
235 bool UpdateRender(TestApplication& application, TraceCallStack& callStack, bool testDrawn, bool& finishedSig, bool testFinished, bool testKeepUpdating, int lineNumber )
240 tet_printf("TestApplication::UpdateRender().\n");
242 application.Render(16);
243 application.SendNotification();
245 bool sigPassed = false;
248 sigPassed = finishedSig;
252 sigPassed = ! finishedSig;
255 bool drawResult = callStack.FindMethod("DrawElements") || callStack.FindMethod("DrawArrays");
257 bool drawPassed = false;
260 drawPassed = drawResult;
264 drawPassed = !drawResult;
267 bool keepUpdating = (application.GetUpdateStatus() != 0);
268 bool keepUpdatingPassed = false;
269 if( testKeepUpdating )
271 keepUpdatingPassed = keepUpdating;
275 keepUpdatingPassed = !keepUpdating;
278 bool result = (sigPassed && drawPassed && keepUpdatingPassed);
280 tet_printf("UpdateRender: Expected: Draw:%s Signal:%s KeepUpdating: %s Actual: Draw:%s Signal:%s KeepUpdating: %s %s, line %d\n",
281 BOOLSTR(testDrawn), BOOLSTR(testFinished), BOOLSTR(testKeepUpdating),
282 BOOLSTR(drawResult), BOOLSTR(finishedSig), BOOLSTR(keepUpdating),
283 result ? "Passed":"Failed",
289 } // unnamed namespace
292 /****************************************************************************************************/
293 /****************************************************************************************************/
294 /******************************** TEST CASES BELOW **********************************************/
295 /****************************************************************************************************/
296 /****************************************************************************************************/
298 int UtcDaliRenderTaskDownCast01(void)
300 TestApplication application;
302 tet_infoline("Testing RenderTask::DownCast()");
304 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
306 BaseHandle base = taskList.GetTask( 0u );
307 DALI_TEST_CHECK( base );
309 RenderTask task = RenderTask::DownCast( base );
310 DALI_TEST_CHECK( task );
312 // Try calling a method
313 DALI_TEST_CHECK( task.GetSourceActor() );
317 int UtcDaliRenderTaskDownCast02(void)
319 TestApplication application;
321 tet_infoline("Testing RenderTask::DownCast()");
323 Actor actor = Actor::New();
325 RenderTask task = RenderTask::DownCast( actor );
326 DALI_TEST_CHECK( ! task );
331 int UtcDaliRenderTaskSetSourceActorN(void)
333 TestApplication application;
334 tet_infoline("Testing RenderTask::SetSourceActor() Negative - try with empty actor handle");
335 Stage stage = Stage::GetCurrent();
339 RenderTaskList taskList = stage.GetRenderTaskList();
340 RenderTask renderTask = taskList.CreateTask();
341 renderTask.SetSourceActor(srcActor);
343 application.SendNotification();
344 application.Render();
346 DALI_TEST_CHECK( ! renderTask.GetSourceActor() );
351 int UtcDaliRenderTaskSetSourceActorP01(void)
353 TestApplication application;
355 tet_infoline("Testing RenderTask::SetSourceActor() Positive - check that setting a non-renderable actor stops existing source actor being rendered ");
357 Stage stage = Stage::GetCurrent();
358 RenderTaskList taskList = stage.GetRenderTaskList();
359 RenderTask task = taskList.GetTask( 0u );
361 Actor actor = task.GetSourceActor();
362 DALI_TEST_CHECK( actor );
364 BufferImage img = BufferImage::New( 1,1 );
365 Actor newActor = CreateRenderableActor( img );
366 newActor.SetSize(1,1);
367 stage.Add( newActor );
369 Actor nonRenderableActor = Actor::New();
370 stage.Add( nonRenderableActor );
372 // Stop the newActor from being rendered by changing the source actor
373 DALI_TEST_CHECK( nonRenderableActor );
374 task.SetSourceActor( nonRenderableActor );
375 DALI_TEST_CHECK( task.GetSourceActor() != actor );
376 DALI_TEST_CHECK( task.GetSourceActor() == nonRenderableActor );
378 TestGlAbstraction& gl = application.GetGlAbstraction();
379 TraceCallStack& drawTrace = gl.GetDrawTrace();
380 drawTrace.Enable(true);
382 // Update & Render nothing!
383 application.GetGlAbstraction().ClearBoundTextures();
384 application.SendNotification();
385 application.Render();
387 // Check that nothing was rendered
388 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION );
394 int UtcDaliRenderTaskSetSourceActorP02(void)
396 TestApplication application;
398 tet_infoline("Testing RenderTask::SetSourceActor() Positive - check that switching source from a non-renderable to a renderable actor causes the texture to be drawn");
400 Stage stage = Stage::GetCurrent();
402 RenderTaskList taskList = stage.GetRenderTaskList();
404 RenderTask task = taskList.GetTask( 0u );
406 Actor actor = task.GetSourceActor();
407 DALI_TEST_CHECK( actor );
410 BufferImage img = BufferImage::New( 1,1 );
411 Actor newActor = CreateRenderableActor( img );
412 newActor.SetSize(1,1);
413 stage.Add( newActor );
415 Actor nonRenderableActor = Actor::New();
416 stage.Add( nonRenderableActor );
418 TestGlAbstraction& gl = application.GetGlAbstraction();
419 TraceCallStack& drawTrace = gl.GetDrawTrace();
420 drawTrace.Enable(true);
422 // Stop the newActor from being rendered by changing the source actor
423 DALI_TEST_CHECK( nonRenderableActor );
424 task.SetSourceActor( nonRenderableActor );
425 DALI_TEST_CHECK( task.GetSourceActor() != actor );
426 DALI_TEST_CHECK( task.GetSourceActor() == nonRenderableActor );
428 // Update & Render nothing!
429 application.GetGlAbstraction().ClearBoundTextures();
430 application.SendNotification();
431 application.Render();
433 // Check that nothing was rendered
434 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION );
437 // Set newActor as the new source Actor
438 task.SetSourceActor( newActor );
439 DALI_TEST_CHECK( task.GetSourceActor() != actor );
440 DALI_TEST_CHECK( task.GetSourceActor() == newActor );
442 // Update & Render the newActor
443 application.GetGlAbstraction().ClearBoundTextures();
444 application.SendNotification();
445 application.Render();
447 // Check that the newActor was rendered
448 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 1, TEST_LOCATION );
452 int UtcDaliRenderTaskSetSourceActorOffStage(void)
454 TestApplication application;
456 tet_infoline("Testing RenderTask::SetSourceActor (on/off stage testing)");
458 Stage stage = Stage::GetCurrent();
459 RenderTaskList taskList = stage.GetRenderTaskList();
460 RenderTask task = taskList.GetTask( 0u );
462 Actor actor = task.GetSourceActor();
463 DALI_TEST_CHECK( actor );
465 TestGlAbstraction& gl = application.GetGlAbstraction();
466 TraceCallStack& drawTrace = gl.GetDrawTrace();
467 drawTrace.Enable(true);
469 BufferImage img = BufferImage::New( 1,1 );
470 Actor newActor = CreateRenderableActor( img );
471 newActor.SetSize(1,1);
472 task.SetSourceActor( newActor );
473 // Don't add newActor to stage yet //'
475 // Update & Render with the actor initially off-stage
476 application.SendNotification();
477 application.Render();
479 // Check that nothing was rendered
480 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION );
483 stage.Add( newActor );
485 // Update & Render with the actor on-stage
486 application.GetGlAbstraction().ClearBoundTextures();
487 application.SendNotification();
488 application.Render();
490 // Check that the newActor was rendered
491 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 1, TEST_LOCATION );
494 // Now remove from stage
495 stage.Remove( newActor );
497 // Update & Render with the actor off-stage
498 application.SendNotification();
499 application.Render();
500 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION );
505 int UtcDaliRenderTaskSetSourceActorEmpty(void)
507 TestApplication application;
509 tet_infoline("Testing RenderTask::SetSourceActor (empty handle case)");
511 Stage stage = Stage::GetCurrent();
512 RenderTaskList taskList = stage.GetRenderTaskList();
513 RenderTask task = taskList.GetTask( 0u );
515 Actor actor = task.GetSourceActor();
516 DALI_TEST_CHECK( actor );
518 BufferImage img = BufferImage::New( 1,1 );
519 Actor newActor = CreateRenderableActor( img );
520 newActor.SetSize(1,1);
521 stage.Add( newActor );
523 Actor nonRenderableActor = Actor::New();
524 stage.Add( nonRenderableActor );
526 // Set with empty handle
527 task.SetSourceActor( Actor() );
528 DALI_TEST_CHECK( ! task.GetSourceActor() );
530 TestGlAbstraction& gl = application.GetGlAbstraction();
531 TraceCallStack& drawTrace = gl.GetDrawTrace();
532 drawTrace.Enable(true);
534 // Update & Render nothing!
535 application.SendNotification();
536 application.Render();
538 // Check that nothing was rendered
539 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION );
541 // Set with non-empty handle
542 task.SetSourceActor( newActor );
543 DALI_TEST_CHECK( task.GetSourceActor() == newActor );
545 // Update & Render the newActor
546 application.GetGlAbstraction().ClearBoundTextures();
547 application.SendNotification();
548 application.Render();
550 // Check that the newActor was rendered
551 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 1, TEST_LOCATION );
555 int UtcDaliRenderTaskSetSourceActorDestroyed(void)
557 TestApplication application;
559 tet_infoline( "Testing RenderTask::SetSourceActor - Set a source actor and destroy the source actor" );
561 Stage stage = Stage::GetCurrent();
562 RenderTaskList taskList = stage.GetRenderTaskList();
563 RenderTask task = taskList.GetTask( 0u );
565 Actor actor = task.GetSourceActor();
566 DALI_TEST_CHECK( actor );
568 BufferImage img = BufferImage::New( 1,1 );
569 Actor newActor = CreateRenderableActor( img );
570 newActor.SetSize(1,1);
571 stage.Add( newActor );
573 task.SetSourceActor( newActor );
575 DALI_TEST_CHECK( task.GetSourceActor() != actor );
576 DALI_TEST_CHECK( task.GetSourceActor() == newActor );
578 application.SendNotification();
579 application.Render();
581 // Destroy the source actor
582 stage.Remove( newActor );
585 DALI_TEST_CHECK( !task.GetSourceActor() ); // The source actor should be an empty handle.
590 int UtcDaliRenderTaskGetSourceActorP01(void)
592 TestApplication application;
594 tet_infoline("Testing RenderTask::GetSourceActor() Check the default render task has a valid source actor");
596 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
598 RenderTask task = taskList.GetTask( 0u );
600 Actor actor = task.GetSourceActor();
601 DALI_TEST_CHECK( actor );
603 // By default the entire scene should be rendered
604 Actor root = Stage::GetCurrent().GetLayer( 0 );
605 DALI_TEST_CHECK( root == actor );
609 int UtcDaliRenderTaskGetSourceActorP02(void)
611 TestApplication application;
613 tet_infoline("Testing RenderTask::GetSourceActor() Create a new render task, Add a new actor to the stage and set it as the source of the new render task. Get its source actor and check that it is equivalent to what was set.");
615 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
616 RenderTask task = taskList.CreateTask();
617 Actor actor = Actor::New();
618 Stage::GetCurrent().Add(actor);
619 task.SetSourceActor( actor );
621 DALI_TEST_EQUALS( actor, task.GetSourceActor(), TEST_LOCATION );
626 int UtcDaliRenderTaskGetSourceActorN(void)
628 TestApplication application;
630 tet_infoline("Testing RenderTask::GetSourceActor() Try with empty handle");
635 Actor actor = task.GetSourceActor();
637 catch (Dali::DaliException& e)
639 DALI_TEST_PRINT_ASSERT( e );
640 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
646 int UtcDaliRenderTaskSetExclusive(void)
648 TestApplication application;
650 tet_infoline("Testing RenderTask::SetExclusive() Check that exclusion works");
652 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
654 // Manipulate the GenTextures behaviour, to identify different actors
656 std::vector<GLuint> ids;
657 ids.push_back( 8 ); // 8 = actor1
658 ids.push_back( 9 ); // 9 = actor2
659 ids.push_back( 10 ); // 10 = actor3
660 application.GetGlAbstraction().SetNextTextureIds( ids );
662 BufferImage img1 = BufferImage::New( 1,1 );
663 Actor actor1 = CreateRenderableActor( img1 );
665 Stage::GetCurrent().Add( actor1 );
667 // Update & Render actor1
668 application.SendNotification();
669 application.Render();
671 // Check that the actor1 was rendered
672 const std::vector<GLuint>& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 );
673 DALI_TEST_GREATER( boundTextures.size(), static_cast<std::vector<GLuint>::size_type>( 0 ), TEST_LOCATION );
675 if ( boundTextures.size() )
678 DALI_TEST_EQUALS( boundTextures[c++], 8u/*unique to actor1*/, TEST_LOCATION );
679 if( boundTextures.size() > 1 )
681 DALI_TEST_EQUALS( boundTextures[c++], 8u/*unique to actor1*/, TEST_LOCATION );
685 BufferImage img2 = BufferImage::New( 1,1 );
686 Actor actor2 = CreateRenderableActor( img2 );
689 // Force actor2 to be rendered before actor1
690 Layer layer = Layer::New();
691 Stage::GetCurrent().Add( layer );
693 layer.LowerToBottom();
696 application.GetGlAbstraction().ClearBoundTextures();
697 application.SendNotification();
698 application.Render();
700 // Check that the actors were rendered
701 DALI_TEST_GREATER( boundTextures.size(), static_cast<std::vector<GLuint>::size_type>( 1 ), TEST_LOCATION );
703 if ( boundTextures.size() )
706 DALI_TEST_EQUALS( boundTextures[c++], 9u/*unique to actor2*/, TEST_LOCATION );
707 if( boundTextures.size() > 2 )
709 DALI_TEST_EQUALS( boundTextures[c++], 9u/*unique to actor1*/, TEST_LOCATION );
711 DALI_TEST_EQUALS( boundTextures[c++], 8u/*unique to actor1*/, TEST_LOCATION );
714 BufferImage img3 = BufferImage::New( 1,1 );
715 Actor actor3 = CreateRenderableActor( img3 );
718 // Force actor3 to be rendered before actor2
719 layer = Layer::New();
720 Stage::GetCurrent().Add( layer );
722 layer.LowerToBottom();
724 // Update & Render all actors
725 application.GetGlAbstraction().ClearBoundTextures();
726 application.SendNotification();
727 application.Render();
729 // Check that the actors were rendered
730 DALI_TEST_GREATER( boundTextures.size(), static_cast<std::vector<GLuint>::size_type>( 2 ), TEST_LOCATION );
732 if ( boundTextures.size() )
735 DALI_TEST_EQUALS( boundTextures[c++], 10u/*unique to actor3*/, TEST_LOCATION );
736 if( boundTextures.size() > 3 )
738 DALI_TEST_EQUALS( boundTextures[c++], 10u/*unique to actor2*/, TEST_LOCATION );
740 DALI_TEST_EQUALS( boundTextures[c++], 9u/*unique to actor2*/, TEST_LOCATION );
741 DALI_TEST_EQUALS( boundTextures[c++], 8u/*unique to actor1*/, TEST_LOCATION );
744 // Both actors are now connected to the root node
745 // Setup 2 render-tasks - the first will render from the root-node, and the second from actor2
747 // Not exclusive is the default
748 RenderTask task1 = taskList.GetTask( 0u );
749 DALI_TEST_CHECK( false == task1.IsExclusive() );
751 RenderTask task2 = taskList.CreateTask();
752 DALI_TEST_CHECK( false == task2.IsExclusive() );
753 task2.SetSourceActor( actor2 );
755 // Task1 should render all actors, and task 2 should render only actor2
757 application.GetGlAbstraction().ClearBoundTextures();
758 application.SendNotification();
759 application.Render();
761 DALI_TEST_EQUALS( boundTextures.size(), 4u, TEST_LOCATION );
763 if ( boundTextures.size() == 4 )
765 // Test that task 1 renders actor3, then actor2 & then actor1
766 DALI_TEST_CHECK( boundTextures[0] == 10u );
767 DALI_TEST_CHECK( boundTextures[1] == 9u );
768 DALI_TEST_CHECK( boundTextures[2] == 8u );
770 // Test that task 2 renders actor2
771 DALI_TEST_EQUALS( boundTextures[3], 9u, TEST_LOCATION );
774 // Make actor2 exclusive to task2
776 task2.SetExclusive( true );
777 DALI_TEST_CHECK( true == task2.IsExclusive() );
779 // Task1 should render only actor1, and task 2 should render only actor2
781 application.GetGlAbstraction().ClearBoundTextures();
782 application.SendNotification();
783 application.Render();
785 DALI_TEST_EQUALS( boundTextures.size(), 3u, TEST_LOCATION );
786 if ( boundTextures.size() == 3 )
788 // Test that task 1 renders actor3 & actor1
789 DALI_TEST_CHECK( boundTextures[0] == 10u );
790 DALI_TEST_CHECK( boundTextures[1] == 8u );
792 // Test that task 2 renders actor2
793 DALI_TEST_CHECK( boundTextures[2] == 9u );
796 // Create a renderable actor and replace the source actor in task2
797 auto actor4 = CreateRenderableActor();
798 task2.SetSourceActor( actor3 );
799 DALI_TEST_EQUALS( actor3, task2.GetSourceActor(), TEST_LOCATION );
804 int UtcDaliRenderTaskSetExclusive02(void)
806 TestApplication application;
808 tet_infoline("Testing RenderTask::SetExclusive() Check that changing from exclusive to not-exclusive works");
810 std::vector<GLuint> ids;
811 ids.push_back( 8 ); // 8 = actor1
812 application.GetGlAbstraction().SetNextTextureIds( ids );
814 BufferImage img1 = BufferImage::New( 1,1 );
815 Actor actor1 = CreateRenderableActor( img1 );
817 Stage::GetCurrent().Add( actor1 );
819 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
820 RenderTask task = taskList.CreateTask();
822 task.SetSourceActor( actor1 );
823 task.SetExclusive(true); // Actor should only render once
825 TestGlAbstraction& gl = application.GetGlAbstraction();
826 TraceCallStack& drawTrace = gl.GetDrawTrace();
827 drawTrace.Enable(true);
829 // Update & Render actor1
830 application.SendNotification();
831 application.Render();
833 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 1, TEST_LOCATION );
835 // Set task to non-exclusive - actor1 should render twice:
837 task.SetExclusive(false);
838 application.SendNotification();
839 application.Render();
841 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 2, TEST_LOCATION );
846 int UtcDaliRenderTaskSetExclusiveN(void)
848 TestApplication application;
850 tet_infoline("Testing RenderTask::SetExclusive() on empty handle");
855 task.SetExclusive(true);
857 catch (Dali::DaliException& e)
859 DALI_TEST_PRINT_ASSERT( e );
860 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
865 int UtcDaliRenderTaskIsExclusive01(void)
867 TestApplication application;
869 tet_infoline("Testing RenderTask::IsExclusive() Check default values are non-exclusive");
871 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
873 // Not exclusive is the default
874 RenderTask task = taskList.GetTask( 0u );
875 DALI_TEST_CHECK( false == task.IsExclusive() );
877 RenderTask newTask = taskList.CreateTask();
878 DALI_TEST_CHECK( false == newTask.IsExclusive() );
883 int UtcDaliRenderTaskIsExclusive02(void)
885 TestApplication application;
887 tet_infoline("Testing RenderTask::IsExclusive() Check the getter returns set values");
889 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
891 // Not exclusive is the default
892 RenderTask newTask = taskList.CreateTask();
893 DALI_TEST_EQUALS( newTask.IsExclusive(), false, TEST_LOCATION );
895 newTask.SetExclusive(true);
896 DALI_TEST_EQUALS( newTask.IsExclusive(), true, TEST_LOCATION );
900 int UtcDaliRenderTaskIsExclusiveN(void)
902 TestApplication application;
904 tet_infoline("Testing RenderTask::IsExclusive() on empty handle");
909 bool x = task.IsExclusive();
912 catch (Dali::DaliException& e)
914 DALI_TEST_PRINT_ASSERT( e );
915 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
920 int UtcDaliRenderTaskSetInputEnabled(void)
922 TestApplication application;
924 tet_infoline("Testing RenderTask::SetInputEnabled()");
926 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
928 // Input is enabled by default
929 RenderTask task = taskList.GetTask( 0u );
930 DALI_TEST_CHECK( true == task.GetInputEnabled() );
932 task.SetInputEnabled( false );
933 DALI_TEST_CHECK( false == task.GetInputEnabled() );
935 task.SetInputEnabled( true );
936 DALI_TEST_CHECK( true == task.GetInputEnabled() );
940 int UtcDaliRenderTaskGetInputEnabled(void)
942 TestApplication application;
944 tet_infoline("Testing RenderTask::GetInputEnabled()");
946 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
948 // Input is enabled by default
949 RenderTask task = taskList.GetTask( 0u );
950 DALI_TEST_EQUALS( true, task.GetInputEnabled(), TEST_LOCATION );
952 RenderTask newTask = taskList.CreateTask();
953 DALI_TEST_EQUALS( true, newTask.GetInputEnabled(), TEST_LOCATION );
955 newTask.SetInputEnabled(false);
956 DALI_TEST_EQUALS( false, newTask.GetInputEnabled(), TEST_LOCATION );
961 int UtcDaliRenderTaskSetCameraActorP(void)
963 TestApplication application;
965 tet_infoline("Testing RenderTask::SetCameraActor()");
967 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
969 RenderTask task = taskList.GetTask( 0u );
971 Actor defaultCameraActor = task.GetCameraActor();
972 DALI_TEST_CHECK( defaultCameraActor );
974 CameraActor newCameraActor = CameraActor::New();
975 DALI_TEST_CHECK( newCameraActor );
977 task.SetCameraActor( newCameraActor );
978 DALI_TEST_CHECK( task.GetCameraActor() != defaultCameraActor );
979 DALI_TEST_EQUALS( task.GetCameraActor(), newCameraActor, TEST_LOCATION );
984 int UtcDaliRenderTaskSetCameraActorN(void)
986 TestApplication application;
988 tet_infoline("Testing RenderTask::SetCameraActor() with empty actor handle");
990 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
992 RenderTask task = taskList.GetTask( 0u );
994 Actor actor = task.GetCameraActor();
995 DALI_TEST_CHECK( actor );
997 CameraActor cameraActor;
999 task.SetCameraActor( cameraActor );
1000 DALI_TEST_EQUALS( (bool)task.GetCameraActor(), false, TEST_LOCATION );
1001 DALI_TEST_EQUALS( task.GetCameraActor(), cameraActor, TEST_LOCATION );
1005 int UtcDaliRenderTaskSetCameraActorDestroyed(void)
1007 TestApplication application;
1009 tet_infoline( "Testing RenderTask::SetCameraActor - Set a camera actor and destroy the camera actor" );
1011 Stage stage = Stage::GetCurrent();
1012 RenderTaskList taskList = stage.GetRenderTaskList();
1013 RenderTask task = taskList.GetTask( 0u );
1015 CameraActor newCameraActor = CameraActor::New();
1016 task.SetCameraActor( newCameraActor );
1018 DALI_TEST_EQUALS( task.GetCameraActor(), newCameraActor, TEST_LOCATION );
1020 // Destroy the camera actor
1021 newCameraActor.Reset();
1023 CameraActor camera = task.GetCameraActor();
1024 DALI_TEST_CHECK( !camera ); // The camera actor should be an empty handle.
1029 int UtcDaliRenderTaskGetCameraActorP(void)
1031 TestApplication application;
1033 tet_infoline("Testing RenderTask::GetCameraActor()");
1035 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1037 RenderTask task = taskList.GetTask( 0u );
1039 CameraActor actor = task.GetCameraActor();
1040 DALI_TEST_CHECK( actor );
1041 DALI_TEST_EQUALS( actor.GetProjectionMode(), Dali::Camera::PERSPECTIVE_PROJECTION, TEST_LOCATION );
1042 DALI_TEST_GREATER( actor.GetFieldOfView(), 0.0f, TEST_LOCATION );
1046 int UtcDaliRenderTaskGetCameraActorN(void)
1048 TestApplication application;
1050 tet_infoline("Testing RenderTask::GetCameraActor() with empty handle");
1055 Actor actor = task.GetCameraActor();
1057 catch (Dali::DaliException& e)
1059 DALI_TEST_PRINT_ASSERT( e );
1060 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1066 int UtcDaliRenderTaskSetTargetFrameBufferP(void)
1068 TestApplication application;
1070 tet_infoline("Testing RenderTask::SetTargetFrameBuffer()");
1072 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1074 RenderTask task = taskList.GetTask( 0u );
1076 FrameBufferImage newImage = FrameBufferImage::New();
1077 task.SetTargetFrameBuffer( newImage );
1078 DALI_TEST_CHECK( task.GetTargetFrameBuffer() == newImage );
1082 int UtcDaliRenderTaskSetTargetFrameBufferN(void)
1084 TestApplication application;
1086 tet_infoline("Testing RenderTask::SetTargetFrameBuffer()");
1088 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1090 RenderTask task = taskList.GetTask( 0u );
1091 FrameBufferImage newImage; // Empty handle
1092 task.SetTargetFrameBuffer( newImage );
1093 DALI_TEST_EQUALS( (bool)task.GetTargetFrameBuffer(), false, TEST_LOCATION );
1097 int UtcDaliRenderTaskGetTargetFrameBufferP(void)
1099 TestApplication application;
1101 tet_infoline("Testing RenderTask::GetTargetFrameBuffer()");
1103 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1105 RenderTask newTask = taskList.CreateTask();
1106 FrameBufferImage fb = FrameBufferImage::New(128, 128, Pixel::RGBA8888);
1107 newTask.SetTargetFrameBuffer( fb );
1108 DALI_TEST_EQUALS( newTask.GetTargetFrameBuffer(), fb, TEST_LOCATION );
1112 int UtcDaliRenderTaskGetTargetFrameBufferN(void)
1114 TestApplication application;
1116 tet_infoline("Testing RenderTask::GetTargetFrameBuffer()");
1118 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1120 RenderTask task = taskList.GetTask( 0u );
1122 // By default render-tasks do not render off-screen
1123 FrameBufferImage image = task.GetTargetFrameBuffer();
1124 DALI_TEST_CHECK( !image );
1129 int UtcDaliRenderTaskSetFrameBufferP(void)
1131 TestApplication application;
1133 tet_infoline("Testing RenderTask::SetFrameBuffer()");
1135 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1137 RenderTask task = taskList.GetTask( 0u );
1139 FrameBuffer newFrameBuffer = FrameBuffer::New( 128u, 128u, FrameBuffer::Attachment::NONE );
1140 task.SetFrameBuffer( newFrameBuffer );
1141 DALI_TEST_CHECK( task.GetFrameBuffer() == newFrameBuffer );
1145 int UtcDaliRenderTaskSetFrameBufferN(void)
1147 TestApplication application;
1149 tet_infoline("Testing RenderTask::SetFrameBuffer()");
1151 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1153 RenderTask task = taskList.GetTask( 0u );
1154 FrameBuffer newFrameBuffer; // Empty handle
1155 task.SetFrameBuffer( newFrameBuffer );
1156 DALI_TEST_EQUALS( (bool)task.GetFrameBuffer(), false, TEST_LOCATION );
1160 int UtcDaliRenderTaskGetFrameBufferP(void)
1162 TestApplication application;
1164 tet_infoline("Testing RenderTask::GetFrameBuffer()");
1166 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1168 RenderTask task = taskList.GetTask( 0u );
1170 FrameBuffer newFrameBuffer = FrameBuffer::New( 1u, 1u, FrameBuffer::Attachment::NONE );
1171 task.SetFrameBuffer( newFrameBuffer );
1172 DALI_TEST_CHECK( task.GetFrameBuffer() == newFrameBuffer );
1176 int UtcDaliRenderTaskGetFrameBufferN(void)
1178 TestApplication application;
1180 tet_infoline("Testing RenderTask::GetFrameBuffer()");
1182 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1184 RenderTask task = taskList.GetTask( 0u );
1186 // By default render-tasks do not render off-screen
1187 FrameBuffer frameBuffer = task.GetFrameBuffer();
1188 DALI_TEST_CHECK( !frameBuffer );
1193 int UtcDaliRenderTaskSetScreenToFrameBufferFunctionP(void)
1195 TestApplication application;
1197 tet_infoline("Testing RenderTask::SetScreenToFrameBufferFunction()");
1199 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1201 RenderTask task = taskList.GetTask( 0u );
1203 task.SetScreenToFrameBufferFunction( TestScreenToFrameBufferFunction );
1205 Vector2 coordinates( 5, 10 );
1206 Vector2 convertedCoordinates( 6, 12 ); // + Vector(1, 2)
1208 RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction();
1209 DALI_TEST_CHECK( func( coordinates ) );
1210 DALI_TEST_CHECK( coordinates == convertedCoordinates );
1212 task.SetScreenToFrameBufferFunction( RenderTask::FULLSCREEN_FRAMEBUFFER_FUNCTION );
1213 func = task.GetScreenToFrameBufferFunction();
1214 DALI_TEST_CHECK( func( coordinates ) );
1216 task.SetScreenToFrameBufferFunction( RenderTask::DEFAULT_SCREEN_TO_FRAMEBUFFER_FUNCTION );
1217 func = task.GetScreenToFrameBufferFunction();
1218 DALI_TEST_CHECK( ! func( coordinates ) );
1222 int UtcDaliRenderTaskSetScreenToFrameBufferFunctionN(void)
1224 TestApplication application;
1226 tet_infoline("Testing RenderTask::SetScreenToFrameBufferFunction()");
1228 RenderTask task; // Empty handle
1231 task.SetScreenToFrameBufferFunction( TestScreenToFrameBufferFunction );
1233 catch (Dali::DaliException& e)
1235 DALI_TEST_PRINT_ASSERT( e );
1236 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1241 int UtcDaliRenderTaskGetScreenToFrameBufferFunctionP(void)
1243 TestApplication application;
1245 tet_infoline("Testing RenderTask::GetScreenToFrameBufferFunction()");
1247 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1249 RenderTask task = taskList.GetTask( 0u );
1251 Vector2 originalCoordinates( 5, 10 );
1252 Vector2 coordinates( 5, 10 );
1254 RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction();
1255 DALI_TEST_CHECK( !func( coordinates ) ); // conversion should fail by default
1256 DALI_TEST_CHECK( coordinates == originalCoordinates ); // coordinates should not be modified
1260 int UtcDaliRenderTaskGetScreenToFrameBufferFunctionN(void)
1262 TestApplication application;
1264 tet_infoline("Testing RenderTask::GetScreenToFrameBufferFunction() on empty handle");
1269 RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction();
1272 catch (Dali::DaliException& e)
1274 DALI_TEST_PRINT_ASSERT( e );
1275 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1281 int UtcDaliRenderTaskGetScreenToFrameBufferMappingActorP(void)
1283 TestApplication application;
1284 tet_infoline("Testing RenderTask::GetScreenToFrameBufferMappingActor ");
1286 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1287 RenderTask renderTask = taskList.CreateTask();
1288 Actor mappingActor = Actor::New();
1289 renderTask.SetScreenToFrameBufferMappingActor(mappingActor);
1291 DALI_TEST_EQUALS( mappingActor, renderTask.GetScreenToFrameBufferMappingActor(), TEST_LOCATION );
1296 int UtcDaliRenderTaskGetScreenToFrameBufferMappingActorN(void)
1298 TestApplication application;
1299 tet_infoline("Testing RenderTask::GetScreenToFrameBufferMappingActor with empty task handle");
1305 task.SetScreenToFrameBufferMappingActor(mappingActor);
1307 catch (Dali::DaliException& e)
1309 DALI_TEST_PRINT_ASSERT( e );
1310 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1315 int UtcDaliRenderTaskGetScreenToFrameBufferMappingActor02N(void)
1317 TestApplication application;
1318 tet_infoline("Testing RenderTask::GetScreenToFrameBufferMappingActor with empty task handle");
1320 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1321 RenderTask renderTask = taskList.CreateTask();
1323 renderTask.SetScreenToFrameBufferMappingActor(actor);
1325 DALI_TEST_EQUALS( (bool)renderTask.GetScreenToFrameBufferMappingActor(), false, TEST_LOCATION);
1329 int UtcDaliRenderTaskGetViewportP01(void)
1331 TestApplication application;
1333 tet_infoline("Testing RenderTask::GetViewport() on default task");
1335 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1336 RenderTask task = taskList.GetTask( 0u );
1337 Viewport viewport = task.GetViewport();
1339 // By default the viewport should match the stage width/height
1340 Vector2 stageSize = Stage::GetCurrent().GetSize();
1341 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
1342 DALI_TEST_CHECK( viewport == expectedViewport );
1346 int UtcDaliRenderTaskGetViewportP02(void)
1348 TestApplication application;
1350 tet_infoline("Testing RenderTask::GetViewport() on new task");
1352 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1353 RenderTask task = taskList.CreateTask();
1354 Viewport viewport = task.GetViewport();
1356 // By default the viewport should match the stage width/height
1357 Vector2 stageSize = Stage::GetCurrent().GetSize();
1358 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
1359 DALI_TEST_CHECK( viewport == expectedViewport );
1363 int UtcDaliRenderTaskGetViewportN(void)
1365 TestApplication application;
1367 tet_infoline("Testing RenderTask::GetViewport() on empty handle");
1372 Viewport viewport = task.GetViewport();
1375 catch (Dali::DaliException& e)
1377 DALI_TEST_PRINT_ASSERT( e );
1378 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1384 int UtcDaliRenderTaskSetViewportP(void)
1386 TestApplication application;
1388 tet_infoline("Testing RenderTask::SetViewport()");
1390 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1392 RenderTask task = taskList.GetTask( 0u );
1393 Vector2 stageSize = Stage::GetCurrent().GetSize();
1394 Viewport newViewport( 0, 0, stageSize.width * 0.5f, stageSize.height * 0.5f );
1395 task.SetViewport( newViewport );
1397 // Update (viewport is a property)
1398 application.SendNotification();
1399 application.Render();
1401 DALI_TEST_CHECK( task.GetViewport() == newViewport );
1405 int UtcDaliRenderTaskSetViewportN(void)
1407 TestApplication application;
1409 tet_infoline("Testing RenderTask::SetViewport()");
1411 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1416 Vector2 stageSize = Stage::GetCurrent().GetSize();
1417 Viewport newViewport( 0, 0, stageSize.width * 0.5f, stageSize.height * 0.5f );
1418 task.SetViewport( newViewport );
1420 catch (Dali::DaliException& e)
1422 DALI_TEST_PRINT_ASSERT( e );
1423 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1430 int UtcDaliRenderTaskSetViewportPosition(void)
1432 TestApplication application;
1434 tet_infoline("Testing RenderTask::SetViewportPosition()");
1436 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1438 RenderTask task = taskList.GetTask( 0u );
1440 Viewport viewport = task.GetViewport();
1442 // By default the viewport should match the stage width/height
1444 Vector2 stageSize = Stage::GetCurrent().GetSize();
1445 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
1446 DALI_TEST_CHECK( viewport == expectedViewport );
1449 Vector2 newPosition(25.0f, 50.0f);
1450 task.SetViewportPosition( newPosition );
1452 // Update (viewport is a property)
1453 application.SendNotification();
1454 application.Render();
1456 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1458 // Set by Property test
1459 Vector2 newPosition2(32.0f, 32.0f);
1460 task.SetProperty( RenderTask::Property::VIEWPORT_POSITION, newPosition2 );
1461 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition2, TEST_LOCATION );
1462 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition, TEST_LOCATION ); // still the old position
1465 application.SendNotification();
1466 application.Render();
1468 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition2, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1469 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition2, TEST_LOCATION );
1470 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition2, TEST_LOCATION );
1472 Vector2 newPosition3(64.0f, 0.0f);
1473 Animation animation = Animation::New(1.0f);
1474 animation.AnimateTo( Property( task, RenderTask::Property::VIEWPORT_POSITION ), newPosition3, AlphaFunction::LINEAR );
1477 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1478 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition2, TEST_LOCATION );
1480 // Perform 1000ms worth of updates at which point animation should have completed.
1481 Wait(application, 1000);
1482 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1483 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1484 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1486 // Create another animation which animates by a certain value
1487 const Vector2 newPosition4( 75.0f, 45.0f );
1488 const Vector2 relativePosition( newPosition4 - newPosition3 );
1489 animation = Animation::New( 1.0f );
1490 animation.AnimateBy( Property( task, RenderTask::Property::VIEWPORT_POSITION ), relativePosition );
1493 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1494 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition3, TEST_LOCATION );
1496 // Perform 1000ms worth of updates at which point animation should have completed.
1497 Wait(application, 1000);
1498 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1499 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1500 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1505 int UtcDaliRenderTaskSetViewportSize(void)
1507 TestApplication application;
1509 tet_infoline("Testing RenderTask::SetViewportSize()");
1511 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1513 RenderTask task = taskList.GetTask( 0u );
1515 Viewport viewport = task.GetViewport();
1517 // By default the viewport should match the stage width/height
1519 Vector2 stageSize = Stage::GetCurrent().GetSize();
1520 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
1521 DALI_TEST_CHECK( viewport == expectedViewport );
1523 Vector2 newSize(128.0f, 64.0f);
1524 task.SetViewportSize( newSize );
1526 // Update (viewport is a property)
1527 application.SendNotification();
1528 application.Render();
1530 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1532 // Set by Property test
1533 Vector2 newSize2(50.0f, 50.0f);
1534 task.SetProperty( RenderTask::Property::VIEWPORT_SIZE, newSize2 );
1535 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize2, TEST_LOCATION );
1536 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize, TEST_LOCATION ); // still the old position
1539 application.SendNotification();
1540 application.Render();
1542 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize2, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1543 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize2, TEST_LOCATION );
1544 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize2, TEST_LOCATION );
1546 Vector2 newSize3(10.0f, 10.0f);
1547 Animation animation = Animation::New(1.0f);
1548 animation.AnimateTo( Property( task, RenderTask::Property::VIEWPORT_SIZE ), newSize3, AlphaFunction::LINEAR );
1551 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1552 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize2, TEST_LOCATION );
1554 // Perform 1000ms worth of updates at which point animation should have completed.
1555 Wait(application, 1000);
1556 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1557 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1558 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1560 // Create another animation which animates by a certain value
1561 const Vector2 newSize4( 75.0f, 45.0f );
1562 const Vector2 relativeSize( newSize4 - newSize3 );
1563 animation = Animation::New( 1.0f );
1564 animation.AnimateBy( Property( task, RenderTask::Property::VIEWPORT_SIZE ), relativeSize );
1567 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1568 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize3, TEST_LOCATION );
1570 // Perform 1000ms worth of updates at which point animation should have completed.
1571 Wait(application, 1000);
1572 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1573 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1574 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1579 int UtcDaliRenderTaskSetClearColorP(void)
1581 TestApplication application;
1583 tet_infoline("Testing RenderTask::SetClearColor()");
1585 Vector4 testColor( 1.0f, 2.0f, 3.0f, 4.0f );
1586 Vector4 testColor2( 5.0f, 6.0f, 7.0f, 8.0f );
1588 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1590 RenderTask task = taskList.GetTask( 0u );
1591 DALI_TEST_CHECK( task.GetClearColor() != testColor );
1593 task.SetClearColor( testColor );
1598 DALI_TEST_EQUALS( task.GetClearColor(), testColor, TEST_LOCATION );
1600 task.SetProperty( RenderTask::Property::CLEAR_COLOR, testColor2 );
1601 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor2, TEST_LOCATION );
1602 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor, TEST_LOCATION ); // still the old color
1607 DALI_TEST_EQUALS( task.GetClearColor(), testColor2, TEST_LOCATION );
1608 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor2, TEST_LOCATION );
1609 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor2, TEST_LOCATION );
1611 Vector4 newColor3(10.0f, 10.0f, 20.0f, 30.0f);
1612 Animation animation = Animation::New(1.0f);
1613 animation.AnimateTo( Property( task, RenderTask::Property::CLEAR_COLOR ), newColor3, AlphaFunction::LINEAR );
1616 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1617 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor2, TEST_LOCATION );
1619 // Perform 1000ms worth of updates at which point animation should have completed.
1620 Wait(application, 1000);
1621 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1622 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1624 // Create another animation which animates by a certain value
1625 const Vector4 newColor4( 0.45f, 0.35f, 0.25f, 0.1f );
1626 const Vector4 relativeColor( newColor4 - newColor3 );
1627 animation = Animation::New( 1.0f );
1628 animation.AnimateBy( Property( task, RenderTask::Property::CLEAR_COLOR ), relativeColor );
1631 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor4, Math::MACHINE_EPSILON_10, TEST_LOCATION );
1632 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor3, Math::MACHINE_EPSILON_10, TEST_LOCATION );
1634 // Perform 1000ms worth of updates at which point animation should have completed.
1635 Wait(application, 1000);
1636 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor4, Math::MACHINE_EPSILON_10, TEST_LOCATION );
1637 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor4, Math::MACHINE_EPSILON_10, TEST_LOCATION );
1642 int UtcDaliRenderTaskSetClearColorN(void)
1644 TestApplication application;
1646 tet_infoline("Testing RenderTask::SetClearColor() on empty handle");
1651 task.SetClearColor( Vector4::ZERO );
1653 catch (Dali::DaliException& e)
1655 DALI_TEST_PRINT_ASSERT( e );
1656 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1661 int UtcDaliRenderTaskGetClearColorP(void)
1663 TestApplication application;
1665 tet_infoline("Testing RenderTask::GetClearColor()");
1667 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1668 RenderTask task = taskList.GetTask( 0u );
1669 DALI_TEST_EQUALS( task.GetClearColor(), RenderTask::DEFAULT_CLEAR_COLOR, TEST_LOCATION );
1673 int UtcDaliRenderTaskGetClearColorN(void)
1675 TestApplication application;
1677 tet_infoline("Testing RenderTask::GetClearColor()");
1682 Vector4 color = task.GetClearColor();
1685 catch (Dali::DaliException& e)
1687 DALI_TEST_PRINT_ASSERT( e );
1688 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1693 int UtcDaliRenderTaskSetClearEnabledP(void)
1695 TestApplication application;
1697 tet_infoline("Testing RenderTask::SetClearEnabled()");
1699 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1701 RenderTask task = taskList.GetTask( 0u );
1702 DALI_TEST_CHECK( task.GetClearEnabled() ); // defaults to true
1704 task.SetClearEnabled( false );
1705 DALI_TEST_EQUALS( task.GetClearEnabled(), false, TEST_LOCATION );
1707 task.SetClearEnabled( true );
1708 DALI_TEST_EQUALS( task.GetClearEnabled(), true, TEST_LOCATION );
1712 int UtcDaliRenderTaskSetClearEnabledN(void)
1714 TestApplication application;
1716 tet_infoline("Testing RenderTask::SetClearEnabled() with empty handle");
1721 task.SetClearEnabled(true);
1723 catch (Dali::DaliException& e)
1725 DALI_TEST_PRINT_ASSERT( e );
1726 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1731 int UtcDaliRenderTaskGetClearEnabledP(void)
1733 TestApplication application;
1735 tet_infoline("Testing RenderTask::GetClearEnabled()");
1737 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1739 RenderTask task = taskList.GetTask( 0u );
1740 DALI_TEST_CHECK( task.GetClearEnabled() ); // defaults to true
1745 int UtcDaliRenderTaskGetClearEnabledN(void)
1747 TestApplication application;
1749 tet_infoline("Testing RenderTask::GetClearEnabled() with empty handle");
1754 bool x = task.GetClearEnabled();
1757 catch (Dali::DaliException& e)
1759 DALI_TEST_PRINT_ASSERT( e );
1760 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1765 int UtcDaliRenderTaskSetCullModeP(void)
1767 TestApplication application;
1769 tet_infoline("Testing RenderTask::SetCullMode()");
1771 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1772 RenderTask task = taskList.GetTask( 0u );
1773 DALI_TEST_EQUALS( task.GetCullMode(), true, TEST_LOCATION );
1775 task.SetCullMode( false );
1777 DALI_TEST_EQUALS( task.GetCullMode(), false, TEST_LOCATION );
1782 int UtcDaliRenderTaskSetCullModeN(void)
1784 TestApplication application;
1786 tet_infoline("Testing RenderTask::SetCullMode() on empty handle");
1791 task.SetCullMode( false );
1793 catch (Dali::DaliException& e)
1795 DALI_TEST_PRINT_ASSERT( e );
1796 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1801 int UtcDaliRenderTaskGetCullModeP(void)
1803 TestApplication application;
1805 tet_infoline("Testing RenderTask::GetCullMode()");
1807 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1808 RenderTask task = taskList.GetTask( 0u );
1809 DALI_TEST_EQUALS( task.GetCullMode(), true, TEST_LOCATION );
1813 int UtcDaliRenderTaskGetCullModeN(void)
1815 TestApplication application;
1817 tet_infoline("Testing RenderTask::GetCullMode() with empty handle");
1822 bool x = task.GetCullMode();
1825 catch (Dali::DaliException& e)
1827 DALI_TEST_PRINT_ASSERT( e );
1828 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1834 int UtcDaliRenderTaskSetRefreshRate(void)
1836 TestApplication application;
1838 tet_infoline("Testing RenderTask::SetRefreshRate()");
1840 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1842 // By default tasks will be processed every frame
1843 RenderTask task = taskList.GetTask( 0u );
1844 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
1846 task.SetRefreshRate( 2u ); // every-other frame
1847 DALI_TEST_CHECK( 2u == task.GetRefreshRate() );
1849 task.SetRefreshRate( RenderTask::REFRESH_ALWAYS );
1850 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
1854 int UtcDaliRenderTaskGetRefreshRate(void)
1856 TestApplication application;
1858 tet_infoline("Testing RenderTask::GetRefreshRate()");
1860 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1862 // By default tasks will be processed every frame
1863 RenderTask task = taskList.GetTask( 0u );
1864 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
1866 RenderTask newTask = taskList.CreateTask();
1867 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == newTask.GetRefreshRate() );
1871 int UtcDaliRenderTaskSignalFinished(void)
1873 TestApplication application;
1875 tet_infoline("Testing RenderTask::SignalFinished()");
1877 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1878 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1880 CameraActor offscreenCameraActor = CameraActor::New();
1882 Stage::GetCurrent().Add( offscreenCameraActor );
1884 BufferImage image = BufferImage::New( 10, 10 );
1886 Actor rootActor = CreateRenderableActor( image );
1887 rootActor.SetSize( 10, 10 );
1888 Stage::GetCurrent().Add( rootActor );
1890 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1891 NativeImageInterfacePtr testNativeImagePtr = TestNativeImage::New(10, 10);
1892 FrameBufferImage frameBufferImage = FrameBufferImage::New( *testNativeImagePtr.Get() );
1894 RenderTask newTask = taskList.CreateTask();
1895 newTask.SetCameraActor( offscreenCameraActor );
1896 newTask.SetSourceActor( rootActor );
1897 newTask.SetInputEnabled( false );
1898 newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
1899 newTask.SetClearEnabled( true );
1900 newTask.SetExclusive( true );
1901 newTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
1902 newTask.SetTargetFrameBuffer( frameBufferImage );
1903 newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, true );
1905 bool finished = false;
1906 RenderTaskFinished renderTaskFinished( finished );
1907 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1909 // Flush the queue and render.
1910 application.SendNotification();
1912 // 1 render to process render task, then wait for sync before finished msg is sent
1913 // from update to the event thread.
1915 application.Render();
1916 application.SendNotification();
1917 DALI_TEST_CHECK( !finished );
1919 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1920 DALI_TEST_CHECK( lastSyncObj != NULL );
1922 application.Render();
1923 DALI_TEST_EQUALS( (Integration::KeepUpdating::Reasons)(application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
1924 application.SendNotification();
1925 DALI_TEST_CHECK( !finished );
1927 application.Render();
1928 DALI_TEST_EQUALS( (Integration::KeepUpdating::Reasons)(application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
1929 application.SendNotification();
1930 DALI_TEST_CHECK( ! finished );
1932 sync.SetObjectSynced( lastSyncObj, true );
1934 application.Render();
1935 application.SendNotification();
1936 DALI_TEST_CHECK( !finished );
1938 application.Render();
1939 application.SendNotification();
1940 DALI_TEST_CHECK( finished );
1942 DALI_TEST_EQUALS( application.GetUpdateStatus(), 0, TEST_LOCATION );
1947 int UtcDaliRenderTaskContinuous01(void)
1949 TestApplication application;
1951 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (source actor not staged)\nPOST:continuous renders, no Finished signal");
1953 // SETUP AN OFFSCREEN RENDER TASK
1954 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1955 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1956 drawTrace.Enable(true);
1958 Actor rootActor = Actor::New();
1959 Stage::GetCurrent().Add( rootActor );
1961 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
1962 Stage::GetCurrent().Add( offscreenCameraActor );
1964 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
1966 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1967 bool finished = false;
1968 RenderTaskFinished renderTaskFinished( finished );
1969 application.SendNotification();
1971 // START PROCESS/RENDER Input, Expected Input, Expected, KeepUpdating
1972 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false, __LINE__ ) );
1973 application.GetPlatform().ClearReadyResources();
1975 // ADD SOURCE ACTOR TO STAGE - expect continuous renders to start, no finished signal
1976 Stage::GetCurrent().Add(secondRootActor);
1977 application.SendNotification();
1979 // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
1980 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
1985 int UtcDaliRenderTaskContinuous02(void)
1987 TestApplication application;
1989 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (source actor not visible)\nPOST:continuous renders, no Finished signal");
1991 // SETUP AN OFFSCREEN RENDER TASK
1992 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1993 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1994 drawTrace.Enable(true);
1996 Actor rootActor = Actor::New();
1997 Stage::GetCurrent().Add( rootActor );
1999 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2000 Stage::GetCurrent().Add( offscreenCameraActor );
2002 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2003 Stage::GetCurrent().Add(secondRootActor);
2004 secondRootActor.SetProperty( Actor::Property::VISIBLE,false);
2006 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
2007 bool finished = false;
2008 RenderTaskFinished renderTaskFinished( finished );
2009 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2010 application.SendNotification();
2012 // START PROCESS/RENDER Input, Expected Input, Expected, KeepUpdating
2013 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false, __LINE__ ) );
2014 application.GetPlatform().ClearReadyResources();
2016 // MAKE SOURCE ACTOR VISIBLE - expect continuous renders to start, no finished signal
2017 secondRootActor.SetProperty( Actor::Property::VISIBLE,true);
2018 application.SendNotification();
2020 // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
2021 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2025 int UtcDaliRenderTaskContinuous03(void)
2027 TestApplication application;
2029 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (camera actor not staged)\nPOST:continuous renders, no Finished signal");
2031 // SETUP AN OFFSCREEN RENDER TASK
2032 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2033 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2034 drawTrace.Enable(true);
2036 Actor rootActor = Actor::New();
2037 Stage::GetCurrent().Add( rootActor );
2039 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2040 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2041 Stage::GetCurrent().Add(secondRootActor);
2043 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
2044 bool finished = false;
2045 RenderTaskFinished renderTaskFinished( finished );
2046 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2047 application.SendNotification();
2049 // START PROCESS/RENDER Input, Expected Input, Expected
2050 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false, __LINE__ ) );
2051 application.GetPlatform().ClearReadyResources();
2053 // ADD CAMERA ACTOR TO STAGE - expect continuous renders to start, no finished signal
2054 Stage::GetCurrent().Add( offscreenCameraActor );
2055 application.SendNotification();
2057 // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
2058 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2063 int UtcDaliRenderTaskContinuous04(void)
2065 TestApplication application;
2067 tet_infoline("Testing RenderTask Render Continuous using loaded image");
2069 // SETUP AN OFFSCREEN RENDER TASK
2070 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2071 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2072 drawTrace.Enable(true);
2074 Actor rootActor = Actor::New();
2075 Stage::GetCurrent().Add( rootActor );
2077 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2078 Stage::GetCurrent().Add( offscreenCameraActor );
2079 Actor secondRootActor = CreateRenderableActorFailed(application, "aFile.jpg");
2080 Stage::GetCurrent().Add(secondRootActor);
2082 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
2083 bool finished = false;
2084 RenderTaskFinished renderTaskFinished( finished );
2085 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2086 application.SendNotification();
2088 // START PROCESS/RENDER Input, Expected Input, Expected
2089 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2093 int UtcDaliRenderTaskOnce01(void)
2095 TestApplication application;
2097 tet_infoline("Testing RenderTask Render Once GlSync, using loaded image");
2099 // SETUP AN OFFSCREEN RENDER TASK
2100 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2101 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2102 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2103 drawTrace.Enable(true);
2105 Actor rootActor = Actor::New();
2106 Stage::GetCurrent().Add( rootActor );
2108 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2109 Stage::GetCurrent().Add( offscreenCameraActor );
2110 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2112 Stage::GetCurrent().Add(secondRootActor);
2114 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, true);
2115 bool finished = false;
2116 RenderTaskFinished renderTaskFinished( finished );
2117 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2118 application.SendNotification();
2120 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2122 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2123 DALI_TEST_CHECK( lastSyncObj != NULL );
2124 sync.SetObjectSynced( lastSyncObj, true );
2126 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true, __LINE__ ) );
2127 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2131 int UtcDaliRenderTaskOnce02(void)
2133 TestApplication application;
2135 tet_infoline("Testing RenderTask Render Once GlSync, using Mesh which accesses texture through sampler with loaded image.\n");
2137 // SETUP AN OFFSCREEN RENDER TASK
2138 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2139 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2140 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2141 drawTrace.Enable(true);
2143 Actor rootActor = Actor::New();
2144 Stage::GetCurrent().Add( rootActor );
2146 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2147 Stage::GetCurrent().Add( offscreenCameraActor );
2149 Shader shader = CreateShader();
2150 Image image = CreateResourceImage(application, "aFile.jpg");
2151 TextureSet textureSet = CreateTextureSet( image );
2153 Geometry geometry = CreateQuadGeometry();
2154 Renderer renderer = Renderer::New(geometry, shader);
2155 renderer.SetTextures( textureSet );
2156 Actor secondRootActor = Actor::New();
2157 secondRootActor.AddRenderer(renderer);
2158 secondRootActor.SetSize(100, 100);
2159 Stage::GetCurrent().Add(secondRootActor);
2161 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, true);
2162 bool finished = false;
2163 RenderTaskFinished renderTaskFinished( finished );
2164 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2165 application.SendNotification();
2167 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2169 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2170 DALI_TEST_CHECK( lastSyncObj != NULL );
2171 sync.SetObjectSynced( lastSyncObj, true );
2173 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true, __LINE__ ) );
2174 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2179 int UtcDaliRenderTaskOnce03(void)
2181 TestApplication application;
2183 tet_infoline("Testing RenderTask Render Once GlSync, using loaded image. Switch from render always after ready to render once\n");
2185 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2186 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2187 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2188 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2189 drawTrace.Enable(true);
2191 Actor rootActor = Actor::New();
2192 Stage::GetCurrent().Add( rootActor );
2194 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2195 Stage::GetCurrent().Add( offscreenCameraActor );
2196 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2197 Stage::GetCurrent().Add(secondRootActor);
2199 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
2200 bool finished = false;
2201 RenderTaskFinished renderTaskFinished( finished );
2202 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2203 application.SendNotification();
2205 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2207 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2208 application.SendNotification();
2210 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2212 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2213 DALI_TEST_CHECK( lastSyncObj != NULL );
2214 sync.SetObjectSynced( lastSyncObj, true );
2216 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true, __LINE__ ) );
2217 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2223 int UtcDaliRenderTaskOnce04(void)
2225 TestApplication application;
2226 tet_infoline("Testing RenderTask Render Once GlSync, using Mesh which accesses texture through sampler with loaded image.\n"
2227 "Switch from render always after ready to render once\n"
2230 // SETUP AN OFFSCREEN RENDER TASK
2231 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2232 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2233 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2234 drawTrace.Enable(true);
2236 Actor rootActor = Actor::New();
2237 Stage::GetCurrent().Add( rootActor );
2239 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2240 Stage::GetCurrent().Add( offscreenCameraActor );
2242 Shader shader = CreateShader();
2243 Image image = CreateResourceImage(application, "aFile.jpg");
2244 TextureSet textureSet = CreateTextureSet( image );
2246 Geometry geometry = CreateQuadGeometry();
2247 Renderer renderer = Renderer::New(geometry, shader);
2248 renderer.SetTextures( textureSet );
2249 Actor secondRootActor = Actor::New();
2250 secondRootActor.AddRenderer(renderer);
2251 secondRootActor.SetSize(100, 100);
2252 Stage::GetCurrent().Add(secondRootActor);
2254 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
2255 bool finished = false;
2256 RenderTaskFinished renderTaskFinished( finished );
2257 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2258 application.SendNotification();
2260 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2262 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2263 application.SendNotification();
2265 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2267 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2268 DALI_TEST_CHECK( lastSyncObj != NULL );
2269 sync.SetObjectSynced( lastSyncObj, true );
2271 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true, __LINE__ ) );
2272 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2277 int UtcDaliRenderTaskOnceNoSync01(void)
2279 TestApplication application;
2281 tet_infoline("Testing RenderTask Render Once, \nPRE: Resources ready\nPOST: Finished signal sent once only");
2283 // SETUP AN OFFSCREEN RENDER TASK
2284 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2285 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2286 drawTrace.Enable(true);
2288 Actor rootActor = Actor::New();
2289 Stage::GetCurrent().Add( rootActor );
2291 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2292 Stage::GetCurrent().Add( offscreenCameraActor );
2293 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2294 Stage::GetCurrent().Add(secondRootActor);
2296 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, false);
2297 bool finished = false;
2298 RenderTaskFinished renderTaskFinished( finished );
2299 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2300 application.SendNotification();
2302 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2303 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2307 int UtcDaliRenderTaskOnceNoSync02(void)
2309 TestApplication application;
2311 tet_infoline("Testing RenderTask Render Once, using Mesh which accesses texture through sampler with loaded image.\n"
2312 "PRE: Resources ready\nPOST: Finished signal sent once only");
2313 // SETUP AN OFFSCREEN RENDER TASK
2314 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2315 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2316 drawTrace.Enable(true);
2318 Actor rootActor = Actor::New();
2319 Stage::GetCurrent().Add( rootActor );
2321 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2322 Stage::GetCurrent().Add( offscreenCameraActor );
2324 Shader shader = CreateShader();
2325 Image image = CreateResourceImage(application, "aFile.jpg");
2326 TextureSet textureSet = CreateTextureSet( image );
2328 Geometry geometry = CreateQuadGeometry();
2329 Renderer renderer = Renderer::New(geometry, shader);
2330 renderer.SetTextures( textureSet );
2331 Actor secondRootActor = Actor::New();
2332 secondRootActor.AddRenderer(renderer);
2333 secondRootActor.SetSize(100, 100);
2334 Stage::GetCurrent().Add(secondRootActor);
2336 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, false);
2337 bool finished = false;
2338 RenderTaskFinished renderTaskFinished( finished );
2339 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2340 application.SendNotification();
2342 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2343 application.GetPlatform().ClearReadyResources();
2344 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2349 int UtcDaliRenderTaskOnceNoSync03(void)
2351 TestApplication application;
2353 tet_infoline("Testing RenderTask Render Once, using loaded image. Switch from render always after ready to render once\n"
2354 "PRE: Render task ready, Image loaded\n"
2355 "POST: Finished signal sent only once");
2357 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2358 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2359 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2360 drawTrace.Enable(true);
2362 Actor rootActor = Actor::New();
2363 Stage::GetCurrent().Add( rootActor );
2365 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2366 Stage::GetCurrent().Add( offscreenCameraActor );
2367 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2368 Stage::GetCurrent().Add(secondRootActor);
2370 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2371 bool finished = false;
2372 RenderTaskFinished renderTaskFinished( finished );
2373 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2374 application.SendNotification();
2376 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2378 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2379 application.SendNotification(); // Input, Expected Input, Expected
2380 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2381 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2385 int UtcDaliRenderTaskOnceNoSync04(void)
2387 TestApplication application;
2389 tet_infoline("Testing RenderTask Render Once, using Mesh which accesses texture through sampler with loading image.\n"
2390 "Switch from render always after ready to render once\n"
2391 "PRE: Render task ready, Image not loaded\n"
2392 "POST: Finished signal sent only once");
2394 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2395 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2396 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2397 drawTrace.Enable(true);
2399 Actor rootActor = Actor::New();
2400 Stage::GetCurrent().Add( rootActor );
2402 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2403 Stage::GetCurrent().Add( offscreenCameraActor );
2405 Shader shader = CreateShader();
2406 Image image = CreateResourceImage(application, "aFile.jpg");
2407 TextureSet textureSet = CreateTextureSet( image );
2409 Geometry geometry = CreateQuadGeometry();
2410 Renderer renderer = Renderer::New(geometry, shader);
2411 renderer.SetTextures( textureSet );
2412 Actor secondRootActor = Actor::New();
2413 secondRootActor.AddRenderer(renderer);
2414 secondRootActor.SetSize(100, 100);
2415 Stage::GetCurrent().Add(secondRootActor);
2418 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2419 bool finished = false;
2420 RenderTaskFinished renderTaskFinished( finished );
2421 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2422 application.SendNotification();
2424 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2425 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2426 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2427 DALI_TEST_CHECK( lastSyncObj == NULL );
2429 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2430 application.SendNotification(); // Input, Expected Input, Expected
2431 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2432 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2434 lastSyncObj = sync.GetLastSyncObject();
2435 DALI_TEST_CHECK( lastSyncObj == NULL );
2440 int UtcDaliRenderTaskOnceNoSync05(void)
2442 TestApplication application;
2444 tet_infoline("Testing RenderTask Render Once\n"
2445 "SetRefreshRate(ONCE), resource load failed, completes render task.\n"
2446 "PRE: resources failed to load\n"
2447 "POST: No finished signal sent.");
2449 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2450 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2451 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2452 drawTrace.Enable(true);
2454 Actor rootActor = Actor::New();
2455 Stage::GetCurrent().Add( rootActor );
2457 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2458 Stage::GetCurrent().Add( offscreenCameraActor );
2459 Actor secondRootActor = CreateRenderableActorFailed(application, "aFile.jpg");
2460 Stage::GetCurrent().Add(secondRootActor);
2462 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2463 bool finished = false;
2464 RenderTaskFinished renderTaskFinished( finished );
2465 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2466 application.SendNotification();
2468 // START PROCESS/RENDER Input, Expected Input, Expected
2469 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2471 // CHANGE TO RENDER ONCE,
2472 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2473 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2480 int UtcDaliRenderTaskOnceChain01(void)
2482 TestApplication application;
2484 tet_infoline("Testing RenderTask Render Once Chained render tasks\n"
2485 "SetRefreshRate(ONCE), resource load completes, both render tasks render.\n"
2486 "PRE: resources ready\n"
2487 "POST: 2 finished signals sent.");
2489 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2490 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2491 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2492 drawTrace.Enable(true);
2494 Actor defaultRootActor = Actor::New(); // Root for default RT
2495 Stage::GetCurrent().Add( defaultRootActor );
2497 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2498 Stage::GetCurrent().Add( offscreenCameraActor );
2499 Actor firstRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2500 Stage::GetCurrent().Add(firstRootActor);
2502 // first render task
2503 RenderTask firstTask = CreateRenderTask(application, offscreenCameraActor, defaultRootActor, firstRootActor, RenderTask::REFRESH_ONCE, false);
2504 bool firstFinished = false;
2505 RenderTaskFinished renderTask1Finished( firstFinished );
2506 firstTask.FinishedSignal().Connect( &application, renderTask1Finished );
2508 // Second render task
2509 FrameBufferImage fbo = firstTask.GetTargetFrameBuffer();
2510 Actor secondRootActor = CreateRenderableActor( fbo );
2511 Stage::GetCurrent().Add(secondRootActor);
2512 RenderTask secondTask = CreateRenderTask(application, offscreenCameraActor, defaultRootActor, secondRootActor, RenderTask::REFRESH_ONCE, false);
2513 bool secondFinished = false;
2514 RenderTaskFinished renderTask2Finished( secondFinished );
2515 secondTask.FinishedSignal().Connect( &application, renderTask2Finished );
2517 application.SendNotification();
2519 //Both render tasks are executed.
2520 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false, true, __LINE__ ) );
2521 DALI_TEST_CHECK( firstFinished == false );
2522 DALI_TEST_CHECK( secondFinished == false );
2524 //Nothing else to render and both render task should have finished now
2525 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, firstFinished, true, false, __LINE__ ) );
2526 DALI_TEST_CHECK( firstFinished == true );
2527 DALI_TEST_CHECK( secondFinished == true );
2532 int UtcDaliRenderTaskProperties(void)
2534 TestApplication application;
2536 RenderTask task = Stage::GetCurrent().GetRenderTaskList().CreateTask();
2538 Property::IndexContainer indices;
2539 task.GetPropertyIndices( indices );
2540 DALI_TEST_CHECK( indices.Size() );
2541 DALI_TEST_EQUALS( indices.Size(), task.GetPropertyCount(), TEST_LOCATION );
2545 int UtcDaliRenderTaskFinishInvisibleSourceActor(void)
2547 TestApplication application;
2549 tet_infoline("Testing RenderTask::FinishInvisibleSourceActor()");
2551 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2552 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2554 CameraActor offscreenCameraActor = CameraActor::New();
2556 Stage::GetCurrent().Add( offscreenCameraActor );
2558 BufferImage image = BufferImage::New( 10, 10 );
2559 Actor rootActor = CreateRenderableActor( image );
2560 rootActor.SetSize( 10, 10 );
2561 rootActor.SetProperty( Actor::Property::VISIBLE,false);
2562 Stage::GetCurrent().Add( rootActor );
2564 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
2565 NativeImageInterfacePtr testNativeImagePtr = TestNativeImage::New(10, 10);
2566 FrameBufferImage frameBufferImage = FrameBufferImage::New( *testNativeImagePtr.Get() );
2568 // Flush all outstanding messages
2569 application.SendNotification();
2570 application.Render();
2572 RenderTask newTask = taskList.CreateTask();
2573 newTask.SetCameraActor( offscreenCameraActor );
2574 newTask.SetSourceActor( rootActor );
2575 newTask.SetInputEnabled( false );
2576 newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
2577 newTask.SetClearEnabled( true );
2578 newTask.SetExclusive( true );
2579 newTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
2580 newTask.SetTargetFrameBuffer( frameBufferImage );
2581 newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, true );
2583 // Framebuffer doesn't actually get created until Connected, i.e. by previous line
2585 bool finished = false;
2586 RenderTaskFinished renderTaskFinished( finished );
2587 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2589 // Flush the queue and render.
2590 application.SendNotification();
2592 // 1 render to process render task, then wait for sync before finished msg is sent
2593 // from update to the event thread.
2595 application.Render();
2596 application.SendNotification();
2597 DALI_TEST_CHECK( !finished );
2599 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2600 DALI_TEST_CHECK( lastSyncObj != NULL );
2602 application.Render();
2603 DALI_TEST_EQUALS( (Integration::KeepUpdating::Reasons)(application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
2604 application.SendNotification();
2605 DALI_TEST_CHECK( !finished );
2607 application.Render();
2608 DALI_TEST_EQUALS( (Integration::KeepUpdating::Reasons)(application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
2609 application.SendNotification();
2610 DALI_TEST_CHECK( ! finished );
2612 sync.SetObjectSynced( lastSyncObj, true );
2614 application.Render();
2615 application.SendNotification();
2616 DALI_TEST_CHECK( !finished );
2618 application.Render();
2619 application.SendNotification();
2620 DALI_TEST_CHECK( finished );
2623 application.Render(); // Double check no more finished signal
2624 application.SendNotification();
2625 DALI_TEST_CHECK( ! finished );
2630 int UtcDaliRenderTaskFinishMissingImage(void)
2632 TestApplication application;
2634 // Previously we had bugs where not having a resource ID would cause render-tasks to wait forever
2635 tet_infoline("Testing RenderTask::SignalFinished() when an Actor has no Image set");
2637 Stage stage = Stage::GetCurrent();
2639 BufferImage image = BufferImage::New( 10, 10 );
2640 Actor rootActor = CreateRenderableActor( image );
2641 rootActor.SetSize( 10, 10 );
2642 stage.Add( rootActor );
2644 Actor actorWithMissingImage = CreateRenderableActor( Image() );
2645 actorWithMissingImage.SetSize( 10, 10 );
2646 stage.Add( actorWithMissingImage );
2648 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
2649 RenderTask newTask = taskList.CreateTask();
2650 newTask.SetInputEnabled( false );
2651 newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
2652 newTask.SetClearEnabled( true );
2653 newTask.SetExclusive( true );
2654 newTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
2656 bool finished = false;
2657 RenderTaskFinished renderTaskFinished( finished );
2658 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2660 // 1 render to process render task, then 1 before finished msg is sent from update to the event thread.
2661 application.SendNotification();
2662 application.Render();
2663 application.Render();
2665 application.SendNotification();
2666 DALI_TEST_CHECK( finished );
2671 int UtcDaliRenderTaskWorldToViewport(void)
2673 TestApplication application( 400u, 400u ); // square surface
2675 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
2677 Actor actor = Actor::New();
2678 actor.SetSize(100.0f, 100.0f);
2679 actor.SetPosition( Vector3(0.0, 0.0, 0.0) );
2681 actor.SetProperty( Actor::Property::PARENT_ORIGIN, Vector3(0.5, 0.5, 0.5) );
2682 actor.SetProperty( Actor::Property::ANCHOR_POINT, Vector3(0.5, 0.5, 0.5) );
2684 Stage::GetCurrent().Add(actor);
2686 application.SendNotification();
2687 application.Render();
2688 application.SendNotification();
2690 RenderTask task = taskList.GetTask( 0u );
2692 CameraActor camera = task.GetCameraActor();
2694 Vector2 screenSize = task.GetCurrentViewportSize();
2696 float screenX = 0.0;
2697 float screenY = 0.0;
2699 bool ok = task.WorldToViewport(actor.GetCurrentProperty< Vector3 >( Actor::Property::WORLD_POSITION ), screenX, screenY);
2700 DALI_TEST_CHECK(ok == true);
2702 DALI_TEST_EQUALS(screenX, screenSize.x/2, Math::MACHINE_EPSILON_10000, TEST_LOCATION);
2703 DALI_TEST_EQUALS(screenY, screenSize.y/2, Math::MACHINE_EPSILON_10000, TEST_LOCATION);
2705 Actor actor2 = Actor::New();
2706 float actor2Size = 100.f;
2707 actor2.SetSize( actor2Size, actor2Size );
2708 actor2.SetPosition( Vector3(0.0, 0.0, 0.0) );
2709 actor2.SetProperty( Actor::Property::PARENT_ORIGIN, Vector3(0.5, 0.5, 0.0) );
2710 actor2.SetProperty( Actor::Property::ANCHOR_POINT, Vector3(0.5, 0.5, 0.0) );
2711 Stage::GetCurrent().Add( actor2 );
2713 actor.SetProperty( Actor::Property::PARENT_ORIGIN, Vector3(0,0,0) );
2715 application.SendNotification();
2716 application.Render();
2717 application.SendNotification();
2719 ok = task.WorldToViewport(actor.GetCurrentProperty< Vector3 >( Actor::Property::WORLD_POSITION ), screenX, screenY);
2720 DALI_TEST_CHECK(ok == true);
2722 DALI_TEST_EQUALS(screenX, screenSize.x/2 - actor2Size/2, Math::MACHINE_EPSILON_10000, TEST_LOCATION);
2723 DALI_TEST_EQUALS(screenY, screenSize.y/2 - actor2Size/2, Math::MACHINE_EPSILON_10000, TEST_LOCATION);
2729 int UtcDaliRenderTaskViewportToLocal(void)
2731 TestApplication application;
2732 Actor actor = Actor::New();
2733 actor.SetProperty( Actor::Property::ANCHOR_POINT,AnchorPoint::TOP_LEFT);
2734 actor.SetSize(100.0f, 100.0f);
2735 actor.SetPosition(10.0f, 10.0f);
2736 Stage::GetCurrent().Add(actor);
2738 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
2739 RenderTask task = taskList.GetTask( 0u );
2741 // flush the queue and render once
2742 application.SendNotification();
2743 application.Render();
2744 application.SendNotification();
2745 application.Render();
2753 float screenX = 50.0f;
2754 float screenY = 50.0f;
2756 DALI_TEST_CHECK( actor.ScreenToLocal(localX, localY, screenX, screenY) );
2758 DALI_TEST_CHECK( task.ViewportToLocal(actor, screenX, screenY, rtLocalX, rtLocalY ) );
2760 DALI_TEST_EQUALS(localX, rtLocalX, 0.01f, TEST_LOCATION);
2761 DALI_TEST_EQUALS(localY, rtLocalY, 0.01f, TEST_LOCATION);
2767 int UtcDaliRenderTaskOffscreenViewportToLocal(void)
2769 TestApplication application;
2770 Actor actor = Actor::New();
2771 actor.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT );
2772 actor.SetSize( 100.0f, 100.0f );
2773 actor.SetPosition( 10.0f, 10.0f );
2774 Stage::GetCurrent().Add( actor );
2776 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
2777 RenderTask task = taskList.CreateTask();
2779 FrameBufferImage newFrameBuffer = FrameBufferImage::New( 10, 10 );
2780 task.SetTargetFrameBuffer( newFrameBuffer );
2781 task.SetSourceActor( actor );
2782 task.SetScreenToFrameBufferMappingActor( actor );
2784 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2785 Stage::GetCurrent().Add( offscreenCameraActor );
2786 task.SetCameraActor( offscreenCameraActor );
2788 // flush the queue and render once
2789 application.SendNotification();
2790 application.Render();
2791 application.SendNotification();
2792 application.Render();
2800 float screenX = 50.0f;
2801 float screenY = 50.0f;
2803 DALI_TEST_CHECK( actor.ScreenToLocal(localX, localY, screenX, screenY) );
2805 DALI_TEST_CHECK( task.ViewportToLocal(actor, screenX, screenY, rtLocalX, rtLocalY ) );
2807 DALI_TEST_EQUALS(localX, rtLocalX, 0.01f, TEST_LOCATION);
2808 DALI_TEST_EQUALS(localY, rtLocalY, 0.01f, TEST_LOCATION);
2813 int UtcDaliRenderTaskRequiresSync(void)
2815 TestApplication application;
2816 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
2818 RenderTask newTask = taskList.CreateTask();
2819 newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, false );
2821 DALI_TEST_EQUALS( newTask.GetProperty< bool >( RenderTask::Property::REQUIRES_SYNC ), false, TEST_LOCATION );
2822 DALI_TEST_EQUALS( newTask.GetCurrentProperty< bool >( RenderTask::Property::REQUIRES_SYNC ), false, TEST_LOCATION );
2824 newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, true );
2826 DALI_TEST_EQUALS( newTask.GetProperty< bool >( RenderTask::Property::REQUIRES_SYNC ), true, TEST_LOCATION );
2827 DALI_TEST_EQUALS( newTask.GetCurrentProperty< bool >( RenderTask::Property::REQUIRES_SYNC ), true, TEST_LOCATION );
2832 int UtcDaliRenderTaskSetClearEnabled(void)
2834 TestApplication application;
2836 tet_infoline("UtcDaliRenderTaskSetClearEnabled");
2838 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2839 TestGlAbstraction& gl = application.GetGlAbstraction();
2841 Actor renderableActor = CreateRenderableActorSuccess( application, "aFile.jpg" );
2842 Stage::GetCurrent().Add( renderableActor );
2844 Actor rootActor = Actor::New();
2845 Stage::GetCurrent().Add( rootActor );
2847 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2848 Stage::GetCurrent().Add( offscreenCameraActor );
2850 Actor sourceActor = CreateRenderableActorSuccess( application, "aFile.jpg" );
2851 Stage::GetCurrent().Add( sourceActor );
2853 RenderTask newTask = CreateRenderTask( application, offscreenCameraActor, rootActor, sourceActor, RenderTask::REFRESH_ALWAYS, false );
2855 DALI_TEST_EQUALS( gl.GetClearCountCalled(), 0, TEST_LOCATION );
2857 application.SendNotification();
2858 application.Render();
2860 // glClear should be called twice - default task and the new task.
2861 DALI_TEST_EQUALS( gl.GetClearCountCalled(), 2, TEST_LOCATION );
2863 newTask.SetClearEnabled( false );
2865 application.SendNotification();
2866 application.Render();
2868 // The count should increase by 1 - default task only.
2869 DALI_TEST_EQUALS( gl.GetClearCountCalled(), 3, TEST_LOCATION );