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.SetProperty( Actor::Property::SIZE, Vector2( 80.0f, 80.0f ) );
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.SetProperty( Actor::Property::SIZE, Vector2( 80.0f, 80.0f ) );
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 Texture img = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
365 Actor newActor = CreateRenderableActor( img );
366 newActor.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
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 Texture img = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
411 Actor newActor = CreateRenderableActor( img );
412 newActor.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
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 Texture img = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
470 Actor newActor = CreateRenderableActor( img );
471 newActor.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
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 Texture img = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
519 Actor newActor = CreateRenderableActor( img );
520 newActor.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
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 Texture img = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
570 Actor newActor = CreateRenderableActor( img );
571 newActor.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
572 stage.Add( newActor );
574 task.SetSourceActor( newActor );
576 DALI_TEST_CHECK( task.GetSourceActor() != actor );
577 DALI_TEST_CHECK( task.GetSourceActor() == newActor );
579 application.SendNotification();
580 application.Render();
582 // Destroy the source actor
583 stage.Remove( newActor );
586 DALI_TEST_CHECK( !task.GetSourceActor() ); // The source actor should be an empty handle.
591 int UtcDaliRenderTaskGetSourceActorP01(void)
593 TestApplication application;
595 tet_infoline("Testing RenderTask::GetSourceActor() Check the default render task has a valid source actor");
597 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
599 RenderTask task = taskList.GetTask( 0u );
601 Actor actor = task.GetSourceActor();
602 DALI_TEST_CHECK( actor );
604 // By default the entire scene should be rendered
605 Actor root = Stage::GetCurrent().GetLayer( 0 );
606 DALI_TEST_CHECK( root == actor );
610 int UtcDaliRenderTaskGetSourceActorP02(void)
612 TestApplication application;
614 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.");
616 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
617 RenderTask task = taskList.CreateTask();
618 Actor actor = Actor::New();
619 Stage::GetCurrent().Add(actor);
620 task.SetSourceActor( actor );
622 DALI_TEST_EQUALS( actor, task.GetSourceActor(), TEST_LOCATION );
627 int UtcDaliRenderTaskGetSourceActorN(void)
629 TestApplication application;
631 tet_infoline("Testing RenderTask::GetSourceActor() Try with empty handle");
636 Actor actor = task.GetSourceActor();
638 catch (Dali::DaliException& e)
640 DALI_TEST_PRINT_ASSERT( e );
641 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
647 int UtcDaliRenderTaskSetExclusive(void)
649 TestApplication application;
651 tet_infoline("Testing RenderTask::SetExclusive() Check that exclusion works");
653 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
655 // Manipulate the GenTextures behaviour, to identify different actors
657 std::vector<GLuint> ids;
658 ids.push_back( 8 ); // 8 = actor1
659 ids.push_back( 9 ); // 9 = actor2
660 ids.push_back( 10 ); // 10 = actor3
661 application.GetGlAbstraction().SetNextTextureIds( ids );
663 Texture img1 = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
664 Actor actor1 = CreateRenderableActor( img1 );
665 actor1.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
666 Stage::GetCurrent().Add( actor1 );
668 // Update & Render actor1
669 application.SendNotification();
670 application.Render();
672 // Check that the actor1 was rendered
673 const std::vector<GLuint>& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 );
674 DALI_TEST_GREATER( boundTextures.size(), static_cast<std::vector<GLuint>::size_type>( 0 ), TEST_LOCATION );
676 if ( boundTextures.size() )
679 DALI_TEST_EQUALS( boundTextures[c++], 8u/*unique to actor1*/, TEST_LOCATION );
680 if( boundTextures.size() > 1 )
682 DALI_TEST_EQUALS( boundTextures[c++], 8u/*unique to actor1*/, TEST_LOCATION );
686 Texture img2 = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
688 Actor actor2 = CreateRenderableActor( img2 );
689 actor2.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
691 // Force actor2 to be rendered before actor1
692 Layer layer = Layer::New();
693 Stage::GetCurrent().Add( layer );
695 layer.LowerToBottom();
698 application.GetGlAbstraction().ClearBoundTextures();
699 application.SendNotification();
700 application.Render();
702 // Check that the actors were rendered
703 DALI_TEST_GREATER( boundTextures.size(), static_cast<std::vector<GLuint>::size_type>( 1 ), TEST_LOCATION );
705 if ( boundTextures.size() )
708 DALI_TEST_EQUALS( boundTextures[c++], 9u/*unique to actor2*/, TEST_LOCATION );
709 if( boundTextures.size() > 2 )
711 DALI_TEST_EQUALS( boundTextures[c++], 9u/*unique to actor1*/, TEST_LOCATION );
713 DALI_TEST_EQUALS( boundTextures[c++], 8u/*unique to actor1*/, TEST_LOCATION );
716 Texture img3 = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
717 Actor actor3 = CreateRenderableActor( img3 );
718 actor3.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
720 // Force actor3 to be rendered before actor2
721 layer = Layer::New();
722 Stage::GetCurrent().Add( layer );
724 layer.LowerToBottom();
726 // Update & Render all actors
727 application.GetGlAbstraction().ClearBoundTextures();
728 application.SendNotification();
729 application.Render();
731 // Check that the actors were rendered
732 DALI_TEST_GREATER( boundTextures.size(), static_cast<std::vector<GLuint>::size_type>( 2 ), TEST_LOCATION );
734 if ( boundTextures.size() )
737 DALI_TEST_EQUALS( boundTextures[c++], 10u/*unique to actor3*/, TEST_LOCATION );
738 if( boundTextures.size() > 3 )
740 DALI_TEST_EQUALS( boundTextures[c++], 10u/*unique to actor2*/, TEST_LOCATION );
742 DALI_TEST_EQUALS( boundTextures[c++], 9u/*unique to actor2*/, TEST_LOCATION );
743 DALI_TEST_EQUALS( boundTextures[c++], 8u/*unique to actor1*/, TEST_LOCATION );
746 // Both actors are now connected to the root node
747 // Setup 2 render-tasks - the first will render from the root-node, and the second from actor2
749 // Not exclusive is the default
750 RenderTask task1 = taskList.GetTask( 0u );
751 DALI_TEST_CHECK( false == task1.IsExclusive() );
753 RenderTask task2 = taskList.CreateTask();
754 DALI_TEST_CHECK( false == task2.IsExclusive() );
755 task2.SetSourceActor( actor2 );
757 // Task1 should render all actors, and task 2 should render only actor2
759 application.GetGlAbstraction().ClearBoundTextures();
760 application.SendNotification();
761 application.Render();
763 DALI_TEST_EQUALS( boundTextures.size(), 4u, TEST_LOCATION );
765 if ( boundTextures.size() == 4 )
767 // Test that task 1 renders actor3, then actor2 & then actor1
768 DALI_TEST_CHECK( boundTextures[0] == 10u );
769 DALI_TEST_CHECK( boundTextures[1] == 9u );
770 DALI_TEST_CHECK( boundTextures[2] == 8u );
772 // Test that task 2 renders actor2
773 DALI_TEST_EQUALS( boundTextures[3], 9u, TEST_LOCATION );
776 // Make actor2 exclusive to task2
778 task2.SetExclusive( true );
779 DALI_TEST_CHECK( true == task2.IsExclusive() );
781 // Task1 should render only actor1, and task 2 should render only actor2
783 application.GetGlAbstraction().ClearBoundTextures();
784 application.SendNotification();
785 application.Render();
787 DALI_TEST_EQUALS( boundTextures.size(), 3u, TEST_LOCATION );
788 if ( boundTextures.size() == 3 )
790 // Test that task 1 renders actor3 & actor1
791 DALI_TEST_CHECK( boundTextures[0] == 10u );
792 DALI_TEST_CHECK( boundTextures[1] == 8u );
794 // Test that task 2 renders actor2
795 DALI_TEST_CHECK( boundTextures[2] == 9u );
798 // Create a renderable actor and replace the source actor in task2
799 auto actor4 = CreateRenderableActor();
800 task2.SetSourceActor( actor3 );
801 DALI_TEST_EQUALS( actor3, task2.GetSourceActor(), TEST_LOCATION );
806 int UtcDaliRenderTaskSetExclusive02(void)
808 TestApplication application;
810 tet_infoline("Testing RenderTask::SetExclusive() Check that changing from exclusive to not-exclusive works");
812 std::vector<GLuint> ids;
813 ids.push_back( 8 ); // 8 = actor1
814 application.GetGlAbstraction().SetNextTextureIds( ids );
816 Texture img1 = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
817 Actor actor1 = CreateRenderableActor( img1 );
818 actor1.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
819 Stage::GetCurrent().Add( actor1 );
821 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
822 RenderTask task = taskList.CreateTask();
824 task.SetSourceActor( actor1 );
825 task.SetExclusive(true); // Actor should only render once
827 TestGlAbstraction& gl = application.GetGlAbstraction();
828 TraceCallStack& drawTrace = gl.GetDrawTrace();
829 drawTrace.Enable(true);
831 // Update & Render actor1
832 application.SendNotification();
833 application.Render();
835 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 1, TEST_LOCATION );
837 // Set task to non-exclusive - actor1 should render twice:
839 task.SetExclusive(false);
840 application.SendNotification();
841 application.Render();
843 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 2, TEST_LOCATION );
848 int UtcDaliRenderTaskSetExclusiveN(void)
850 TestApplication application;
852 tet_infoline("Testing RenderTask::SetExclusive() on empty handle");
857 task.SetExclusive(true);
859 catch (Dali::DaliException& e)
861 DALI_TEST_PRINT_ASSERT( e );
862 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
867 int UtcDaliRenderTaskIsExclusive01(void)
869 TestApplication application;
871 tet_infoline("Testing RenderTask::IsExclusive() Check default values are non-exclusive");
873 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
875 // Not exclusive is the default
876 RenderTask task = taskList.GetTask( 0u );
877 DALI_TEST_CHECK( false == task.IsExclusive() );
879 RenderTask newTask = taskList.CreateTask();
880 DALI_TEST_CHECK( false == newTask.IsExclusive() );
885 int UtcDaliRenderTaskIsExclusive02(void)
887 TestApplication application;
889 tet_infoline("Testing RenderTask::IsExclusive() Check the getter returns set values");
891 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
893 // Not exclusive is the default
894 RenderTask newTask = taskList.CreateTask();
895 DALI_TEST_EQUALS( newTask.IsExclusive(), false, TEST_LOCATION );
897 newTask.SetExclusive(true);
898 DALI_TEST_EQUALS( newTask.IsExclusive(), true, TEST_LOCATION );
902 int UtcDaliRenderTaskIsExclusiveN(void)
904 TestApplication application;
906 tet_infoline("Testing RenderTask::IsExclusive() on empty handle");
911 bool x = task.IsExclusive();
914 catch (Dali::DaliException& e)
916 DALI_TEST_PRINT_ASSERT( e );
917 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
922 int UtcDaliRenderTaskSetInputEnabled(void)
924 TestApplication application;
926 tet_infoline("Testing RenderTask::SetInputEnabled()");
928 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
930 // Input is enabled by default
931 RenderTask task = taskList.GetTask( 0u );
932 DALI_TEST_CHECK( true == task.GetInputEnabled() );
934 task.SetInputEnabled( false );
935 DALI_TEST_CHECK( false == task.GetInputEnabled() );
937 task.SetInputEnabled( true );
938 DALI_TEST_CHECK( true == task.GetInputEnabled() );
942 int UtcDaliRenderTaskGetInputEnabled(void)
944 TestApplication application;
946 tet_infoline("Testing RenderTask::GetInputEnabled()");
948 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
950 // Input is enabled by default
951 RenderTask task = taskList.GetTask( 0u );
952 DALI_TEST_EQUALS( true, task.GetInputEnabled(), TEST_LOCATION );
954 RenderTask newTask = taskList.CreateTask();
955 DALI_TEST_EQUALS( true, newTask.GetInputEnabled(), TEST_LOCATION );
957 newTask.SetInputEnabled(false);
958 DALI_TEST_EQUALS( false, newTask.GetInputEnabled(), TEST_LOCATION );
963 int UtcDaliRenderTaskSetCameraActorP(void)
965 TestApplication application;
967 tet_infoline("Testing RenderTask::SetCameraActor()");
969 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
971 RenderTask task = taskList.GetTask( 0u );
973 Actor defaultCameraActor = task.GetCameraActor();
974 DALI_TEST_CHECK( defaultCameraActor );
976 CameraActor newCameraActor = CameraActor::New();
977 DALI_TEST_CHECK( newCameraActor );
979 task.SetCameraActor( newCameraActor );
980 DALI_TEST_CHECK( task.GetCameraActor() != defaultCameraActor );
981 DALI_TEST_EQUALS( task.GetCameraActor(), newCameraActor, TEST_LOCATION );
986 int UtcDaliRenderTaskSetCameraActorN(void)
988 TestApplication application;
990 tet_infoline("Testing RenderTask::SetCameraActor() with empty actor handle");
992 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
994 RenderTask task = taskList.GetTask( 0u );
996 Actor actor = task.GetCameraActor();
997 DALI_TEST_CHECK( actor );
999 CameraActor cameraActor;
1001 task.SetCameraActor( cameraActor );
1002 DALI_TEST_EQUALS( (bool)task.GetCameraActor(), false, TEST_LOCATION );
1003 DALI_TEST_EQUALS( task.GetCameraActor(), cameraActor, TEST_LOCATION );
1007 int UtcDaliRenderTaskSetCameraActorDestroyed(void)
1009 TestApplication application;
1011 tet_infoline( "Testing RenderTask::SetCameraActor - Set a camera actor and destroy the camera actor" );
1013 Stage stage = Stage::GetCurrent();
1014 RenderTaskList taskList = stage.GetRenderTaskList();
1015 RenderTask task = taskList.GetTask( 0u );
1017 CameraActor newCameraActor = CameraActor::New();
1018 task.SetCameraActor( newCameraActor );
1020 DALI_TEST_EQUALS( task.GetCameraActor(), newCameraActor, TEST_LOCATION );
1022 // Destroy the camera actor
1023 newCameraActor.Reset();
1025 CameraActor camera = task.GetCameraActor();
1026 DALI_TEST_CHECK( !camera ); // The camera actor should be an empty handle.
1031 int UtcDaliRenderTaskGetCameraActorP(void)
1033 TestApplication application;
1035 tet_infoline("Testing RenderTask::GetCameraActor()");
1037 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1039 RenderTask task = taskList.GetTask( 0u );
1041 CameraActor actor = task.GetCameraActor();
1042 DALI_TEST_CHECK( actor );
1043 DALI_TEST_EQUALS( actor.GetProjectionMode(), Dali::Camera::PERSPECTIVE_PROJECTION, TEST_LOCATION );
1044 DALI_TEST_GREATER( actor.GetFieldOfView(), 0.0f, TEST_LOCATION );
1048 int UtcDaliRenderTaskGetCameraActorN(void)
1050 TestApplication application;
1052 tet_infoline("Testing RenderTask::GetCameraActor() with empty handle");
1057 Actor actor = task.GetCameraActor();
1059 catch (Dali::DaliException& e)
1061 DALI_TEST_PRINT_ASSERT( e );
1062 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1068 int UtcDaliRenderTaskSetTargetFrameBufferP(void)
1070 TestApplication application;
1072 tet_infoline("Testing RenderTask::SetTargetFrameBuffer()");
1074 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1076 RenderTask task = taskList.GetTask( 0u );
1078 FrameBufferImage newImage = FrameBufferImage::New();
1079 task.SetTargetFrameBuffer( newImage );
1080 DALI_TEST_CHECK( task.GetTargetFrameBuffer() == newImage );
1084 int UtcDaliRenderTaskSetTargetFrameBufferN(void)
1086 TestApplication application;
1088 tet_infoline("Testing RenderTask::SetTargetFrameBuffer()");
1090 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1092 RenderTask task = taskList.GetTask( 0u );
1093 FrameBufferImage newImage; // Empty handle
1094 task.SetTargetFrameBuffer( newImage );
1095 DALI_TEST_EQUALS( (bool)task.GetTargetFrameBuffer(), false, TEST_LOCATION );
1099 int UtcDaliRenderTaskGetTargetFrameBufferP(void)
1101 TestApplication application;
1103 tet_infoline("Testing RenderTask::GetTargetFrameBuffer()");
1105 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1107 RenderTask newTask = taskList.CreateTask();
1108 FrameBufferImage fb = FrameBufferImage::New(128, 128, Pixel::RGBA8888);
1109 newTask.SetTargetFrameBuffer( fb );
1110 DALI_TEST_EQUALS( newTask.GetTargetFrameBuffer(), fb, TEST_LOCATION );
1114 int UtcDaliRenderTaskGetTargetFrameBufferN(void)
1116 TestApplication application;
1118 tet_infoline("Testing RenderTask::GetTargetFrameBuffer()");
1120 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1122 RenderTask task = taskList.GetTask( 0u );
1124 // By default render-tasks do not render off-screen
1125 FrameBufferImage image = task.GetTargetFrameBuffer();
1126 DALI_TEST_CHECK( !image );
1131 int UtcDaliRenderTaskSetFrameBufferP(void)
1133 TestApplication application;
1135 tet_infoline("Testing RenderTask::SetFrameBuffer()");
1137 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1139 RenderTask task = taskList.GetTask( 0u );
1141 FrameBuffer newFrameBuffer = FrameBuffer::New( 128u, 128u, FrameBuffer::Attachment::NONE );
1142 task.SetFrameBuffer( newFrameBuffer );
1143 DALI_TEST_CHECK( task.GetFrameBuffer() == newFrameBuffer );
1147 int UtcDaliRenderTaskSetFrameBufferN(void)
1149 TestApplication application;
1151 tet_infoline("Testing RenderTask::SetFrameBuffer()");
1153 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1155 RenderTask task = taskList.GetTask( 0u );
1156 FrameBuffer newFrameBuffer; // Empty handle
1157 task.SetFrameBuffer( newFrameBuffer );
1158 DALI_TEST_EQUALS( (bool)task.GetFrameBuffer(), false, TEST_LOCATION );
1162 int UtcDaliRenderTaskGetFrameBufferP(void)
1164 TestApplication application;
1166 tet_infoline("Testing RenderTask::GetFrameBuffer()");
1168 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1170 RenderTask task = taskList.GetTask( 0u );
1172 FrameBuffer newFrameBuffer = FrameBuffer::New( 1u, 1u, FrameBuffer::Attachment::NONE );
1173 task.SetFrameBuffer( newFrameBuffer );
1174 DALI_TEST_CHECK( task.GetFrameBuffer() == newFrameBuffer );
1178 int UtcDaliRenderTaskGetFrameBufferN(void)
1180 TestApplication application;
1182 tet_infoline("Testing RenderTask::GetFrameBuffer()");
1184 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1186 RenderTask task = taskList.GetTask( 0u );
1188 // By default render-tasks do not render off-screen
1189 FrameBuffer frameBuffer = task.GetFrameBuffer();
1190 DALI_TEST_CHECK( !frameBuffer );
1195 int UtcDaliRenderTaskSetScreenToFrameBufferFunctionP(void)
1197 TestApplication application;
1199 tet_infoline("Testing RenderTask::SetScreenToFrameBufferFunction()");
1201 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1203 RenderTask task = taskList.GetTask( 0u );
1205 task.SetScreenToFrameBufferFunction( TestScreenToFrameBufferFunction );
1207 Vector2 coordinates( 5, 10 );
1208 Vector2 convertedCoordinates( 6, 12 ); // + Vector(1, 2)
1210 RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction();
1211 DALI_TEST_CHECK( func( coordinates ) );
1212 DALI_TEST_CHECK( coordinates == convertedCoordinates );
1214 task.SetScreenToFrameBufferFunction( RenderTask::FULLSCREEN_FRAMEBUFFER_FUNCTION );
1215 func = task.GetScreenToFrameBufferFunction();
1216 DALI_TEST_CHECK( func( coordinates ) );
1218 task.SetScreenToFrameBufferFunction( RenderTask::DEFAULT_SCREEN_TO_FRAMEBUFFER_FUNCTION );
1219 func = task.GetScreenToFrameBufferFunction();
1220 DALI_TEST_CHECK( ! func( coordinates ) );
1224 int UtcDaliRenderTaskSetScreenToFrameBufferFunctionN(void)
1226 TestApplication application;
1228 tet_infoline("Testing RenderTask::SetScreenToFrameBufferFunction()");
1230 RenderTask task; // Empty handle
1233 task.SetScreenToFrameBufferFunction( TestScreenToFrameBufferFunction );
1235 catch (Dali::DaliException& e)
1237 DALI_TEST_PRINT_ASSERT( e );
1238 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1243 int UtcDaliRenderTaskGetScreenToFrameBufferFunctionP(void)
1245 TestApplication application;
1247 tet_infoline("Testing RenderTask::GetScreenToFrameBufferFunction()");
1249 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1251 RenderTask task = taskList.GetTask( 0u );
1253 Vector2 originalCoordinates( 5, 10 );
1254 Vector2 coordinates( 5, 10 );
1256 RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction();
1257 DALI_TEST_CHECK( !func( coordinates ) ); // conversion should fail by default
1258 DALI_TEST_CHECK( coordinates == originalCoordinates ); // coordinates should not be modified
1262 int UtcDaliRenderTaskGetScreenToFrameBufferFunctionN(void)
1264 TestApplication application;
1266 tet_infoline("Testing RenderTask::GetScreenToFrameBufferFunction() on empty handle");
1271 RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction();
1274 catch (Dali::DaliException& e)
1276 DALI_TEST_PRINT_ASSERT( e );
1277 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1283 int UtcDaliRenderTaskGetScreenToFrameBufferMappingActorP(void)
1285 TestApplication application;
1286 tet_infoline("Testing RenderTask::GetScreenToFrameBufferMappingActor ");
1288 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1289 RenderTask renderTask = taskList.CreateTask();
1290 Actor mappingActor = Actor::New();
1291 renderTask.SetScreenToFrameBufferMappingActor(mappingActor);
1293 DALI_TEST_EQUALS( mappingActor, renderTask.GetScreenToFrameBufferMappingActor(), TEST_LOCATION );
1298 int UtcDaliRenderTaskGetScreenToFrameBufferMappingActorN(void)
1300 TestApplication application;
1301 tet_infoline("Testing RenderTask::GetScreenToFrameBufferMappingActor with empty task handle");
1307 task.SetScreenToFrameBufferMappingActor(mappingActor);
1309 catch (Dali::DaliException& e)
1311 DALI_TEST_PRINT_ASSERT( e );
1312 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1317 int UtcDaliRenderTaskGetScreenToFrameBufferMappingActor02N(void)
1319 TestApplication application;
1320 tet_infoline("Testing RenderTask::GetScreenToFrameBufferMappingActor with empty task handle");
1322 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1323 RenderTask renderTask = taskList.CreateTask();
1325 renderTask.SetScreenToFrameBufferMappingActor(actor);
1327 DALI_TEST_EQUALS( (bool)renderTask.GetScreenToFrameBufferMappingActor(), false, TEST_LOCATION);
1331 int UtcDaliRenderTaskGetViewportP01(void)
1333 TestApplication application;
1335 tet_infoline("Testing RenderTask::GetViewport() on default task");
1337 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1338 RenderTask task = taskList.GetTask( 0u );
1339 Viewport viewport = task.GetViewport();
1341 // By default the viewport should match the stage width/height
1342 Vector2 stageSize = Stage::GetCurrent().GetSize();
1343 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
1344 DALI_TEST_CHECK( viewport == expectedViewport );
1348 int UtcDaliRenderTaskGetViewportP02(void)
1350 TestApplication application;
1352 tet_infoline("Testing RenderTask::GetViewport() on new task");
1354 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1355 RenderTask task = taskList.CreateTask();
1356 Viewport viewport = task.GetViewport();
1358 // By default the viewport should match the stage width/height
1359 Vector2 stageSize = Stage::GetCurrent().GetSize();
1360 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
1361 DALI_TEST_CHECK( viewport == expectedViewport );
1365 int UtcDaliRenderTaskGetViewportN(void)
1367 TestApplication application;
1369 tet_infoline("Testing RenderTask::GetViewport() on empty handle");
1374 Viewport viewport = task.GetViewport();
1377 catch (Dali::DaliException& e)
1379 DALI_TEST_PRINT_ASSERT( e );
1380 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1386 int UtcDaliRenderTaskSetViewportP(void)
1388 TestApplication application;
1390 tet_infoline("Testing RenderTask::SetViewport()");
1392 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1394 RenderTask task = taskList.GetTask( 0u );
1395 Vector2 stageSize = Stage::GetCurrent().GetSize();
1396 Viewport newViewport( 0, 0, stageSize.width * 0.5f, stageSize.height * 0.5f );
1397 task.SetViewport( newViewport );
1399 // Update (viewport is a property)
1400 application.SendNotification();
1401 application.Render();
1403 DALI_TEST_CHECK( task.GetViewport() == newViewport );
1407 int UtcDaliRenderTaskSetViewportN(void)
1409 TestApplication application;
1411 tet_infoline("Testing RenderTask::SetViewport()");
1413 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1418 Vector2 stageSize = Stage::GetCurrent().GetSize();
1419 Viewport newViewport( 0, 0, stageSize.width * 0.5f, stageSize.height * 0.5f );
1420 task.SetViewport( newViewport );
1422 catch (Dali::DaliException& e)
1424 DALI_TEST_PRINT_ASSERT( e );
1425 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1432 int UtcDaliRenderTaskSetViewportPosition(void)
1434 TestApplication application;
1436 tet_infoline("Testing RenderTask::SetViewportPosition()");
1438 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1440 RenderTask task = taskList.GetTask( 0u );
1442 Viewport viewport = task.GetViewport();
1444 // By default the viewport should match the stage width/height
1446 Vector2 stageSize = Stage::GetCurrent().GetSize();
1447 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
1448 DALI_TEST_CHECK( viewport == expectedViewport );
1451 Vector2 newPosition(25.0f, 50.0f);
1452 task.SetViewportPosition( newPosition );
1454 // Update (viewport is a property)
1455 application.SendNotification();
1456 application.Render();
1458 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1460 // Set by Property test
1461 Vector2 newPosition2(32.0f, 32.0f);
1462 task.SetProperty( RenderTask::Property::VIEWPORT_POSITION, newPosition2 );
1463 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition2, TEST_LOCATION );
1464 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition, TEST_LOCATION ); // still the old position
1467 application.SendNotification();
1468 application.Render();
1470 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition2, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1471 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition2, TEST_LOCATION );
1472 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition2, TEST_LOCATION );
1474 Vector2 newPosition3(64.0f, 0.0f);
1475 Animation animation = Animation::New(1.0f);
1476 animation.AnimateTo( Property( task, RenderTask::Property::VIEWPORT_POSITION ), newPosition3, AlphaFunction::LINEAR );
1479 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1480 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition2, TEST_LOCATION );
1482 // Perform 1000ms worth of updates at which point animation should have completed.
1483 Wait(application, 1000);
1484 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1485 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1486 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1488 // Create another animation which animates by a certain value
1489 const Vector2 newPosition4( 75.0f, 45.0f );
1490 const Vector2 relativePosition( newPosition4 - newPosition3 );
1491 animation = Animation::New( 1.0f );
1492 animation.AnimateBy( Property( task, RenderTask::Property::VIEWPORT_POSITION ), relativePosition );
1495 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1496 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition3, TEST_LOCATION );
1498 // Perform 1000ms worth of updates at which point animation should have completed.
1499 Wait(application, 1000);
1500 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1501 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1502 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1507 int UtcDaliRenderTaskSetViewportSize(void)
1509 TestApplication application;
1511 tet_infoline("Testing RenderTask::SetViewportSize()");
1513 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1515 RenderTask task = taskList.GetTask( 0u );
1517 Viewport viewport = task.GetViewport();
1519 // By default the viewport should match the stage width/height
1521 Vector2 stageSize = Stage::GetCurrent().GetSize();
1522 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
1523 DALI_TEST_CHECK( viewport == expectedViewport );
1525 Vector2 newSize(128.0f, 64.0f);
1526 task.SetViewportSize( newSize );
1528 // Update (viewport is a property)
1529 application.SendNotification();
1530 application.Render();
1532 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1534 // Set by Property test
1535 Vector2 newSize2(50.0f, 50.0f);
1536 task.SetProperty( RenderTask::Property::VIEWPORT_SIZE, newSize2 );
1537 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize2, TEST_LOCATION );
1538 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize, TEST_LOCATION ); // still the old position
1541 application.SendNotification();
1542 application.Render();
1544 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize2, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1545 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize2, TEST_LOCATION );
1546 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize2, TEST_LOCATION );
1548 Vector2 newSize3(10.0f, 10.0f);
1549 Animation animation = Animation::New(1.0f);
1550 animation.AnimateTo( Property( task, RenderTask::Property::VIEWPORT_SIZE ), newSize3, AlphaFunction::LINEAR );
1553 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1554 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize2, TEST_LOCATION );
1556 // Perform 1000ms worth of updates at which point animation should have completed.
1557 Wait(application, 1000);
1558 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1559 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1560 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1562 // Create another animation which animates by a certain value
1563 const Vector2 newSize4( 75.0f, 45.0f );
1564 const Vector2 relativeSize( newSize4 - newSize3 );
1565 animation = Animation::New( 1.0f );
1566 animation.AnimateBy( Property( task, RenderTask::Property::VIEWPORT_SIZE ), relativeSize );
1569 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1570 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize3, TEST_LOCATION );
1572 // Perform 1000ms worth of updates at which point animation should have completed.
1573 Wait(application, 1000);
1574 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1575 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1576 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1581 int UtcDaliRenderTaskSetClearColorP(void)
1583 TestApplication application;
1585 tet_infoline("Testing RenderTask::SetClearColor()");
1587 Vector4 testColor( 1.0f, 2.0f, 3.0f, 4.0f );
1588 Vector4 testColor2( 5.0f, 6.0f, 7.0f, 8.0f );
1590 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1592 RenderTask task = taskList.GetTask( 0u );
1593 DALI_TEST_CHECK( task.GetClearColor() != testColor );
1595 task.SetClearColor( testColor );
1600 DALI_TEST_EQUALS( task.GetClearColor(), testColor, TEST_LOCATION );
1602 task.SetProperty( RenderTask::Property::CLEAR_COLOR, testColor2 );
1603 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor2, TEST_LOCATION );
1604 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor, TEST_LOCATION ); // still the old color
1609 DALI_TEST_EQUALS( task.GetClearColor(), testColor2, TEST_LOCATION );
1610 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor2, TEST_LOCATION );
1611 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor2, TEST_LOCATION );
1613 Vector4 newColor3(10.0f, 10.0f, 20.0f, 30.0f);
1614 Animation animation = Animation::New(1.0f);
1615 animation.AnimateTo( Property( task, RenderTask::Property::CLEAR_COLOR ), newColor3, AlphaFunction::LINEAR );
1618 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1619 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor2, TEST_LOCATION );
1621 // Perform 1000ms worth of updates at which point animation should have completed.
1622 Wait(application, 1000);
1623 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1624 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1626 // Create another animation which animates by a certain value
1627 const Vector4 newColor4( 0.45f, 0.35f, 0.25f, 0.1f );
1628 const Vector4 relativeColor( newColor4 - newColor3 );
1629 animation = Animation::New( 1.0f );
1630 animation.AnimateBy( Property( task, RenderTask::Property::CLEAR_COLOR ), relativeColor );
1633 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor4, Math::MACHINE_EPSILON_10, TEST_LOCATION );
1634 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor3, Math::MACHINE_EPSILON_10, TEST_LOCATION );
1636 // Perform 1000ms worth of updates at which point animation should have completed.
1637 Wait(application, 1000);
1638 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor4, Math::MACHINE_EPSILON_10, TEST_LOCATION );
1639 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor4, Math::MACHINE_EPSILON_10, TEST_LOCATION );
1644 int UtcDaliRenderTaskSetClearColorN(void)
1646 TestApplication application;
1648 tet_infoline("Testing RenderTask::SetClearColor() on empty handle");
1653 task.SetClearColor( Vector4::ZERO );
1655 catch (Dali::DaliException& e)
1657 DALI_TEST_PRINT_ASSERT( e );
1658 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1663 int UtcDaliRenderTaskGetClearColorP(void)
1665 TestApplication application;
1667 tet_infoline("Testing RenderTask::GetClearColor()");
1669 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1670 RenderTask task = taskList.GetTask( 0u );
1671 DALI_TEST_EQUALS( task.GetClearColor(), RenderTask::DEFAULT_CLEAR_COLOR, TEST_LOCATION );
1675 int UtcDaliRenderTaskGetClearColorN(void)
1677 TestApplication application;
1679 tet_infoline("Testing RenderTask::GetClearColor()");
1684 Vector4 color = task.GetClearColor();
1687 catch (Dali::DaliException& e)
1689 DALI_TEST_PRINT_ASSERT( e );
1690 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1695 int UtcDaliRenderTaskSetClearEnabledP(void)
1697 TestApplication application;
1699 tet_infoline("Testing RenderTask::SetClearEnabled()");
1701 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1703 RenderTask task = taskList.GetTask( 0u );
1704 DALI_TEST_CHECK( task.GetClearEnabled() ); // defaults to true
1706 task.SetClearEnabled( false );
1707 DALI_TEST_EQUALS( task.GetClearEnabled(), false, TEST_LOCATION );
1709 task.SetClearEnabled( true );
1710 DALI_TEST_EQUALS( task.GetClearEnabled(), true, TEST_LOCATION );
1714 int UtcDaliRenderTaskSetClearEnabledN(void)
1716 TestApplication application;
1718 tet_infoline("Testing RenderTask::SetClearEnabled() with empty handle");
1723 task.SetClearEnabled(true);
1725 catch (Dali::DaliException& e)
1727 DALI_TEST_PRINT_ASSERT( e );
1728 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1733 int UtcDaliRenderTaskGetClearEnabledP(void)
1735 TestApplication application;
1737 tet_infoline("Testing RenderTask::GetClearEnabled()");
1739 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1741 RenderTask task = taskList.GetTask( 0u );
1742 DALI_TEST_CHECK( task.GetClearEnabled() ); // defaults to true
1747 int UtcDaliRenderTaskGetClearEnabledN(void)
1749 TestApplication application;
1751 tet_infoline("Testing RenderTask::GetClearEnabled() with empty handle");
1756 bool x = task.GetClearEnabled();
1759 catch (Dali::DaliException& e)
1761 DALI_TEST_PRINT_ASSERT( e );
1762 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1767 int UtcDaliRenderTaskSetCullModeP(void)
1769 TestApplication application;
1771 tet_infoline("Testing RenderTask::SetCullMode()");
1773 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1774 RenderTask task = taskList.GetTask( 0u );
1775 DALI_TEST_EQUALS( task.GetCullMode(), true, TEST_LOCATION );
1777 task.SetCullMode( false );
1779 DALI_TEST_EQUALS( task.GetCullMode(), false, TEST_LOCATION );
1784 int UtcDaliRenderTaskSetCullModeN(void)
1786 TestApplication application;
1788 tet_infoline("Testing RenderTask::SetCullMode() on empty handle");
1793 task.SetCullMode( false );
1795 catch (Dali::DaliException& e)
1797 DALI_TEST_PRINT_ASSERT( e );
1798 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1803 int UtcDaliRenderTaskGetCullModeP(void)
1805 TestApplication application;
1807 tet_infoline("Testing RenderTask::GetCullMode()");
1809 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1810 RenderTask task = taskList.GetTask( 0u );
1811 DALI_TEST_EQUALS( task.GetCullMode(), true, TEST_LOCATION );
1815 int UtcDaliRenderTaskGetCullModeN(void)
1817 TestApplication application;
1819 tet_infoline("Testing RenderTask::GetCullMode() with empty handle");
1824 bool x = task.GetCullMode();
1827 catch (Dali::DaliException& e)
1829 DALI_TEST_PRINT_ASSERT( e );
1830 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1836 int UtcDaliRenderTaskSetRefreshRate(void)
1838 TestApplication application;
1840 tet_infoline("Testing RenderTask::SetRefreshRate()");
1842 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1844 // By default tasks will be processed every frame
1845 RenderTask task = taskList.GetTask( 0u );
1846 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
1848 task.SetRefreshRate( 2u ); // every-other frame
1849 DALI_TEST_CHECK( 2u == task.GetRefreshRate() );
1851 task.SetRefreshRate( RenderTask::REFRESH_ALWAYS );
1852 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
1856 int UtcDaliRenderTaskGetRefreshRate(void)
1858 TestApplication application;
1860 tet_infoline("Testing RenderTask::GetRefreshRate()");
1862 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1864 // By default tasks will be processed every frame
1865 RenderTask task = taskList.GetTask( 0u );
1866 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
1868 RenderTask newTask = taskList.CreateTask();
1869 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == newTask.GetRefreshRate() );
1873 int UtcDaliRenderTaskSignalFinished(void)
1875 TestApplication application;
1877 tet_infoline("Testing RenderTask::SignalFinished()");
1879 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1880 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1882 CameraActor offscreenCameraActor = CameraActor::New();
1884 Stage::GetCurrent().Add( offscreenCameraActor );
1886 Texture image = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 10, 10 );
1887 Actor rootActor = CreateRenderableActor( image );
1888 rootActor.SetProperty( Actor::Property::SIZE, Vector2( 10.0f, 10.0f ) );
1889 Stage::GetCurrent().Add( rootActor );
1891 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1892 NativeImageInterfacePtr testNativeImagePtr = TestNativeImage::New(10, 10);
1893 FrameBufferImage frameBufferImage = FrameBufferImage::New( *testNativeImagePtr.Get() );
1895 RenderTask newTask = taskList.CreateTask();
1896 newTask.SetCameraActor( offscreenCameraActor );
1897 newTask.SetSourceActor( rootActor );
1898 newTask.SetInputEnabled( false );
1899 newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
1900 newTask.SetClearEnabled( true );
1901 newTask.SetExclusive( true );
1902 newTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
1903 newTask.SetTargetFrameBuffer( frameBufferImage );
1904 newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, true );
1906 bool finished = false;
1907 RenderTaskFinished renderTaskFinished( finished );
1908 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1910 // Flush the queue and render.
1911 application.SendNotification();
1913 // 1 render to process render task, then wait for sync before finished msg is sent
1914 // from update to the event thread.
1916 application.Render();
1917 application.SendNotification();
1918 DALI_TEST_CHECK( !finished );
1920 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1921 DALI_TEST_CHECK( lastSyncObj != NULL );
1923 application.Render();
1924 DALI_TEST_EQUALS( (Integration::KeepUpdating::Reasons)(application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
1925 application.SendNotification();
1926 DALI_TEST_CHECK( !finished );
1928 application.Render();
1929 DALI_TEST_EQUALS( (Integration::KeepUpdating::Reasons)(application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
1930 application.SendNotification();
1931 DALI_TEST_CHECK( ! finished );
1933 sync.SetObjectSynced( lastSyncObj, true );
1935 application.Render();
1936 application.SendNotification();
1937 DALI_TEST_CHECK( !finished );
1939 application.Render();
1940 application.SendNotification();
1941 DALI_TEST_CHECK( finished );
1943 DALI_TEST_EQUALS( application.GetUpdateStatus(), 0, TEST_LOCATION );
1948 int UtcDaliRenderTaskContinuous01(void)
1950 TestApplication application;
1952 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (source actor not staged)\nPOST:continuous renders, no Finished signal");
1954 // SETUP AN OFFSCREEN RENDER TASK
1955 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1956 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1957 drawTrace.Enable(true);
1959 Actor rootActor = Actor::New();
1960 Stage::GetCurrent().Add( rootActor );
1962 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
1963 Stage::GetCurrent().Add( offscreenCameraActor );
1965 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
1967 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1968 bool finished = false;
1969 RenderTaskFinished renderTaskFinished( finished );
1970 application.SendNotification();
1972 // START PROCESS/RENDER Input, Expected Input, Expected, KeepUpdating
1973 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false, __LINE__ ) );
1974 application.GetPlatform().ClearReadyResources();
1976 // ADD SOURCE ACTOR TO STAGE - expect continuous renders to start, no finished signal
1977 Stage::GetCurrent().Add(secondRootActor);
1978 application.SendNotification();
1980 // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
1981 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
1986 int UtcDaliRenderTaskContinuous02(void)
1988 TestApplication application;
1990 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (source actor not visible)\nPOST:continuous renders, no Finished signal");
1992 // SETUP AN OFFSCREEN RENDER TASK
1993 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1994 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1995 drawTrace.Enable(true);
1997 Actor rootActor = Actor::New();
1998 Stage::GetCurrent().Add( rootActor );
2000 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2001 Stage::GetCurrent().Add( offscreenCameraActor );
2003 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2004 Stage::GetCurrent().Add(secondRootActor);
2005 secondRootActor.SetProperty( Actor::Property::VISIBLE,false);
2007 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
2008 bool finished = false;
2009 RenderTaskFinished renderTaskFinished( finished );
2010 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2011 application.SendNotification();
2013 // START PROCESS/RENDER Input, Expected Input, Expected, KeepUpdating
2014 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false, __LINE__ ) );
2015 application.GetPlatform().ClearReadyResources();
2017 // MAKE SOURCE ACTOR VISIBLE - expect continuous renders to start, no finished signal
2018 secondRootActor.SetProperty( Actor::Property::VISIBLE,true);
2019 application.SendNotification();
2021 // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
2022 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2026 int UtcDaliRenderTaskContinuous03(void)
2028 TestApplication application;
2030 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (camera actor not staged)\nPOST:continuous renders, no Finished signal");
2032 // SETUP AN OFFSCREEN RENDER TASK
2033 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2034 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2035 drawTrace.Enable(true);
2037 Actor rootActor = Actor::New();
2038 Stage::GetCurrent().Add( rootActor );
2040 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2041 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2042 Stage::GetCurrent().Add(secondRootActor);
2044 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
2045 bool finished = false;
2046 RenderTaskFinished renderTaskFinished( finished );
2047 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2048 application.SendNotification();
2050 // START PROCESS/RENDER Input, Expected Input, Expected
2051 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false, __LINE__ ) );
2052 application.GetPlatform().ClearReadyResources();
2054 // ADD CAMERA ACTOR TO STAGE - expect continuous renders to start, no finished signal
2055 Stage::GetCurrent().Add( offscreenCameraActor );
2056 application.SendNotification();
2058 // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
2059 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2064 int UtcDaliRenderTaskContinuous04(void)
2066 TestApplication application;
2068 tet_infoline("Testing RenderTask Render Continuous using loaded image");
2070 // SETUP AN OFFSCREEN RENDER TASK
2071 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2072 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2073 drawTrace.Enable(true);
2075 Actor rootActor = Actor::New();
2076 Stage::GetCurrent().Add( rootActor );
2078 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2079 Stage::GetCurrent().Add( offscreenCameraActor );
2080 Actor secondRootActor = CreateRenderableActorFailed(application, "aFile.jpg");
2081 Stage::GetCurrent().Add(secondRootActor);
2083 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
2084 bool finished = false;
2085 RenderTaskFinished renderTaskFinished( finished );
2086 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2087 application.SendNotification();
2089 // START PROCESS/RENDER Input, Expected Input, Expected
2090 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2094 int UtcDaliRenderTaskOnce01(void)
2096 TestApplication application;
2098 tet_infoline("Testing RenderTask Render Once GlSync, using loaded image");
2100 // SETUP AN OFFSCREEN RENDER TASK
2101 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2102 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2103 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2104 drawTrace.Enable(true);
2106 Actor rootActor = Actor::New();
2107 Stage::GetCurrent().Add( rootActor );
2109 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2110 Stage::GetCurrent().Add( offscreenCameraActor );
2111 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2113 Stage::GetCurrent().Add(secondRootActor);
2115 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, true);
2116 bool finished = false;
2117 RenderTaskFinished renderTaskFinished( finished );
2118 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2119 application.SendNotification();
2121 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2123 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2124 DALI_TEST_CHECK( lastSyncObj != NULL );
2125 sync.SetObjectSynced( lastSyncObj, true );
2127 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true, __LINE__ ) );
2128 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2132 int UtcDaliRenderTaskOnce02(void)
2134 TestApplication application;
2136 tet_infoline("Testing RenderTask Render Once GlSync, using Mesh which accesses texture through sampler with loaded image.\n");
2138 // SETUP AN OFFSCREEN RENDER TASK
2139 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2140 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2141 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2142 drawTrace.Enable(true);
2144 Actor rootActor = Actor::New();
2145 Stage::GetCurrent().Add( rootActor );
2147 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2148 Stage::GetCurrent().Add( offscreenCameraActor );
2150 Shader shader = CreateShader();
2151 Image image = CreateResourceImage(application, "aFile.jpg");
2152 TextureSet textureSet = CreateTextureSet( image );
2154 Geometry geometry = CreateQuadGeometry();
2155 Renderer renderer = Renderer::New(geometry, shader);
2156 renderer.SetTextures( textureSet );
2157 Actor secondRootActor = Actor::New();
2158 secondRootActor.AddRenderer(renderer);
2159 secondRootActor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
2160 Stage::GetCurrent().Add(secondRootActor);
2162 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, true);
2163 bool finished = false;
2164 RenderTaskFinished renderTaskFinished( finished );
2165 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2166 application.SendNotification();
2168 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2170 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2171 DALI_TEST_CHECK( lastSyncObj != NULL );
2172 sync.SetObjectSynced( lastSyncObj, true );
2174 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true, __LINE__ ) );
2175 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2180 int UtcDaliRenderTaskOnce03(void)
2182 TestApplication application;
2184 tet_infoline("Testing RenderTask Render Once GlSync, using loaded image. Switch from render always after ready to render once\n");
2186 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2187 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2188 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2189 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2190 drawTrace.Enable(true);
2192 Actor rootActor = Actor::New();
2193 Stage::GetCurrent().Add( rootActor );
2195 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2196 Stage::GetCurrent().Add( offscreenCameraActor );
2197 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2198 Stage::GetCurrent().Add(secondRootActor);
2200 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
2201 bool finished = false;
2202 RenderTaskFinished renderTaskFinished( finished );
2203 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2204 application.SendNotification();
2206 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2208 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2209 application.SendNotification();
2211 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2213 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2214 DALI_TEST_CHECK( lastSyncObj != NULL );
2215 sync.SetObjectSynced( lastSyncObj, true );
2217 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true, __LINE__ ) );
2218 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2224 int UtcDaliRenderTaskOnce04(void)
2226 TestApplication application;
2227 tet_infoline("Testing RenderTask Render Once GlSync, using Mesh which accesses texture through sampler with loaded image.\n"
2228 "Switch from render always after ready to render once\n"
2231 // SETUP AN OFFSCREEN RENDER TASK
2232 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2233 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2234 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2235 drawTrace.Enable(true);
2237 Actor rootActor = Actor::New();
2238 Stage::GetCurrent().Add( rootActor );
2240 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2241 Stage::GetCurrent().Add( offscreenCameraActor );
2243 Shader shader = CreateShader();
2244 Image image = CreateResourceImage(application, "aFile.jpg");
2245 TextureSet textureSet = CreateTextureSet( image );
2247 Geometry geometry = CreateQuadGeometry();
2248 Renderer renderer = Renderer::New(geometry, shader);
2249 renderer.SetTextures( textureSet );
2250 Actor secondRootActor = Actor::New();
2251 secondRootActor.AddRenderer(renderer);
2252 secondRootActor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
2253 Stage::GetCurrent().Add(secondRootActor);
2255 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
2256 bool finished = false;
2257 RenderTaskFinished renderTaskFinished( finished );
2258 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2259 application.SendNotification();
2261 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2263 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2264 application.SendNotification();
2266 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2268 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2269 DALI_TEST_CHECK( lastSyncObj != NULL );
2270 sync.SetObjectSynced( lastSyncObj, true );
2272 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true, __LINE__ ) );
2273 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2278 int UtcDaliRenderTaskOnceNoSync01(void)
2280 TestApplication application;
2282 tet_infoline("Testing RenderTask Render Once, \nPRE: Resources ready\nPOST: Finished signal sent once only");
2284 // SETUP AN OFFSCREEN RENDER TASK
2285 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2286 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2287 drawTrace.Enable(true);
2289 Actor rootActor = Actor::New();
2290 Stage::GetCurrent().Add( rootActor );
2292 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2293 Stage::GetCurrent().Add( offscreenCameraActor );
2294 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2295 Stage::GetCurrent().Add(secondRootActor);
2297 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, false);
2298 bool finished = false;
2299 RenderTaskFinished renderTaskFinished( finished );
2300 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2301 application.SendNotification();
2303 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2304 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2308 int UtcDaliRenderTaskOnceNoSync02(void)
2310 TestApplication application;
2312 tet_infoline("Testing RenderTask Render Once, using Mesh which accesses texture through sampler with loaded image.\n"
2313 "PRE: Resources ready\nPOST: Finished signal sent once only");
2314 // SETUP AN OFFSCREEN RENDER TASK
2315 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2316 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2317 drawTrace.Enable(true);
2319 Actor rootActor = Actor::New();
2320 Stage::GetCurrent().Add( rootActor );
2322 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2323 Stage::GetCurrent().Add( offscreenCameraActor );
2325 Shader shader = CreateShader();
2326 Image image = CreateResourceImage(application, "aFile.jpg");
2327 TextureSet textureSet = CreateTextureSet( image );
2329 Geometry geometry = CreateQuadGeometry();
2330 Renderer renderer = Renderer::New(geometry, shader);
2331 renderer.SetTextures( textureSet );
2332 Actor secondRootActor = Actor::New();
2333 secondRootActor.AddRenderer(renderer);
2334 secondRootActor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
2335 Stage::GetCurrent().Add(secondRootActor);
2337 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, false);
2338 bool finished = false;
2339 RenderTaskFinished renderTaskFinished( finished );
2340 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2341 application.SendNotification();
2343 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2344 application.GetPlatform().ClearReadyResources();
2345 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2350 int UtcDaliRenderTaskOnceNoSync03(void)
2352 TestApplication application;
2354 tet_infoline("Testing RenderTask Render Once, using loaded image. Switch from render always after ready to render once\n"
2355 "PRE: Render task ready, Image loaded\n"
2356 "POST: Finished signal sent only once");
2358 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2359 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2360 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2361 drawTrace.Enable(true);
2363 Actor rootActor = Actor::New();
2364 Stage::GetCurrent().Add( rootActor );
2366 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2367 Stage::GetCurrent().Add( offscreenCameraActor );
2368 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2369 Stage::GetCurrent().Add(secondRootActor);
2371 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2372 bool finished = false;
2373 RenderTaskFinished renderTaskFinished( finished );
2374 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2375 application.SendNotification();
2377 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2379 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2380 application.SendNotification(); // Input, Expected Input, Expected
2381 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2382 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2386 int UtcDaliRenderTaskOnceNoSync04(void)
2388 TestApplication application;
2390 tet_infoline("Testing RenderTask Render Once, using Mesh which accesses texture through sampler with loading image.\n"
2391 "Switch from render always after ready to render once\n"
2392 "PRE: Render task ready, Image not loaded\n"
2393 "POST: Finished signal sent only once");
2395 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2396 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2397 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2398 drawTrace.Enable(true);
2400 Actor rootActor = Actor::New();
2401 Stage::GetCurrent().Add( rootActor );
2403 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2404 Stage::GetCurrent().Add( offscreenCameraActor );
2406 Shader shader = CreateShader();
2407 Image image = CreateResourceImage(application, "aFile.jpg");
2408 TextureSet textureSet = CreateTextureSet( image );
2410 Geometry geometry = CreateQuadGeometry();
2411 Renderer renderer = Renderer::New(geometry, shader);
2412 renderer.SetTextures( textureSet );
2413 Actor secondRootActor = Actor::New();
2414 secondRootActor.AddRenderer(renderer);
2415 secondRootActor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
2416 Stage::GetCurrent().Add(secondRootActor);
2419 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2420 bool finished = false;
2421 RenderTaskFinished renderTaskFinished( finished );
2422 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2423 application.SendNotification();
2425 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2426 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2427 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2428 DALI_TEST_CHECK( lastSyncObj == NULL );
2430 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2431 application.SendNotification(); // Input, Expected Input, Expected
2432 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2433 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2435 lastSyncObj = sync.GetLastSyncObject();
2436 DALI_TEST_CHECK( lastSyncObj == NULL );
2441 int UtcDaliRenderTaskOnceNoSync05(void)
2443 TestApplication application;
2445 tet_infoline("Testing RenderTask Render Once\n"
2446 "SetRefreshRate(ONCE), resource load failed, completes render task.\n"
2447 "PRE: resources failed to load\n"
2448 "POST: No finished signal sent.");
2450 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2451 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2452 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2453 drawTrace.Enable(true);
2455 Actor rootActor = Actor::New();
2456 Stage::GetCurrent().Add( rootActor );
2458 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2459 Stage::GetCurrent().Add( offscreenCameraActor );
2460 Actor secondRootActor = CreateRenderableActorFailed(application, "aFile.jpg");
2461 Stage::GetCurrent().Add(secondRootActor);
2463 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2464 bool finished = false;
2465 RenderTaskFinished renderTaskFinished( finished );
2466 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2467 application.SendNotification();
2469 // START PROCESS/RENDER Input, Expected Input, Expected
2470 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2472 // CHANGE TO RENDER ONCE,
2473 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2474 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2481 int UtcDaliRenderTaskOnceChain01(void)
2483 TestApplication application;
2485 tet_infoline("Testing RenderTask Render Once Chained render tasks\n"
2486 "SetRefreshRate(ONCE), resource load completes, both render tasks render.\n"
2487 "PRE: resources ready\n"
2488 "POST: 2 finished signals sent.");
2490 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2491 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2492 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2493 drawTrace.Enable(true);
2495 Actor defaultRootActor = Actor::New(); // Root for default RT
2496 Stage::GetCurrent().Add( defaultRootActor );
2498 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2499 Stage::GetCurrent().Add( offscreenCameraActor );
2500 Actor firstRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2501 Stage::GetCurrent().Add(firstRootActor);
2503 // first render task
2504 RenderTask firstTask = CreateRenderTask(application, offscreenCameraActor, defaultRootActor, firstRootActor, RenderTask::REFRESH_ONCE, false);
2505 bool firstFinished = false;
2506 RenderTaskFinished renderTask1Finished( firstFinished );
2507 firstTask.FinishedSignal().Connect( &application, renderTask1Finished );
2509 // Second render task
2510 FrameBufferImage fbo = firstTask.GetTargetFrameBuffer();
2511 Actor secondRootActor = CreateRenderableActor( fbo );
2512 Stage::GetCurrent().Add(secondRootActor);
2513 RenderTask secondTask = CreateRenderTask(application, offscreenCameraActor, defaultRootActor, secondRootActor, RenderTask::REFRESH_ONCE, false);
2514 bool secondFinished = false;
2515 RenderTaskFinished renderTask2Finished( secondFinished );
2516 secondTask.FinishedSignal().Connect( &application, renderTask2Finished );
2518 application.SendNotification();
2520 //Both render tasks are executed.
2521 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false, true, __LINE__ ) );
2522 DALI_TEST_CHECK( firstFinished == false );
2523 DALI_TEST_CHECK( secondFinished == false );
2525 //Nothing else to render and both render task should have finished now
2526 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, firstFinished, true, false, __LINE__ ) );
2527 DALI_TEST_CHECK( firstFinished == true );
2528 DALI_TEST_CHECK( secondFinished == true );
2533 int UtcDaliRenderTaskProperties(void)
2535 TestApplication application;
2537 RenderTask task = Stage::GetCurrent().GetRenderTaskList().CreateTask();
2539 Property::IndexContainer indices;
2540 task.GetPropertyIndices( indices );
2541 DALI_TEST_CHECK( indices.Size() );
2542 DALI_TEST_EQUALS( indices.Size(), task.GetPropertyCount(), TEST_LOCATION );
2546 int UtcDaliRenderTaskFinishInvisibleSourceActor(void)
2548 TestApplication application;
2550 tet_infoline("Testing RenderTask::FinishInvisibleSourceActor()");
2552 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2553 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2555 CameraActor offscreenCameraActor = CameraActor::New();
2557 Stage::GetCurrent().Add( offscreenCameraActor );
2559 Texture image = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 10, 10 );
2560 Actor rootActor = CreateRenderableActor( image );
2561 rootActor.SetProperty( Actor::Property::SIZE, Vector2( 10.0f, 10.0f ) );
2562 rootActor.SetProperty( Actor::Property::VISIBLE,false);
2563 Stage::GetCurrent().Add( rootActor );
2565 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
2566 NativeImageInterfacePtr testNativeImagePtr = TestNativeImage::New(10, 10);
2567 FrameBufferImage frameBufferImage = FrameBufferImage::New( *testNativeImagePtr.Get() );
2569 // Flush all outstanding messages
2570 application.SendNotification();
2571 application.Render();
2573 RenderTask newTask = taskList.CreateTask();
2574 newTask.SetCameraActor( offscreenCameraActor );
2575 newTask.SetSourceActor( rootActor );
2576 newTask.SetInputEnabled( false );
2577 newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
2578 newTask.SetClearEnabled( true );
2579 newTask.SetExclusive( true );
2580 newTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
2581 newTask.SetTargetFrameBuffer( frameBufferImage );
2582 newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, true );
2584 // Framebuffer doesn't actually get created until Connected, i.e. by previous line
2586 bool finished = false;
2587 RenderTaskFinished renderTaskFinished( finished );
2588 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2590 // Flush the queue and render.
2591 application.SendNotification();
2593 // 1 render to process render task, then wait for sync before finished msg is sent
2594 // from update to the event thread.
2596 application.Render();
2597 application.SendNotification();
2598 DALI_TEST_CHECK( !finished );
2600 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2601 DALI_TEST_CHECK( lastSyncObj != NULL );
2603 application.Render();
2604 DALI_TEST_EQUALS( (Integration::KeepUpdating::Reasons)(application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
2605 application.SendNotification();
2606 DALI_TEST_CHECK( !finished );
2608 application.Render();
2609 DALI_TEST_EQUALS( (Integration::KeepUpdating::Reasons)(application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
2610 application.SendNotification();
2611 DALI_TEST_CHECK( ! finished );
2613 sync.SetObjectSynced( lastSyncObj, true );
2615 application.Render();
2616 application.SendNotification();
2617 DALI_TEST_CHECK( !finished );
2619 application.Render();
2620 application.SendNotification();
2621 DALI_TEST_CHECK( finished );
2624 application.Render(); // Double check no more finished signal
2625 application.SendNotification();
2626 DALI_TEST_CHECK( ! finished );
2631 int UtcDaliRenderTaskFinishMissingImage(void)
2633 TestApplication application;
2635 // Previously we had bugs where not having a resource ID would cause render-tasks to wait forever
2636 tet_infoline("Testing RenderTask::SignalFinished() when an Actor has no Image set");
2638 Stage stage = Stage::GetCurrent();
2640 Texture image = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 10, 10 );
2641 Actor rootActor = CreateRenderableActor( image );
2642 rootActor.SetProperty( Actor::Property::SIZE, Vector2( 10.0f, 10.0f ) );
2643 stage.Add( rootActor );
2645 Actor actorWithMissingImage = CreateRenderableActor( Image() );
2646 actorWithMissingImage.SetProperty( Actor::Property::SIZE, Vector2( 10.0f, 10.0f ) );
2647 stage.Add( actorWithMissingImage );
2649 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
2650 RenderTask newTask = taskList.CreateTask();
2651 newTask.SetInputEnabled( false );
2652 newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
2653 newTask.SetClearEnabled( true );
2654 newTask.SetExclusive( true );
2655 newTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
2657 bool finished = false;
2658 RenderTaskFinished renderTaskFinished( finished );
2659 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2661 // 1 render to process render task, then 1 before finished msg is sent from update to the event thread.
2662 application.SendNotification();
2663 application.Render();
2664 application.Render();
2666 application.SendNotification();
2667 DALI_TEST_CHECK( finished );
2672 int UtcDaliRenderTaskWorldToViewport(void)
2674 TestApplication application( 400u, 400u ); // square surface
2676 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
2678 Actor actor = Actor::New();
2679 actor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
2680 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0, 0.0, 0.0) );
2682 actor.SetProperty( Actor::Property::PARENT_ORIGIN, Vector3(0.5, 0.5, 0.5) );
2683 actor.SetProperty( Actor::Property::ANCHOR_POINT, Vector3(0.5, 0.5, 0.5) );
2685 Stage::GetCurrent().Add(actor);
2687 application.SendNotification();
2688 application.Render();
2689 application.SendNotification();
2691 RenderTask task = taskList.GetTask( 0u );
2693 CameraActor camera = task.GetCameraActor();
2695 Vector2 screenSize = task.GetCurrentViewportSize();
2697 float screenX = 0.0;
2698 float screenY = 0.0;
2700 bool ok = task.WorldToViewport(actor.GetCurrentProperty< Vector3 >( Actor::Property::WORLD_POSITION ), screenX, screenY);
2701 DALI_TEST_CHECK(ok == true);
2703 DALI_TEST_EQUALS(screenX, screenSize.x/2, Math::MACHINE_EPSILON_10000, TEST_LOCATION);
2704 DALI_TEST_EQUALS(screenY, screenSize.y/2, Math::MACHINE_EPSILON_10000, TEST_LOCATION);
2706 Actor actor2 = Actor::New();
2707 float actor2Size = 100.f;
2708 actor2.SetProperty( Actor::Property::SIZE, Vector2( actor2Size, actor2Size ) );
2709 actor2.SetProperty( Actor::Property::POSITION, Vector3(0.0, 0.0, 0.0) );
2710 actor2.SetProperty( Actor::Property::PARENT_ORIGIN, Vector3(0.5, 0.5, 0.0) );
2711 actor2.SetProperty( Actor::Property::ANCHOR_POINT, Vector3(0.5, 0.5, 0.0) );
2712 Stage::GetCurrent().Add( actor2 );
2714 actor.SetProperty( Actor::Property::PARENT_ORIGIN, Vector3(0,0,0) );
2716 application.SendNotification();
2717 application.Render();
2718 application.SendNotification();
2720 ok = task.WorldToViewport(actor.GetCurrentProperty< Vector3 >( Actor::Property::WORLD_POSITION ), screenX, screenY);
2721 DALI_TEST_CHECK(ok == true);
2723 DALI_TEST_EQUALS(screenX, screenSize.x/2 - actor2Size/2, Math::MACHINE_EPSILON_10000, TEST_LOCATION);
2724 DALI_TEST_EQUALS(screenY, screenSize.y/2 - actor2Size/2, Math::MACHINE_EPSILON_10000, TEST_LOCATION);
2730 int UtcDaliRenderTaskViewportToLocal(void)
2732 TestApplication application;
2733 Actor actor = Actor::New();
2734 actor.SetProperty( Actor::Property::ANCHOR_POINT,AnchorPoint::TOP_LEFT);
2735 actor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
2736 actor.SetProperty( Actor::Property::POSITION, Vector2(10.0f, 10.0f));
2737 Stage::GetCurrent().Add(actor);
2739 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
2740 RenderTask task = taskList.GetTask( 0u );
2742 // flush the queue and render once
2743 application.SendNotification();
2744 application.Render();
2745 application.SendNotification();
2746 application.Render();
2754 float screenX = 50.0f;
2755 float screenY = 50.0f;
2757 DALI_TEST_CHECK( actor.ScreenToLocal(localX, localY, screenX, screenY) );
2759 DALI_TEST_CHECK( task.ViewportToLocal(actor, screenX, screenY, rtLocalX, rtLocalY ) );
2761 DALI_TEST_EQUALS(localX, rtLocalX, 0.01f, TEST_LOCATION);
2762 DALI_TEST_EQUALS(localY, rtLocalY, 0.01f, TEST_LOCATION);
2768 int UtcDaliRenderTaskOffscreenViewportToLocal(void)
2770 TestApplication application;
2771 Actor actor = Actor::New();
2772 actor.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT );
2773 actor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
2774 actor.SetProperty( Actor::Property::POSITION, Vector2( 10.0f, 10.0f ));
2775 Stage::GetCurrent().Add( actor );
2777 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
2778 RenderTask task = taskList.CreateTask();
2780 FrameBufferImage newFrameBuffer = FrameBufferImage::New( 10, 10 );
2781 task.SetTargetFrameBuffer( newFrameBuffer );
2782 task.SetSourceActor( actor );
2783 task.SetScreenToFrameBufferMappingActor( actor );
2785 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2786 Stage::GetCurrent().Add( offscreenCameraActor );
2787 task.SetCameraActor( offscreenCameraActor );
2789 // flush the queue and render once
2790 application.SendNotification();
2791 application.Render();
2792 application.SendNotification();
2793 application.Render();
2801 float screenX = 50.0f;
2802 float screenY = 50.0f;
2804 DALI_TEST_CHECK( actor.ScreenToLocal(localX, localY, screenX, screenY) );
2806 DALI_TEST_CHECK( task.ViewportToLocal(actor, screenX, screenY, rtLocalX, rtLocalY ) );
2808 DALI_TEST_EQUALS(localX, rtLocalX, 0.01f, TEST_LOCATION);
2809 DALI_TEST_EQUALS(localY, rtLocalY, 0.01f, TEST_LOCATION);
2814 int UtcDaliRenderTaskRequiresSync(void)
2816 TestApplication application;
2817 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
2819 RenderTask newTask = taskList.CreateTask();
2820 newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, false );
2822 DALI_TEST_EQUALS( newTask.GetProperty< bool >( RenderTask::Property::REQUIRES_SYNC ), false, TEST_LOCATION );
2823 DALI_TEST_EQUALS( newTask.GetCurrentProperty< bool >( RenderTask::Property::REQUIRES_SYNC ), false, TEST_LOCATION );
2825 newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, true );
2827 DALI_TEST_EQUALS( newTask.GetProperty< bool >( RenderTask::Property::REQUIRES_SYNC ), true, TEST_LOCATION );
2828 DALI_TEST_EQUALS( newTask.GetCurrentProperty< bool >( RenderTask::Property::REQUIRES_SYNC ), true, TEST_LOCATION );
2833 int UtcDaliRenderTaskSetClearEnabled(void)
2835 TestApplication application;
2837 tet_infoline("UtcDaliRenderTaskSetClearEnabled");
2839 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2840 TestGlAbstraction& gl = application.GetGlAbstraction();
2842 Actor renderableActor = CreateRenderableActorSuccess( application, "aFile.jpg" );
2843 Stage::GetCurrent().Add( renderableActor );
2845 Actor rootActor = Actor::New();
2846 Stage::GetCurrent().Add( rootActor );
2848 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2849 Stage::GetCurrent().Add( offscreenCameraActor );
2851 Actor sourceActor = CreateRenderableActorSuccess( application, "aFile.jpg" );
2852 Stage::GetCurrent().Add( sourceActor );
2854 RenderTask newTask = CreateRenderTask( application, offscreenCameraActor, rootActor, sourceActor, RenderTask::REFRESH_ALWAYS, false );
2856 DALI_TEST_EQUALS( gl.GetClearCountCalled(), 0, TEST_LOCATION );
2858 application.SendNotification();
2859 application.Render();
2861 // glClear should be called twice - default task and the new task.
2862 DALI_TEST_EQUALS( gl.GetClearCountCalled(), 2, TEST_LOCATION );
2864 newTask.SetClearEnabled( false );
2866 application.SendNotification();
2867 application.Render();
2869 // The count should increase by 1 - default task only.
2870 DALI_TEST_EQUALS( gl.GetClearCountCalled(), 3, TEST_LOCATION );