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 Actor actor = CreateRenderableActor();
175 actor.SetProperty( Actor::Property::SIZE, Vector2( 80.0f, 80.0f ) );
179 Texture CreateTexture()
181 return Texture::New(TextureType::TEXTURE_2D, Pixel::RGBA8888, 80u, 80u);
184 RenderTask CreateRenderTask(TestApplication& application,
185 CameraActor offscreenCamera,
186 Actor rootActor, // Reset default render task to point at this actor
187 Actor secondRootActor, // Source actor
188 unsigned int refreshRate,
191 // Change main render task to use a different root
192 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
193 taskList.GetTask(0u).SetSourceActor( rootActor );
195 FrameBuffer frameBuffer = FrameBuffer::New(10,10);
198 NativeImageInterfacePtr testNativeImagePtr = TestNativeImage::New(10, 10);
199 Texture texture = Texture::New(*testNativeImagePtr);
200 frameBuffer.AttachColorTexture(texture);
203 // Don't draw output framebuffer // '
205 RenderTask newTask = taskList.CreateTask();
206 newTask.SetCameraActor( offscreenCamera );
207 newTask.SetSourceActor( secondRootActor );
208 newTask.SetInputEnabled( false );
209 newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
210 newTask.SetClearEnabled( true );
211 newTask.SetExclusive( true );
212 newTask.SetRefreshRate( refreshRate );
213 newTask.SetFrameBuffer( frameBuffer );
214 newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, glSync );
218 bool UpdateRender(TestApplication& application, TraceCallStack& callStack, bool testDrawn, bool& finishedSig, bool testFinished, bool testKeepUpdating, int lineNumber )
223 tet_printf("TestApplication::UpdateRender().\n");
225 application.Render(16);
226 application.SendNotification();
228 bool sigPassed = false;
231 sigPassed = finishedSig;
235 sigPassed = ! finishedSig;
238 bool drawResult = callStack.FindMethod("DrawElements") || callStack.FindMethod("DrawArrays");
240 bool drawPassed = false;
243 drawPassed = drawResult;
247 drawPassed = !drawResult;
250 bool keepUpdating = (application.GetUpdateStatus() != 0);
251 bool keepUpdatingPassed = false;
252 if( testKeepUpdating )
254 keepUpdatingPassed = keepUpdating;
258 keepUpdatingPassed = !keepUpdating;
261 bool result = (sigPassed && drawPassed && keepUpdatingPassed);
263 tet_printf("UpdateRender: Expected: Draw:%s Signal:%s KeepUpdating: %s Actual: Draw:%s Signal:%s KeepUpdating: %s %s, line %d\n",
264 BOOLSTR(testDrawn), BOOLSTR(testFinished), BOOLSTR(testKeepUpdating),
265 BOOLSTR(drawResult), BOOLSTR(finishedSig), BOOLSTR(keepUpdating),
266 result ? "Passed":"Failed",
272 } // unnamed namespace
275 /****************************************************************************************************/
276 /****************************************************************************************************/
277 /******************************** TEST CASES BELOW **********************************************/
278 /****************************************************************************************************/
279 /****************************************************************************************************/
281 int UtcDaliRenderTaskDownCast01(void)
283 TestApplication application;
285 tet_infoline("Testing RenderTask::DownCast()");
287 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
289 BaseHandle base = taskList.GetTask( 0u );
290 DALI_TEST_CHECK( base );
292 RenderTask task = RenderTask::DownCast( base );
293 DALI_TEST_CHECK( task );
295 // Try calling a method
296 DALI_TEST_CHECK( task.GetSourceActor() );
300 int UtcDaliRenderTaskDownCast02(void)
302 TestApplication application;
304 tet_infoline("Testing RenderTask::DownCast()");
306 Actor actor = Actor::New();
308 RenderTask task = RenderTask::DownCast( actor );
309 DALI_TEST_CHECK( ! task );
314 int UtcDaliRenderTaskSetSourceActorN(void)
316 TestApplication application;
317 tet_infoline("Testing RenderTask::SetSourceActor() Negative - try with empty actor handle");
318 Integration::Scene stage = application.GetScene();
322 RenderTaskList taskList = stage.GetRenderTaskList();
323 RenderTask renderTask = taskList.CreateTask();
324 renderTask.SetSourceActor(srcActor);
326 application.SendNotification();
327 application.Render();
329 DALI_TEST_CHECK( ! renderTask.GetSourceActor() );
334 int UtcDaliRenderTaskSetSourceActorP01(void)
336 TestApplication application;
338 tet_infoline("Testing RenderTask::SetSourceActor() Positive - check that setting a non-renderable actor stops existing source actor being rendered ");
340 Integration::Scene stage = application.GetScene();
341 RenderTaskList taskList = stage.GetRenderTaskList();
342 RenderTask task = taskList.GetTask( 0u );
344 Actor actor = task.GetSourceActor();
345 DALI_TEST_CHECK( actor );
347 Texture img = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
348 Actor newActor = CreateRenderableActor( img );
349 newActor.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
350 stage.Add( newActor );
352 Actor nonRenderableActor = Actor::New();
353 stage.Add( nonRenderableActor );
355 // Stop the newActor from being rendered by changing the source actor
356 DALI_TEST_CHECK( nonRenderableActor );
357 task.SetSourceActor( nonRenderableActor );
358 DALI_TEST_CHECK( task.GetSourceActor() != actor );
359 DALI_TEST_CHECK( task.GetSourceActor() == nonRenderableActor );
361 TestGlAbstraction& gl = application.GetGlAbstraction();
362 TraceCallStack& drawTrace = gl.GetDrawTrace();
363 drawTrace.Enable(true);
365 // Update & Render nothing!
366 application.GetGlAbstraction().ClearBoundTextures();
367 application.SendNotification();
368 application.Render();
370 // Check that nothing was rendered
371 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION );
377 int UtcDaliRenderTaskSetSourceActorP02(void)
379 TestApplication application;
381 tet_infoline("Testing RenderTask::SetSourceActor() Positive - check that switching source from a non-renderable to a renderable actor causes the texture to be drawn");
383 Integration::Scene stage = application.GetScene();
385 RenderTaskList taskList = stage.GetRenderTaskList();
387 RenderTask task = taskList.GetTask( 0u );
389 Actor actor = task.GetSourceActor();
390 DALI_TEST_CHECK( actor );
393 Texture img = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
394 Actor newActor = CreateRenderableActor( img );
395 newActor.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
396 stage.Add( newActor );
398 Actor nonRenderableActor = Actor::New();
399 stage.Add( nonRenderableActor );
401 TestGlAbstraction& gl = application.GetGlAbstraction();
402 TraceCallStack& drawTrace = gl.GetDrawTrace();
403 drawTrace.Enable(true);
405 // Stop the newActor from being rendered by changing the source actor
406 DALI_TEST_CHECK( nonRenderableActor );
407 task.SetSourceActor( nonRenderableActor );
408 DALI_TEST_CHECK( task.GetSourceActor() != actor );
409 DALI_TEST_CHECK( task.GetSourceActor() == nonRenderableActor );
411 // Update & Render nothing!
412 application.GetGlAbstraction().ClearBoundTextures();
413 application.SendNotification();
414 application.Render();
416 // Check that nothing was rendered
417 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION );
420 // Set newActor as the new source Actor
421 task.SetSourceActor( newActor );
422 DALI_TEST_CHECK( task.GetSourceActor() != actor );
423 DALI_TEST_CHECK( task.GetSourceActor() == newActor );
425 // Update & Render the newActor
426 application.GetGlAbstraction().ClearBoundTextures();
427 application.SendNotification();
428 application.Render();
430 // Check that the newActor was rendered
431 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 1, TEST_LOCATION );
435 int UtcDaliRenderTaskSetSourceActorOffStage(void)
437 TestApplication application;
439 tet_infoline("Testing RenderTask::SetSourceActor (on/off stage testing)");
441 Integration::Scene stage = application.GetScene();
442 RenderTaskList taskList = stage.GetRenderTaskList();
443 RenderTask task = taskList.GetTask( 0u );
445 Actor actor = task.GetSourceActor();
446 DALI_TEST_CHECK( actor );
448 TestGlAbstraction& gl = application.GetGlAbstraction();
449 TraceCallStack& drawTrace = gl.GetDrawTrace();
450 drawTrace.Enable(true);
452 Texture img = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
453 Actor newActor = CreateRenderableActor( img );
454 newActor.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
455 task.SetSourceActor( newActor );
456 // Don't add newActor to stage yet //'
458 // Update & Render with the actor initially off-stage
459 application.SendNotification();
460 application.Render();
462 // Check that nothing was rendered
463 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION );
466 stage.Add( newActor );
468 // Update & Render with the actor on-stage
469 application.GetGlAbstraction().ClearBoundTextures();
470 application.SendNotification();
471 application.Render();
473 // Check that the newActor was rendered
474 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 1, TEST_LOCATION );
477 // Now remove from stage
478 stage.Remove( newActor );
480 // Update & Render with the actor off-stage
481 application.SendNotification();
482 application.Render();
483 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION );
488 int UtcDaliRenderTaskSetSourceActorEmpty(void)
490 TestApplication application;
492 tet_infoline("Testing RenderTask::SetSourceActor (empty handle case)");
494 Integration::Scene stage = application.GetScene();
495 RenderTaskList taskList = stage.GetRenderTaskList();
496 RenderTask task = taskList.GetTask( 0u );
498 Actor actor = task.GetSourceActor();
499 DALI_TEST_CHECK( actor );
501 Texture img = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
502 Actor newActor = CreateRenderableActor( img );
503 newActor.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
504 stage.Add( newActor );
506 Actor nonRenderableActor = Actor::New();
507 stage.Add( nonRenderableActor );
509 // Set with empty handle
510 task.SetSourceActor( Actor() );
511 DALI_TEST_CHECK( ! task.GetSourceActor() );
513 TestGlAbstraction& gl = application.GetGlAbstraction();
514 TraceCallStack& drawTrace = gl.GetDrawTrace();
515 drawTrace.Enable(true);
517 // Update & Render nothing!
518 application.SendNotification();
519 application.Render();
521 // Check that nothing was rendered
522 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION );
524 // Set with non-empty handle
525 task.SetSourceActor( newActor );
526 DALI_TEST_CHECK( task.GetSourceActor() == newActor );
528 // Update & Render the newActor
529 application.GetGlAbstraction().ClearBoundTextures();
530 application.SendNotification();
531 application.Render();
533 // Check that the newActor was rendered
534 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 1, TEST_LOCATION );
538 int UtcDaliRenderTaskSetSourceActorDestroyed(void)
540 TestApplication application;
542 tet_infoline( "Testing RenderTask::SetSourceActor - Set a source actor and destroy the source actor" );
544 Integration::Scene stage = application.GetScene();
545 RenderTaskList taskList = stage.GetRenderTaskList();
546 RenderTask task = taskList.GetTask( 0u );
548 Actor actor = task.GetSourceActor();
549 DALI_TEST_CHECK( actor );
551 Texture img = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
553 Actor newActor = CreateRenderableActor( img );
554 newActor.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
555 stage.Add( newActor );
557 task.SetSourceActor( newActor );
559 DALI_TEST_CHECK( task.GetSourceActor() != actor );
560 DALI_TEST_CHECK( task.GetSourceActor() == newActor );
562 application.SendNotification();
563 application.Render();
565 // Destroy the source actor
566 stage.Remove( newActor );
569 DALI_TEST_CHECK( !task.GetSourceActor() ); // The source actor should be an empty handle.
574 int UtcDaliRenderTaskGetSourceActorP01(void)
576 TestApplication application;
578 tet_infoline("Testing RenderTask::GetSourceActor() Check the default render task has a valid source actor");
580 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
582 RenderTask task = taskList.GetTask( 0u );
584 Actor actor = task.GetSourceActor();
585 DALI_TEST_CHECK( actor );
587 // By default the entire scene should be rendered
588 Actor root = application.GetScene().GetLayer( 0 );
589 DALI_TEST_CHECK( root == actor );
593 int UtcDaliRenderTaskGetSourceActorP02(void)
595 TestApplication application;
597 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.");
599 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
600 RenderTask task = taskList.CreateTask();
601 Actor actor = Actor::New();
602 application.GetScene().Add(actor);
603 task.SetSourceActor( actor );
605 DALI_TEST_EQUALS( actor, task.GetSourceActor(), TEST_LOCATION );
610 int UtcDaliRenderTaskGetSourceActorN(void)
612 TestApplication application;
614 tet_infoline("Testing RenderTask::GetSourceActor() Try with empty handle");
619 Actor actor = task.GetSourceActor();
621 catch (Dali::DaliException& e)
623 DALI_TEST_PRINT_ASSERT( e );
624 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
630 int UtcDaliRenderTaskSetExclusive(void)
632 TestApplication application;
634 tet_infoline("Testing RenderTask::SetExclusive() Check that exclusion works");
636 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
638 // Manipulate the GenTextures behaviour, to identify different actors
640 std::vector<GLuint> ids;
641 ids.push_back( 8 ); // 8 = actor1
642 ids.push_back( 9 ); // 9 = actor2
643 ids.push_back( 10 ); // 10 = actor3
644 application.GetGlAbstraction().SetNextTextureIds( ids );
646 Texture img1 = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
647 Actor actor1 = CreateRenderableActor( img1 );
648 actor1.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
649 application.GetScene().Add( actor1 );
651 // Update & Render actor1
652 application.SendNotification();
653 application.Render();
655 // Check that the actor1 was rendered
656 const std::vector<GLuint>& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 );
657 DALI_TEST_GREATER( boundTextures.size(), static_cast<std::vector<GLuint>::size_type>( 0 ), TEST_LOCATION );
659 if ( boundTextures.size() )
662 DALI_TEST_EQUALS( boundTextures[c++], 8u/*unique to actor1*/, TEST_LOCATION );
663 if( boundTextures.size() > 1 )
665 DALI_TEST_EQUALS( boundTextures[c++], 8u/*unique to actor1*/, TEST_LOCATION );
669 Texture img2 = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
671 Actor actor2 = CreateRenderableActor( img2 );
672 actor2.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
674 // Force actor2 to be rendered before actor1
675 Layer layer = Layer::New();
676 application.GetScene().Add( layer );
678 layer.LowerToBottom();
681 application.GetGlAbstraction().ClearBoundTextures();
682 application.SendNotification();
683 application.Render();
685 // Check that the actors were rendered
686 DALI_TEST_GREATER( boundTextures.size(), static_cast<std::vector<GLuint>::size_type>( 1 ), TEST_LOCATION );
688 if ( boundTextures.size() )
691 DALI_TEST_EQUALS( boundTextures[c++], 9u/*unique to actor2*/, TEST_LOCATION );
692 if( boundTextures.size() > 2 )
694 DALI_TEST_EQUALS( boundTextures[c++], 9u/*unique to actor1*/, TEST_LOCATION );
696 DALI_TEST_EQUALS( boundTextures[c++], 8u/*unique to actor1*/, TEST_LOCATION );
699 Texture img3 = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
700 Actor actor3 = CreateRenderableActor( img3 );
701 actor3.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
703 // Force actor3 to be rendered before actor2
704 layer = Layer::New();
705 application.GetScene().Add( layer );
707 layer.LowerToBottom();
709 // Update & Render all actors
710 application.GetGlAbstraction().ClearBoundTextures();
711 application.SendNotification();
712 application.Render();
714 // Check that the actors were rendered
715 DALI_TEST_GREATER( boundTextures.size(), static_cast<std::vector<GLuint>::size_type>( 2 ), TEST_LOCATION );
717 if ( boundTextures.size() )
720 DALI_TEST_EQUALS( boundTextures[c++], 10u/*unique to actor3*/, TEST_LOCATION );
721 if( boundTextures.size() > 3 )
723 DALI_TEST_EQUALS( boundTextures[c++], 10u/*unique to actor2*/, TEST_LOCATION );
725 DALI_TEST_EQUALS( boundTextures[c++], 9u/*unique to actor2*/, TEST_LOCATION );
726 DALI_TEST_EQUALS( boundTextures[c++], 8u/*unique to actor1*/, TEST_LOCATION );
729 // Both actors are now connected to the root node
730 // Setup 2 render-tasks - the first will render from the root-node, and the second from actor2
732 // Not exclusive is the default
733 RenderTask task1 = taskList.GetTask( 0u );
734 DALI_TEST_CHECK( false == task1.IsExclusive() );
736 RenderTask task2 = taskList.CreateTask();
737 DALI_TEST_CHECK( false == task2.IsExclusive() );
738 task2.SetSourceActor( actor2 );
740 // Task1 should render all actors, and task 2 should render only actor2
742 application.GetGlAbstraction().ClearBoundTextures();
743 application.SendNotification();
744 application.Render();
746 DALI_TEST_EQUALS( boundTextures.size(), 4u, TEST_LOCATION );
748 if ( boundTextures.size() == 4 )
750 // Test that task 1 renders actor3, then actor2 & then actor1
751 DALI_TEST_CHECK( boundTextures[0] == 10u );
752 DALI_TEST_CHECK( boundTextures[1] == 9u );
753 DALI_TEST_CHECK( boundTextures[2] == 8u );
755 // Test that task 2 renders actor2
756 DALI_TEST_EQUALS( boundTextures[3], 9u, TEST_LOCATION );
759 // Make actor2 exclusive to task2
761 task2.SetExclusive( true );
762 DALI_TEST_CHECK( true == task2.IsExclusive() );
764 // Task1 should render only actor1, and task 2 should render only actor2
766 application.GetGlAbstraction().ClearBoundTextures();
767 application.SendNotification();
768 application.Render();
770 DALI_TEST_EQUALS( boundTextures.size(), 3u, TEST_LOCATION );
771 if ( boundTextures.size() == 3 )
773 // Test that task 1 renders actor3 & actor1
774 DALI_TEST_CHECK( boundTextures[0] == 10u );
775 DALI_TEST_CHECK( boundTextures[1] == 8u );
777 // Test that task 2 renders actor2
778 DALI_TEST_CHECK( boundTextures[2] == 9u );
781 // Create a renderable actor and replace the source actor in task2
782 auto actor4 = CreateRenderableActor();
783 task2.SetSourceActor( actor3 );
784 DALI_TEST_EQUALS( actor3, task2.GetSourceActor(), TEST_LOCATION );
789 int UtcDaliRenderTaskSetExclusive02(void)
791 TestApplication application;
793 tet_infoline("Testing RenderTask::SetExclusive() Check that changing from exclusive to not-exclusive works");
795 std::vector<GLuint> ids;
796 ids.push_back( 8 ); // 8 = actor1
797 application.GetGlAbstraction().SetNextTextureIds( ids );
799 Texture img1 = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
800 Actor actor1 = CreateRenderableActor( img1 );
801 actor1.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
802 application.GetScene().Add( actor1 );
804 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
805 RenderTask task = taskList.CreateTask();
807 task.SetSourceActor( actor1 );
808 task.SetExclusive(true); // Actor should only render once
810 TestGlAbstraction& gl = application.GetGlAbstraction();
811 TraceCallStack& drawTrace = gl.GetDrawTrace();
812 drawTrace.Enable(true);
814 // Update & Render actor1
815 application.SendNotification();
816 application.Render();
818 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 1, TEST_LOCATION );
820 // Set task to non-exclusive - actor1 should render twice:
822 task.SetExclusive(false);
823 application.SendNotification();
824 application.Render();
826 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 2, TEST_LOCATION );
831 int UtcDaliRenderTaskSetExclusiveN(void)
833 TestApplication application;
835 tet_infoline("Testing RenderTask::SetExclusive() on empty handle");
840 task.SetExclusive(true);
842 catch (Dali::DaliException& e)
844 DALI_TEST_PRINT_ASSERT( e );
845 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
850 int UtcDaliRenderTaskIsExclusive01(void)
852 TestApplication application;
854 tet_infoline("Testing RenderTask::IsExclusive() Check default values are non-exclusive");
856 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
858 // Not exclusive is the default
859 RenderTask task = taskList.GetTask( 0u );
860 DALI_TEST_CHECK( false == task.IsExclusive() );
862 RenderTask newTask = taskList.CreateTask();
863 DALI_TEST_CHECK( false == newTask.IsExclusive() );
868 int UtcDaliRenderTaskIsExclusive02(void)
870 TestApplication application;
872 tet_infoline("Testing RenderTask::IsExclusive() Check the getter returns set values");
874 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
876 // Not exclusive is the default
877 RenderTask newTask = taskList.CreateTask();
878 DALI_TEST_EQUALS( newTask.IsExclusive(), false, TEST_LOCATION );
880 newTask.SetExclusive(true);
881 DALI_TEST_EQUALS( newTask.IsExclusive(), true, TEST_LOCATION );
885 int UtcDaliRenderTaskIsExclusiveN(void)
887 TestApplication application;
889 tet_infoline("Testing RenderTask::IsExclusive() on empty handle");
894 bool x = task.IsExclusive();
897 catch (Dali::DaliException& e)
899 DALI_TEST_PRINT_ASSERT( e );
900 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
905 int UtcDaliRenderTaskSetInputEnabled(void)
907 TestApplication application;
909 tet_infoline("Testing RenderTask::SetInputEnabled()");
911 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
913 // Input is enabled by default
914 RenderTask task = taskList.GetTask( 0u );
915 DALI_TEST_CHECK( true == task.GetInputEnabled() );
917 task.SetInputEnabled( false );
918 DALI_TEST_CHECK( false == task.GetInputEnabled() );
920 task.SetInputEnabled( true );
921 DALI_TEST_CHECK( true == task.GetInputEnabled() );
925 int UtcDaliRenderTaskGetInputEnabled(void)
927 TestApplication application;
929 tet_infoline("Testing RenderTask::GetInputEnabled()");
931 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
933 // Input is enabled by default
934 RenderTask task = taskList.GetTask( 0u );
935 DALI_TEST_EQUALS( true, task.GetInputEnabled(), TEST_LOCATION );
937 RenderTask newTask = taskList.CreateTask();
938 DALI_TEST_EQUALS( true, newTask.GetInputEnabled(), TEST_LOCATION );
940 newTask.SetInputEnabled(false);
941 DALI_TEST_EQUALS( false, newTask.GetInputEnabled(), TEST_LOCATION );
946 int UtcDaliRenderTaskSetCameraActorP(void)
948 TestApplication application;
950 tet_infoline("Testing RenderTask::SetCameraActor()");
952 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
954 RenderTask task = taskList.GetTask( 0u );
956 Actor defaultCameraActor = task.GetCameraActor();
957 DALI_TEST_CHECK( defaultCameraActor );
959 CameraActor newCameraActor = CameraActor::New();
960 DALI_TEST_CHECK( newCameraActor );
962 task.SetCameraActor( newCameraActor );
963 DALI_TEST_CHECK( task.GetCameraActor() != defaultCameraActor );
964 DALI_TEST_EQUALS( task.GetCameraActor(), newCameraActor, TEST_LOCATION );
969 int UtcDaliRenderTaskSetCameraActorN(void)
971 TestApplication application;
973 tet_infoline("Testing RenderTask::SetCameraActor() with empty actor handle");
975 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
977 RenderTask task = taskList.GetTask( 0u );
979 Actor actor = task.GetCameraActor();
980 DALI_TEST_CHECK( actor );
982 CameraActor cameraActor;
984 task.SetCameraActor( cameraActor );
985 DALI_TEST_EQUALS( (bool)task.GetCameraActor(), false, TEST_LOCATION );
986 DALI_TEST_EQUALS( task.GetCameraActor(), cameraActor, TEST_LOCATION );
990 int UtcDaliRenderTaskSetCameraActorDestroyed(void)
992 TestApplication application;
994 tet_infoline( "Testing RenderTask::SetCameraActor - Set a camera actor and destroy the camera actor" );
996 Integration::Scene stage = application.GetScene();
997 RenderTaskList taskList = stage.GetRenderTaskList();
998 RenderTask task = taskList.GetTask( 0u );
1000 CameraActor newCameraActor = CameraActor::New();
1001 task.SetCameraActor( newCameraActor );
1003 DALI_TEST_EQUALS( task.GetCameraActor(), newCameraActor, TEST_LOCATION );
1005 // Destroy the camera actor
1006 newCameraActor.Reset();
1008 CameraActor camera = task.GetCameraActor();
1009 DALI_TEST_CHECK( !camera ); // The camera actor should be an empty handle.
1014 int UtcDaliRenderTaskGetCameraActorP(void)
1016 TestApplication application;
1018 tet_infoline("Testing RenderTask::GetCameraActor()");
1020 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1022 RenderTask task = taskList.GetTask( 0u );
1024 CameraActor actor = task.GetCameraActor();
1025 DALI_TEST_CHECK( actor );
1026 DALI_TEST_EQUALS( actor.GetProjectionMode(), Dali::Camera::PERSPECTIVE_PROJECTION, TEST_LOCATION );
1027 DALI_TEST_GREATER( actor.GetFieldOfView(), 0.0f, TEST_LOCATION );
1031 int UtcDaliRenderTaskGetCameraActorN(void)
1033 TestApplication application;
1035 tet_infoline("Testing RenderTask::GetCameraActor() with empty handle");
1040 Actor actor = task.GetCameraActor();
1042 catch (Dali::DaliException& e)
1044 DALI_TEST_PRINT_ASSERT( e );
1045 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1051 int UtcDaliRenderTaskSetFrameBufferP(void)
1053 TestApplication application;
1055 tet_infoline("Testing RenderTask::SetFrameBuffer()");
1057 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1059 RenderTask task = taskList.GetTask( 0u );
1061 FrameBuffer newFrameBuffer = FrameBuffer::New( 128u, 128u, FrameBuffer::Attachment::NONE );
1062 task.SetFrameBuffer( newFrameBuffer );
1063 DALI_TEST_CHECK( task.GetFrameBuffer() == newFrameBuffer );
1067 int UtcDaliRenderTaskSetFrameBufferN(void)
1069 TestApplication application;
1071 tet_infoline("Testing RenderTask::SetFrameBuffer()");
1073 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1075 RenderTask task = taskList.GetTask( 0u );
1076 FrameBuffer newFrameBuffer; // Empty handle
1077 task.SetFrameBuffer( newFrameBuffer );
1078 DALI_TEST_EQUALS( (bool)task.GetFrameBuffer(), false, TEST_LOCATION );
1082 int UtcDaliRenderTaskGetFrameBufferP(void)
1084 TestApplication application;
1086 tet_infoline("Testing RenderTask::GetFrameBuffer()");
1088 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1090 RenderTask task = taskList.GetTask( 0u );
1092 FrameBuffer newFrameBuffer = FrameBuffer::New( 1u, 1u, FrameBuffer::Attachment::NONE );
1093 task.SetFrameBuffer( newFrameBuffer );
1094 DALI_TEST_CHECK( task.GetFrameBuffer() == newFrameBuffer );
1098 int UtcDaliRenderTaskGetFrameBufferN(void)
1100 TestApplication application;
1102 tet_infoline("Testing RenderTask::GetFrameBuffer()");
1104 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1106 RenderTask task = taskList.GetTask( 0u );
1108 // By default render-tasks do not render off-screen
1109 FrameBuffer frameBuffer = task.GetFrameBuffer();
1110 DALI_TEST_CHECK( !frameBuffer );
1115 int UtcDaliRenderTaskSetScreenToFrameBufferFunctionP(void)
1117 TestApplication application;
1119 tet_infoline("Testing RenderTask::SetScreenToFrameBufferFunction()");
1121 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1123 RenderTask task = taskList.GetTask( 0u );
1125 task.SetScreenToFrameBufferFunction( TestScreenToFrameBufferFunction );
1127 Vector2 coordinates( 5, 10 );
1128 Vector2 convertedCoordinates( 6, 12 ); // + Vector(1, 2)
1130 RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction();
1131 DALI_TEST_CHECK( func( coordinates ) );
1132 DALI_TEST_CHECK( coordinates == convertedCoordinates );
1134 task.SetScreenToFrameBufferFunction( RenderTask::FULLSCREEN_FRAMEBUFFER_FUNCTION );
1135 func = task.GetScreenToFrameBufferFunction();
1136 DALI_TEST_CHECK( func( coordinates ) );
1138 task.SetScreenToFrameBufferFunction( RenderTask::DEFAULT_SCREEN_TO_FRAMEBUFFER_FUNCTION );
1139 func = task.GetScreenToFrameBufferFunction();
1140 DALI_TEST_CHECK( ! func( coordinates ) );
1144 int UtcDaliRenderTaskSetScreenToFrameBufferFunctionN(void)
1146 TestApplication application;
1148 tet_infoline("Testing RenderTask::SetScreenToFrameBufferFunction()");
1150 RenderTask task; // Empty handle
1153 task.SetScreenToFrameBufferFunction( TestScreenToFrameBufferFunction );
1155 catch (Dali::DaliException& e)
1157 DALI_TEST_PRINT_ASSERT( e );
1158 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1163 int UtcDaliRenderTaskGetScreenToFrameBufferFunctionP(void)
1165 TestApplication application;
1167 tet_infoline("Testing RenderTask::GetScreenToFrameBufferFunction()");
1169 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1171 RenderTask task = taskList.GetTask( 0u );
1173 Vector2 originalCoordinates( 5, 10 );
1174 Vector2 coordinates( 5, 10 );
1176 RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction();
1177 DALI_TEST_CHECK( !func( coordinates ) ); // conversion should fail by default
1178 DALI_TEST_CHECK( coordinates == originalCoordinates ); // coordinates should not be modified
1182 int UtcDaliRenderTaskGetScreenToFrameBufferFunctionN(void)
1184 TestApplication application;
1186 tet_infoline("Testing RenderTask::GetScreenToFrameBufferFunction() on empty handle");
1191 RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction();
1194 catch (Dali::DaliException& e)
1196 DALI_TEST_PRINT_ASSERT( e );
1197 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1203 int UtcDaliRenderTaskGetScreenToFrameBufferMappingActorP(void)
1205 TestApplication application;
1206 tet_infoline("Testing RenderTask::GetScreenToFrameBufferMappingActor ");
1208 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1209 RenderTask renderTask = taskList.CreateTask();
1210 Actor mappingActor = Actor::New();
1211 renderTask.SetScreenToFrameBufferMappingActor(mappingActor);
1213 DALI_TEST_EQUALS( mappingActor, renderTask.GetScreenToFrameBufferMappingActor(), TEST_LOCATION );
1218 int UtcDaliRenderTaskGetScreenToFrameBufferMappingActorN(void)
1220 TestApplication application;
1221 tet_infoline("Testing RenderTask::GetScreenToFrameBufferMappingActor with empty task handle");
1227 task.SetScreenToFrameBufferMappingActor(mappingActor);
1229 catch (Dali::DaliException& e)
1231 DALI_TEST_PRINT_ASSERT( e );
1232 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1237 int UtcDaliRenderTaskGetScreenToFrameBufferMappingActor02N(void)
1239 TestApplication application;
1240 tet_infoline("Testing RenderTask::GetScreenToFrameBufferMappingActor with empty task handle");
1242 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1243 RenderTask renderTask = taskList.CreateTask();
1245 renderTask.SetScreenToFrameBufferMappingActor(actor);
1247 DALI_TEST_EQUALS( (bool)renderTask.GetScreenToFrameBufferMappingActor(), false, TEST_LOCATION);
1251 int UtcDaliRenderTaskGetViewportP01(void)
1253 TestApplication application;
1255 tet_infoline("Testing RenderTask::GetViewport() on default task");
1257 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1258 RenderTask task = taskList.GetTask( 0u );
1259 Viewport viewport = task.GetViewport();
1261 // By default the viewport should match the stage width/height
1262 Vector2 stageSize = application.GetScene().GetSize();
1263 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
1264 DALI_TEST_CHECK( viewport == expectedViewport );
1268 int UtcDaliRenderTaskGetViewportP02(void)
1270 TestApplication application;
1272 tet_infoline("Testing RenderTask::GetViewport() on new task");
1274 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1275 RenderTask task = taskList.CreateTask();
1276 Viewport viewport = task.GetViewport();
1278 // By default the viewport should match the stage width/height
1279 Vector2 stageSize = application.GetScene().GetSize();
1280 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
1281 DALI_TEST_CHECK( viewport == expectedViewport );
1285 int UtcDaliRenderTaskGetViewportN(void)
1287 TestApplication application;
1289 tet_infoline("Testing RenderTask::GetViewport() on empty handle");
1294 Viewport viewport = task.GetViewport();
1297 catch (Dali::DaliException& e)
1299 DALI_TEST_PRINT_ASSERT( e );
1300 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1306 int UtcDaliRenderTaskSetViewportP(void)
1308 TestApplication application;
1310 tet_infoline("Testing RenderTask::SetViewport()");
1312 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1314 RenderTask task = taskList.GetTask( 0u );
1315 Vector2 stageSize = application.GetScene().GetSize();
1316 Viewport newViewport( 0, 0, stageSize.width * 0.5f, stageSize.height * 0.5f );
1317 task.SetViewport( newViewport );
1319 // Update (viewport is a property)
1320 application.SendNotification();
1321 application.Render();
1323 DALI_TEST_CHECK( task.GetViewport() == newViewport );
1327 int UtcDaliRenderTaskSetViewportN(void)
1329 TestApplication application;
1331 tet_infoline("Testing RenderTask::SetViewport()");
1333 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1338 Vector2 stageSize = application.GetScene().GetSize();
1339 Viewport newViewport( 0, 0, stageSize.width * 0.5f, stageSize.height * 0.5f );
1340 task.SetViewport( newViewport );
1342 catch (Dali::DaliException& e)
1344 DALI_TEST_PRINT_ASSERT( e );
1345 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1352 int UtcDaliRenderTaskSetViewportPosition(void)
1354 TestApplication application;
1356 tet_infoline("Testing RenderTask::SetViewportPosition()");
1358 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1360 RenderTask task = taskList.GetTask( 0u );
1362 Viewport viewport = task.GetViewport();
1364 // By default the viewport should match the stage width/height
1366 Vector2 stageSize = application.GetScene().GetSize();
1367 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
1368 DALI_TEST_CHECK( viewport == expectedViewport );
1371 Vector2 newPosition(25.0f, 50.0f);
1372 task.SetViewportPosition( newPosition );
1374 // Update (viewport is a property)
1375 application.SendNotification();
1376 application.Render();
1378 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1380 // Set by Property test
1381 Vector2 newPosition2(32.0f, 32.0f);
1382 task.SetProperty( RenderTask::Property::VIEWPORT_POSITION, newPosition2 );
1383 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition2, TEST_LOCATION );
1384 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition, TEST_LOCATION ); // still the old position
1387 application.SendNotification();
1388 application.Render();
1390 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition2, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1391 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition2, TEST_LOCATION );
1392 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition2, TEST_LOCATION );
1394 Vector2 newPosition3(64.0f, 0.0f);
1395 Animation animation = Animation::New(1.0f);
1396 animation.AnimateTo( Property( task, RenderTask::Property::VIEWPORT_POSITION ), newPosition3, AlphaFunction::LINEAR );
1399 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1400 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition2, TEST_LOCATION );
1402 // Perform 1000ms worth of updates at which point animation should have completed.
1403 Wait(application, 1000);
1404 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1405 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1406 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1408 // Create another animation which animates by a certain value
1409 const Vector2 newPosition4( 75.0f, 45.0f );
1410 const Vector2 relativePosition( newPosition4 - newPosition3 );
1411 animation = Animation::New( 1.0f );
1412 animation.AnimateBy( Property( task, RenderTask::Property::VIEWPORT_POSITION ), relativePosition );
1415 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1416 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition3, TEST_LOCATION );
1418 // Perform 1000ms worth of updates at which point animation should have completed.
1419 Wait(application, 1000);
1420 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1421 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1422 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1427 int UtcDaliRenderTaskSetViewportSize(void)
1429 TestApplication application;
1431 tet_infoline("Testing RenderTask::SetViewportSize()");
1433 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1435 RenderTask task = taskList.GetTask( 0u );
1437 Viewport viewport = task.GetViewport();
1439 // By default the viewport should match the stage width/height
1441 Vector2 stageSize = application.GetScene().GetSize();
1442 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
1443 DALI_TEST_CHECK( viewport == expectedViewport );
1445 Vector2 newSize(128.0f, 64.0f);
1446 task.SetViewportSize( newSize );
1448 // Update (viewport is a property)
1449 application.SendNotification();
1450 application.Render();
1452 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1454 // Set by Property test
1455 Vector2 newSize2(50.0f, 50.0f);
1456 task.SetProperty( RenderTask::Property::VIEWPORT_SIZE, newSize2 );
1457 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize2, TEST_LOCATION );
1458 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize, TEST_LOCATION ); // still the old position
1461 application.SendNotification();
1462 application.Render();
1464 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize2, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1465 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize2, TEST_LOCATION );
1466 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize2, TEST_LOCATION );
1468 Vector2 newSize3(10.0f, 10.0f);
1469 Animation animation = Animation::New(1.0f);
1470 animation.AnimateTo( Property( task, RenderTask::Property::VIEWPORT_SIZE ), newSize3, AlphaFunction::LINEAR );
1473 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1474 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize2, TEST_LOCATION );
1476 // Perform 1000ms worth of updates at which point animation should have completed.
1477 Wait(application, 1000);
1478 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1479 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1480 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1482 // Create another animation which animates by a certain value
1483 const Vector2 newSize4( 75.0f, 45.0f );
1484 const Vector2 relativeSize( newSize4 - newSize3 );
1485 animation = Animation::New( 1.0f );
1486 animation.AnimateBy( Property( task, RenderTask::Property::VIEWPORT_SIZE ), relativeSize );
1489 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1490 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize3, TEST_LOCATION );
1492 // Perform 1000ms worth of updates at which point animation should have completed.
1493 Wait(application, 1000);
1494 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1495 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1496 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1501 int UtcDaliRenderTaskSetClearColorP(void)
1503 TestApplication application;
1505 tet_infoline("Testing RenderTask::SetClearColor()");
1507 Vector4 testColor( 1.0f, 2.0f, 3.0f, 4.0f );
1508 Vector4 testColor2( 5.0f, 6.0f, 7.0f, 8.0f );
1510 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1512 RenderTask task = taskList.GetTask( 0u );
1513 DALI_TEST_CHECK( task.GetClearColor() != testColor );
1515 task.SetClearColor( testColor );
1520 DALI_TEST_EQUALS( task.GetClearColor(), testColor, TEST_LOCATION );
1522 task.SetProperty( RenderTask::Property::CLEAR_COLOR, testColor2 );
1523 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor2, TEST_LOCATION );
1524 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor, TEST_LOCATION ); // still the old color
1529 DALI_TEST_EQUALS( task.GetClearColor(), testColor2, TEST_LOCATION );
1530 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor2, TEST_LOCATION );
1531 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor2, TEST_LOCATION );
1533 Vector4 newColor3(10.0f, 10.0f, 20.0f, 30.0f);
1534 Animation animation = Animation::New(1.0f);
1535 animation.AnimateTo( Property( task, RenderTask::Property::CLEAR_COLOR ), newColor3, AlphaFunction::LINEAR );
1538 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1539 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor2, TEST_LOCATION );
1541 // Perform 1000ms worth of updates at which point animation should have completed.
1542 Wait(application, 1000);
1543 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1544 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1546 // Create another animation which animates by a certain value
1547 const Vector4 newColor4( 0.45f, 0.35f, 0.25f, 0.1f );
1548 const Vector4 relativeColor( newColor4 - newColor3 );
1549 animation = Animation::New( 1.0f );
1550 animation.AnimateBy( Property( task, RenderTask::Property::CLEAR_COLOR ), relativeColor );
1553 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor4, Math::MACHINE_EPSILON_10, TEST_LOCATION );
1554 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor3, Math::MACHINE_EPSILON_10, TEST_LOCATION );
1556 // Perform 1000ms worth of updates at which point animation should have completed.
1557 Wait(application, 1000);
1558 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor4, Math::MACHINE_EPSILON_10, TEST_LOCATION );
1559 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor4, Math::MACHINE_EPSILON_10, TEST_LOCATION );
1564 int UtcDaliRenderTaskSetClearColorN(void)
1566 TestApplication application;
1568 tet_infoline("Testing RenderTask::SetClearColor() on empty handle");
1573 task.SetClearColor( Vector4::ZERO );
1575 catch (Dali::DaliException& e)
1577 DALI_TEST_PRINT_ASSERT( e );
1578 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1583 int UtcDaliRenderTaskGetClearColorP(void)
1585 TestApplication application;
1587 tet_infoline("Testing RenderTask::GetClearColor()");
1589 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1590 RenderTask task = taskList.GetTask( 0u );
1591 DALI_TEST_EQUALS( task.GetClearColor(), RenderTask::DEFAULT_CLEAR_COLOR, TEST_LOCATION );
1595 int UtcDaliRenderTaskGetClearColorN(void)
1597 TestApplication application;
1599 tet_infoline("Testing RenderTask::GetClearColor()");
1604 Vector4 color = task.GetClearColor();
1607 catch (Dali::DaliException& e)
1609 DALI_TEST_PRINT_ASSERT( e );
1610 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1615 int UtcDaliRenderTaskSetClearEnabledP(void)
1617 TestApplication application;
1619 tet_infoline("Testing RenderTask::SetClearEnabled()");
1621 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1623 RenderTask task = taskList.GetTask( 0u );
1624 DALI_TEST_CHECK( task.GetClearEnabled() ); // defaults to true
1626 task.SetClearEnabled( false );
1627 DALI_TEST_EQUALS( task.GetClearEnabled(), false, TEST_LOCATION );
1629 task.SetClearEnabled( true );
1630 DALI_TEST_EQUALS( task.GetClearEnabled(), true, TEST_LOCATION );
1634 int UtcDaliRenderTaskSetClearEnabledN(void)
1636 TestApplication application;
1638 tet_infoline("Testing RenderTask::SetClearEnabled() with empty handle");
1643 task.SetClearEnabled(true);
1645 catch (Dali::DaliException& e)
1647 DALI_TEST_PRINT_ASSERT( e );
1648 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1653 int UtcDaliRenderTaskGetClearEnabledP(void)
1655 TestApplication application;
1657 tet_infoline("Testing RenderTask::GetClearEnabled()");
1659 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1661 RenderTask task = taskList.GetTask( 0u );
1662 DALI_TEST_CHECK( task.GetClearEnabled() ); // defaults to true
1667 int UtcDaliRenderTaskGetClearEnabledN(void)
1669 TestApplication application;
1671 tet_infoline("Testing RenderTask::GetClearEnabled() with empty handle");
1676 bool x = task.GetClearEnabled();
1679 catch (Dali::DaliException& e)
1681 DALI_TEST_PRINT_ASSERT( e );
1682 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1687 int UtcDaliRenderTaskSetCullModeP(void)
1689 TestApplication application;
1691 tet_infoline("Testing RenderTask::SetCullMode()");
1693 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1694 RenderTask task = taskList.GetTask( 0u );
1695 DALI_TEST_EQUALS( task.GetCullMode(), true, TEST_LOCATION );
1697 task.SetCullMode( false );
1699 DALI_TEST_EQUALS( task.GetCullMode(), false, TEST_LOCATION );
1704 int UtcDaliRenderTaskSetCullModeN(void)
1706 TestApplication application;
1708 tet_infoline("Testing RenderTask::SetCullMode() on empty handle");
1713 task.SetCullMode( false );
1715 catch (Dali::DaliException& e)
1717 DALI_TEST_PRINT_ASSERT( e );
1718 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1723 int UtcDaliRenderTaskGetCullModeP(void)
1725 TestApplication application;
1727 tet_infoline("Testing RenderTask::GetCullMode()");
1729 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1730 RenderTask task = taskList.GetTask( 0u );
1731 DALI_TEST_EQUALS( task.GetCullMode(), true, TEST_LOCATION );
1735 int UtcDaliRenderTaskGetCullModeN(void)
1737 TestApplication application;
1739 tet_infoline("Testing RenderTask::GetCullMode() with empty handle");
1744 bool x = task.GetCullMode();
1747 catch (Dali::DaliException& e)
1749 DALI_TEST_PRINT_ASSERT( e );
1750 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1756 int UtcDaliRenderTaskSetRefreshRate(void)
1758 TestApplication application;
1760 tet_infoline("Testing RenderTask::SetRefreshRate()");
1762 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1764 // By default tasks will be processed every frame
1765 RenderTask task = taskList.GetTask( 0u );
1766 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
1768 task.SetRefreshRate( 2u ); // every-other frame
1769 DALI_TEST_CHECK( 2u == task.GetRefreshRate() );
1771 task.SetRefreshRate( RenderTask::REFRESH_ALWAYS );
1772 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
1776 int UtcDaliRenderTaskGetRefreshRate(void)
1778 TestApplication application;
1780 tet_infoline("Testing RenderTask::GetRefreshRate()");
1782 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1784 // By default tasks will be processed every frame
1785 RenderTask task = taskList.GetTask( 0u );
1786 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
1788 RenderTask newTask = taskList.CreateTask();
1789 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == newTask.GetRefreshRate() );
1793 int UtcDaliRenderTaskSignalFinished(void)
1795 TestApplication application;
1797 tet_infoline("Testing RenderTask::SignalFinished()");
1799 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1800 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1802 CameraActor offscreenCameraActor = CameraActor::New();
1804 application.GetScene().Add( offscreenCameraActor );
1806 Texture image = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 10, 10 );
1807 Actor rootActor = CreateRenderableActor( image );
1808 rootActor.SetProperty( Actor::Property::SIZE, Vector2( 10.0f, 10.0f ) );
1809 application.GetScene().Add( rootActor );
1811 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
1812 NativeImageInterfacePtr testNativeImagePtr = TestNativeImage::New(10, 10);
1813 Texture frameBufferTexture = Texture::New( *testNativeImagePtr );
1814 FrameBuffer frameBuffer = FrameBuffer::New(frameBufferTexture.GetWidth(),frameBufferTexture.GetHeight());
1815 frameBuffer.AttachColorTexture(frameBufferTexture);
1817 RenderTask newTask = taskList.CreateTask();
1818 newTask.SetCameraActor( offscreenCameraActor );
1819 newTask.SetSourceActor( rootActor );
1820 newTask.SetInputEnabled( false );
1821 newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
1822 newTask.SetClearEnabled( true );
1823 newTask.SetExclusive( true );
1824 newTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
1825 newTask.SetFrameBuffer( frameBuffer );
1826 newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, true );
1828 bool finished = false;
1829 RenderTaskFinished renderTaskFinished( finished );
1830 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1832 // Flush the queue and render.
1833 application.SendNotification();
1835 // 1 render to process render task, then wait for sync before finished msg is sent
1836 // from update to the event thread.
1838 application.Render();
1839 application.SendNotification();
1840 DALI_TEST_CHECK( !finished );
1842 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1843 DALI_TEST_CHECK( lastSyncObj != NULL );
1845 application.Render();
1846 DALI_TEST_EQUALS( (Integration::KeepUpdating::Reasons)(application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
1847 application.SendNotification();
1848 DALI_TEST_CHECK( !finished );
1850 application.Render();
1851 DALI_TEST_EQUALS( (Integration::KeepUpdating::Reasons)(application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
1852 application.SendNotification();
1853 DALI_TEST_CHECK( ! finished );
1855 sync.SetObjectSynced( lastSyncObj, true );
1857 application.Render();
1858 application.SendNotification();
1859 DALI_TEST_CHECK( !finished );
1861 application.Render();
1862 application.SendNotification();
1863 DALI_TEST_CHECK( finished );
1865 DALI_TEST_EQUALS( application.GetUpdateStatus(), 0, TEST_LOCATION );
1870 int UtcDaliRenderTaskContinuous01(void)
1872 TestApplication application;
1874 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (source actor not staged)\nPOST:continuous renders, no Finished signal");
1876 // SETUP AN OFFSCREEN RENDER TASK
1877 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1878 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1879 drawTrace.Enable(true);
1881 Actor rootActor = Actor::New();
1882 application.GetScene().Add( rootActor );
1884 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
1885 application.GetScene().Add( offscreenCameraActor );
1887 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
1889 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1890 bool finished = false;
1891 RenderTaskFinished renderTaskFinished( finished );
1892 application.SendNotification();
1894 // START PROCESS/RENDER Input, Expected Input, Expected, KeepUpdating
1895 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false, __LINE__ ) );
1896 application.GetPlatform().ClearReadyResources();
1898 // ADD SOURCE ACTOR TO STAGE - expect continuous renders to start, no finished signal
1899 application.GetScene().Add(secondRootActor);
1900 application.SendNotification();
1902 // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
1903 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
1908 int UtcDaliRenderTaskContinuous02(void)
1910 TestApplication application;
1912 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (source actor not visible)\nPOST:continuous renders, no Finished signal");
1914 // SETUP AN OFFSCREEN RENDER TASK
1915 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1916 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1917 drawTrace.Enable(true);
1919 Actor rootActor = Actor::New();
1920 application.GetScene().Add( rootActor );
1922 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
1923 application.GetScene().Add( offscreenCameraActor );
1925 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
1926 application.GetScene().Add(secondRootActor);
1927 secondRootActor.SetProperty( Actor::Property::VISIBLE,false);
1929 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1930 bool finished = false;
1931 RenderTaskFinished renderTaskFinished( finished );
1932 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1933 application.SendNotification();
1935 // START PROCESS/RENDER Input, Expected Input, Expected, KeepUpdating
1936 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false, __LINE__ ) );
1937 application.GetPlatform().ClearReadyResources();
1939 // MAKE SOURCE ACTOR VISIBLE - expect continuous renders to start, no finished signal
1940 secondRootActor.SetProperty( Actor::Property::VISIBLE,true);
1941 application.SendNotification();
1943 // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
1944 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
1948 int UtcDaliRenderTaskContinuous03(void)
1950 TestApplication application;
1952 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (camera 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 application.GetScene().Add( rootActor );
1962 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
1963 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
1964 application.GetScene().Add(secondRootActor);
1966 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1967 bool finished = false;
1968 RenderTaskFinished renderTaskFinished( finished );
1969 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1970 application.SendNotification();
1972 // START PROCESS/RENDER Input, Expected Input, Expected
1973 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false, __LINE__ ) );
1974 application.GetPlatform().ClearReadyResources();
1976 // ADD CAMERA ACTOR TO STAGE - expect continuous renders to start, no finished signal
1977 application.GetScene().Add( offscreenCameraActor );
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 UtcDaliRenderTaskContinuous04(void)
1988 TestApplication application;
1990 tet_infoline("Testing RenderTask Render Continuous using loaded image");
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 application.GetScene().Add( rootActor );
2000 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2001 application.GetScene().Add( offscreenCameraActor );
2002 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2003 application.GetScene().Add(secondRootActor);
2005 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
2006 bool finished = false;
2007 RenderTaskFinished renderTaskFinished( finished );
2008 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2009 application.SendNotification();
2011 // START PROCESS/RENDER Input, Expected Input, Expected
2012 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2016 int UtcDaliRenderTaskOnce01(void)
2018 TestApplication application;
2020 tet_infoline("Testing RenderTask Render Once GlSync, using loaded image");
2022 // SETUP AN OFFSCREEN RENDER TASK
2023 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2024 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2025 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2026 drawTrace.Enable(true);
2028 Actor rootActor = Actor::New();
2029 application.GetScene().Add( rootActor );
2031 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2032 application.GetScene().Add( offscreenCameraActor );
2033 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2035 application.GetScene().Add(secondRootActor);
2037 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, true);
2038 bool finished = false;
2039 RenderTaskFinished renderTaskFinished( finished );
2040 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2041 application.SendNotification();
2043 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2045 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2046 DALI_TEST_CHECK( lastSyncObj != NULL );
2047 sync.SetObjectSynced( lastSyncObj, true );
2049 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true, __LINE__ ) );
2050 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2054 int UtcDaliRenderTaskOnce02(void)
2056 TestApplication application;
2058 tet_infoline("Testing RenderTask Render Once GlSync, using Mesh which accesses texture through sampler with loaded image.\n");
2060 // SETUP AN OFFSCREEN RENDER TASK
2061 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2062 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2063 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2064 drawTrace.Enable(true);
2066 Actor rootActor = Actor::New();
2067 application.GetScene().Add( rootActor );
2069 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2070 application.GetScene().Add( offscreenCameraActor );
2072 Shader shader = CreateShader();
2073 Texture image = CreateTexture();
2074 TextureSet textureSet = CreateTextureSet( image );
2076 Geometry geometry = CreateQuadGeometry();
2077 Renderer renderer = Renderer::New(geometry, shader);
2078 renderer.SetTextures( textureSet );
2079 Actor secondRootActor = Actor::New();
2080 secondRootActor.AddRenderer(renderer);
2081 secondRootActor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
2082 application.GetScene().Add(secondRootActor);
2084 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, true);
2085 bool finished = false;
2086 RenderTaskFinished renderTaskFinished( finished );
2087 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2088 application.SendNotification();
2090 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2092 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2093 DALI_TEST_CHECK( lastSyncObj != NULL );
2094 sync.SetObjectSynced( lastSyncObj, true );
2096 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true, __LINE__ ) );
2097 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2102 int UtcDaliRenderTaskOnce03(void)
2104 TestApplication application;
2106 tet_infoline("Testing RenderTask Render Once GlSync, using loaded image. Switch from render always after ready to render once\n");
2108 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2109 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2110 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2111 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2112 drawTrace.Enable(true);
2114 Actor rootActor = Actor::New();
2115 application.GetScene().Add( rootActor );
2117 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2118 application.GetScene().Add( offscreenCameraActor );
2119 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2120 application.GetScene().Add(secondRootActor);
2122 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
2123 bool finished = false;
2124 RenderTaskFinished renderTaskFinished( finished );
2125 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2126 application.SendNotification();
2128 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2130 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2131 application.SendNotification();
2133 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2135 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2136 DALI_TEST_CHECK( lastSyncObj != NULL );
2137 sync.SetObjectSynced( lastSyncObj, true );
2139 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true, __LINE__ ) );
2140 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2146 int UtcDaliRenderTaskOnce04(void)
2148 TestApplication application;
2149 tet_infoline("Testing RenderTask Render Once GlSync, using Mesh which accesses texture through sampler with loaded image.\n"
2150 "Switch from render always after ready to render once\n"
2153 // SETUP AN OFFSCREEN RENDER TASK
2154 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2155 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2156 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2157 drawTrace.Enable(true);
2159 Actor rootActor = Actor::New();
2160 application.GetScene().Add( rootActor );
2162 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2163 application.GetScene().Add( offscreenCameraActor );
2165 Shader shader = CreateShader();
2166 Texture image = CreateTexture();
2167 TextureSet textureSet = CreateTextureSet( image );
2169 Geometry geometry = CreateQuadGeometry();
2170 Renderer renderer = Renderer::New(geometry, shader);
2171 renderer.SetTextures( textureSet );
2172 Actor secondRootActor = Actor::New();
2173 secondRootActor.AddRenderer(renderer);
2174 secondRootActor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
2175 application.GetScene().Add(secondRootActor);
2177 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
2178 bool finished = false;
2179 RenderTaskFinished renderTaskFinished( finished );
2180 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2181 application.SendNotification();
2183 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2185 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2186 application.SendNotification();
2188 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2190 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2191 DALI_TEST_CHECK( lastSyncObj != NULL );
2192 sync.SetObjectSynced( lastSyncObj, true );
2194 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true, __LINE__ ) );
2195 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2200 int UtcDaliRenderTaskOnceNoSync01(void)
2202 TestApplication application;
2204 tet_infoline("Testing RenderTask Render Once, \nPRE: Resources ready\nPOST: Finished signal sent once only");
2206 // SETUP AN OFFSCREEN RENDER TASK
2207 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2208 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2209 drawTrace.Enable(true);
2211 Actor rootActor = Actor::New();
2212 application.GetScene().Add( rootActor );
2214 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2215 application.GetScene().Add( offscreenCameraActor );
2216 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2217 application.GetScene().Add(secondRootActor);
2219 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, false);
2220 bool finished = false;
2221 RenderTaskFinished renderTaskFinished( finished );
2222 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2223 application.SendNotification();
2225 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2226 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2230 int UtcDaliRenderTaskOnceNoSync02(void)
2232 TestApplication application;
2234 tet_infoline("Testing RenderTask Render Once, using Mesh which accesses texture through sampler with loaded image.\n"
2235 "PRE: Resources ready\nPOST: Finished signal sent once only");
2236 // SETUP AN OFFSCREEN RENDER TASK
2237 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2238 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2239 drawTrace.Enable(true);
2241 Actor rootActor = Actor::New();
2242 application.GetScene().Add( rootActor );
2244 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2245 application.GetScene().Add( offscreenCameraActor );
2247 Shader shader = CreateShader();
2248 Texture image = CreateTexture();
2249 TextureSet textureSet = CreateTextureSet( image );
2251 Geometry geometry = CreateQuadGeometry();
2252 Renderer renderer = Renderer::New(geometry, shader);
2253 renderer.SetTextures( textureSet );
2254 Actor secondRootActor = Actor::New();
2255 secondRootActor.AddRenderer(renderer);
2256 secondRootActor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
2257 application.GetScene().Add(secondRootActor);
2259 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, false);
2260 bool finished = false;
2261 RenderTaskFinished renderTaskFinished( finished );
2262 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2263 application.SendNotification();
2265 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2266 application.GetPlatform().ClearReadyResources();
2267 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2272 int UtcDaliRenderTaskOnceNoSync03(void)
2274 TestApplication application;
2276 tet_infoline("Testing RenderTask Render Once, using loaded image. Switch from render always after ready to render once\n"
2277 "PRE: Render task ready, Image loaded\n"
2278 "POST: Finished signal sent only once");
2280 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2281 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2282 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2283 drawTrace.Enable(true);
2285 Actor rootActor = Actor::New();
2286 application.GetScene().Add( rootActor );
2288 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2289 application.GetScene().Add( offscreenCameraActor );
2290 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2291 application.GetScene().Add(secondRootActor);
2293 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2294 bool finished = false;
2295 RenderTaskFinished renderTaskFinished( finished );
2296 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2297 application.SendNotification();
2299 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2301 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2302 application.SendNotification(); // Input, Expected Input, Expected
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 UtcDaliRenderTaskOnceNoSync04(void)
2310 TestApplication application;
2312 tet_infoline("Testing RenderTask Render Once, using Mesh which accesses texture through sampler with loading image.\n"
2313 "Switch from render always after ready to render once\n"
2314 "PRE: Render task ready, Image not loaded\n"
2315 "POST: Finished signal sent only once");
2317 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2318 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2319 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2320 drawTrace.Enable(true);
2322 Actor rootActor = Actor::New();
2323 application.GetScene().Add( rootActor );
2325 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2326 application.GetScene().Add( offscreenCameraActor );
2328 Shader shader = CreateShader();
2329 Texture image = CreateTexture();
2330 TextureSet textureSet = CreateTextureSet( image );
2332 Geometry geometry = CreateQuadGeometry();
2333 Renderer renderer = Renderer::New(geometry, shader);
2334 renderer.SetTextures( textureSet );
2335 Actor secondRootActor = Actor::New();
2336 secondRootActor.AddRenderer(renderer);
2337 secondRootActor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
2338 application.GetScene().Add(secondRootActor);
2341 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2342 bool finished = false;
2343 RenderTaskFinished renderTaskFinished( finished );
2344 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2345 application.SendNotification();
2347 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2348 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2349 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2350 DALI_TEST_CHECK( lastSyncObj == NULL );
2352 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2353 application.SendNotification(); // Input, Expected Input, Expected
2354 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2355 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2357 lastSyncObj = sync.GetLastSyncObject();
2358 DALI_TEST_CHECK( lastSyncObj == NULL );
2363 int UtcDaliRenderTaskOnceNoSync05(void)
2365 TestApplication application;
2367 tet_infoline("Testing RenderTask Render Once\n"
2368 "SetRefreshRate(ONCE), resource load failed, completes render task.\n"
2369 "PRE: resources failed to load\n"
2370 "POST: No finished signal sent.");
2372 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2373 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2374 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2375 drawTrace.Enable(true);
2377 Actor rootActor = Actor::New();
2378 application.GetScene().Add( rootActor );
2380 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2381 application.GetScene().Add( offscreenCameraActor );
2382 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2383 application.GetScene().Add(secondRootActor);
2385 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2386 bool finished = false;
2387 RenderTaskFinished renderTaskFinished( finished );
2388 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2389 application.SendNotification();
2391 // START PROCESS/RENDER Input, Expected Input, Expected
2392 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2394 // CHANGE TO RENDER ONCE,
2395 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2396 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2403 int UtcDaliRenderTaskOnceChain01(void)
2405 TestApplication application;
2407 tet_infoline("Testing RenderTask Render Once Chained render tasks\n"
2408 "SetRefreshRate(ONCE), resource load completes, both render tasks render.\n"
2409 "PRE: resources ready\n"
2410 "POST: 2 finished signals sent.");
2412 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2413 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2414 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2415 drawTrace.Enable(true);
2417 Actor defaultRootActor = Actor::New(); // Root for default RT
2418 application.GetScene().Add( defaultRootActor );
2420 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2421 application.GetScene().Add( offscreenCameraActor );
2422 Actor firstRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2423 application.GetScene().Add(firstRootActor);
2425 // first render task
2426 RenderTask firstTask = CreateRenderTask(application, offscreenCameraActor, defaultRootActor, firstRootActor, RenderTask::REFRESH_ONCE, false);
2427 bool firstFinished = false;
2428 RenderTaskFinished renderTask1Finished( firstFinished );
2429 firstTask.FinishedSignal().Connect( &application, renderTask1Finished );
2431 // Second render task
2432 FrameBuffer fbo = firstTask.GetFrameBuffer();
2433 Actor secondRootActor = CreateRenderableActor( fbo.GetColorTexture() );
2434 application.GetScene().Add(secondRootActor);
2435 RenderTask secondTask = CreateRenderTask(application, offscreenCameraActor, defaultRootActor, secondRootActor, RenderTask::REFRESH_ONCE, false);
2436 bool secondFinished = false;
2437 RenderTaskFinished renderTask2Finished( secondFinished );
2438 secondTask.FinishedSignal().Connect( &application, renderTask2Finished );
2440 application.SendNotification();
2442 //Both render tasks are executed.
2443 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false, true, __LINE__ ) );
2444 DALI_TEST_CHECK( firstFinished == false );
2445 DALI_TEST_CHECK( secondFinished == false );
2447 //Nothing else to render and both render task should have finished now
2448 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, firstFinished, true, false, __LINE__ ) );
2449 DALI_TEST_CHECK( firstFinished == true );
2450 DALI_TEST_CHECK( secondFinished == true );
2455 int UtcDaliRenderTaskProperties(void)
2457 TestApplication application;
2459 RenderTask task = application.GetScene().GetRenderTaskList().CreateTask();
2461 Property::IndexContainer indices;
2462 task.GetPropertyIndices( indices );
2463 DALI_TEST_CHECK( indices.Size() );
2464 DALI_TEST_EQUALS( indices.Size(), task.GetPropertyCount(), TEST_LOCATION );
2468 int UtcDaliRenderTaskFinishInvisibleSourceActor(void)
2470 TestApplication application;
2472 tet_infoline("Testing RenderTask::FinishInvisibleSourceActor()");
2474 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2475 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2477 CameraActor offscreenCameraActor = CameraActor::New();
2479 application.GetScene().Add( offscreenCameraActor );
2481 Texture image = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 10, 10 );
2482 Actor rootActor = CreateRenderableActor( image );
2483 rootActor.SetProperty( Actor::Property::SIZE, Vector2( 10.0f, 10.0f ) );
2484 rootActor.SetProperty( Actor::Property::VISIBLE,false);
2485 application.GetScene().Add( rootActor );
2487 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
2488 NativeImageInterfacePtr testNativeImagePtr = TestNativeImage::New(10, 10);
2489 Texture frameBufferTexture = Texture::New( *testNativeImagePtr );
2490 FrameBuffer frameBuffer = FrameBuffer::New(frameBufferTexture.GetWidth(), frameBufferTexture.GetHeight());
2491 frameBuffer.AttachColorTexture(frameBufferTexture);
2493 // Flush all outstanding messages
2494 application.SendNotification();
2495 application.Render();
2497 RenderTask newTask = taskList.CreateTask();
2498 newTask.SetCameraActor( offscreenCameraActor );
2499 newTask.SetSourceActor( rootActor );
2500 newTask.SetInputEnabled( false );
2501 newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
2502 newTask.SetClearEnabled( true );
2503 newTask.SetExclusive( true );
2504 newTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
2505 newTask.SetFrameBuffer( frameBuffer );
2506 newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, true );
2508 // Framebuffer doesn't actually get created until Connected, i.e. by previous line
2510 bool finished = false;
2511 RenderTaskFinished renderTaskFinished( finished );
2512 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2514 // Flush the queue and render.
2515 application.SendNotification();
2517 // 1 render to process render task, then wait for sync before finished msg is sent
2518 // from update to the event thread.
2520 application.Render();
2521 application.SendNotification();
2522 DALI_TEST_CHECK( !finished );
2524 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2525 DALI_TEST_CHECK( lastSyncObj != NULL );
2527 application.Render();
2528 DALI_TEST_EQUALS( (Integration::KeepUpdating::Reasons)(application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
2529 application.SendNotification();
2530 DALI_TEST_CHECK( !finished );
2532 application.Render();
2533 DALI_TEST_EQUALS( (Integration::KeepUpdating::Reasons)(application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
2534 application.SendNotification();
2535 DALI_TEST_CHECK( ! finished );
2537 sync.SetObjectSynced( lastSyncObj, true );
2539 application.Render();
2540 application.SendNotification();
2541 DALI_TEST_CHECK( !finished );
2543 application.Render();
2544 application.SendNotification();
2545 DALI_TEST_CHECK( finished );
2548 application.Render(); // Double check no more finished signal
2549 application.SendNotification();
2550 DALI_TEST_CHECK( ! finished );
2555 int UtcDaliRenderTaskFinishMissingImage(void)
2557 TestApplication application;
2559 // Previously we had bugs where not having a resource ID would cause render-tasks to wait forever
2560 tet_infoline("Testing RenderTask::SignalFinished() when an Actor has no Image set");
2562 Integration::Scene stage = application.GetScene();
2564 Texture image = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 10, 10 );
2565 Actor rootActor = CreateRenderableActor( image );
2566 rootActor.SetProperty( Actor::Property::SIZE, Vector2( 10.0f, 10.0f ) );
2567 stage.Add( rootActor );
2569 Actor actorWithMissingImage = CreateRenderableActor( Texture() );
2570 actorWithMissingImage.SetProperty( Actor::Property::SIZE, Vector2( 10.0f, 10.0f ) );
2571 stage.Add( actorWithMissingImage );
2573 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
2574 RenderTask newTask = taskList.CreateTask();
2575 newTask.SetInputEnabled( false );
2576 newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
2577 newTask.SetClearEnabled( true );
2578 newTask.SetExclusive( true );
2579 newTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
2581 bool finished = false;
2582 RenderTaskFinished renderTaskFinished( finished );
2583 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2585 // 1 render to process render task, then 1 before finished msg is sent from update to the event thread.
2586 application.SendNotification();
2587 application.Render();
2588 application.Render();
2590 application.SendNotification();
2591 DALI_TEST_CHECK( finished );
2596 int UtcDaliRenderTaskWorldToViewport(void)
2598 TestApplication application( 400u, 400u ); // square surface
2600 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
2602 Actor actor = Actor::New();
2603 actor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
2604 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0, 0.0, 0.0) );
2606 actor.SetProperty( Actor::Property::PARENT_ORIGIN, Vector3(0.5, 0.5, 0.5) );
2607 actor.SetProperty( Actor::Property::ANCHOR_POINT, Vector3(0.5, 0.5, 0.5) );
2609 application.GetScene().Add(actor);
2611 application.SendNotification();
2612 application.Render();
2613 application.SendNotification();
2615 RenderTask task = taskList.GetTask( 0u );
2617 CameraActor camera = task.GetCameraActor();
2619 Vector2 screenSize = task.GetCurrentViewportSize();
2621 float screenX = 0.0;
2622 float screenY = 0.0;
2624 bool ok = task.WorldToViewport(actor.GetCurrentProperty< Vector3 >( Actor::Property::WORLD_POSITION ), screenX, screenY);
2625 DALI_TEST_CHECK(ok == true);
2627 DALI_TEST_EQUALS(screenX, screenSize.x/2, Math::MACHINE_EPSILON_10000, TEST_LOCATION);
2628 DALI_TEST_EQUALS(screenY, screenSize.y/2, Math::MACHINE_EPSILON_10000, TEST_LOCATION);
2630 Actor actor2 = Actor::New();
2631 float actor2Size = 100.f;
2632 actor2.SetProperty( Actor::Property::SIZE, Vector2( actor2Size, actor2Size ) );
2633 actor2.SetProperty( Actor::Property::POSITION, Vector3(0.0, 0.0, 0.0) );
2634 actor2.SetProperty( Actor::Property::PARENT_ORIGIN, Vector3(0.5, 0.5, 0.0) );
2635 actor2.SetProperty( Actor::Property::ANCHOR_POINT, Vector3(0.5, 0.5, 0.0) );
2636 application.GetScene().Add( actor2 );
2638 actor.SetProperty( Actor::Property::PARENT_ORIGIN, Vector3(0,0,0) );
2640 application.SendNotification();
2641 application.Render();
2642 application.SendNotification();
2644 ok = task.WorldToViewport(actor.GetCurrentProperty< Vector3 >( Actor::Property::WORLD_POSITION ), screenX, screenY);
2645 DALI_TEST_CHECK(ok == true);
2647 DALI_TEST_EQUALS(screenX, screenSize.x/2 - actor2Size/2, Math::MACHINE_EPSILON_10000, TEST_LOCATION);
2648 DALI_TEST_EQUALS(screenY, screenSize.y/2 - actor2Size/2, Math::MACHINE_EPSILON_10000, TEST_LOCATION);
2654 int UtcDaliRenderTaskViewportToLocal(void)
2656 TestApplication application;
2657 Actor actor = Actor::New();
2658 actor.SetProperty( Actor::Property::ANCHOR_POINT,AnchorPoint::TOP_LEFT);
2659 actor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
2660 actor.SetProperty( Actor::Property::POSITION, Vector2(10.0f, 10.0f));
2661 application.GetScene().Add(actor);
2663 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
2664 RenderTask task = taskList.GetTask( 0u );
2666 // flush the queue and render once
2667 application.SendNotification();
2668 application.Render();
2669 application.SendNotification();
2670 application.Render();
2678 float screenX = 50.0f;
2679 float screenY = 50.0f;
2681 DALI_TEST_CHECK( actor.ScreenToLocal(localX, localY, screenX, screenY) );
2683 DALI_TEST_CHECK( task.ViewportToLocal(actor, screenX, screenY, rtLocalX, rtLocalY ) );
2685 DALI_TEST_EQUALS(localX, rtLocalX, 0.01f, TEST_LOCATION);
2686 DALI_TEST_EQUALS(localY, rtLocalY, 0.01f, TEST_LOCATION);
2692 int UtcDaliRenderTaskOffscreenViewportToLocal(void)
2694 TestApplication application;
2695 Actor actor = Actor::New();
2696 actor.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT );
2697 actor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
2698 actor.SetProperty( Actor::Property::POSITION, Vector2( 10.0f, 10.0f ));
2699 application.GetScene().Add( actor );
2701 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
2702 RenderTask task = taskList.CreateTask();
2704 FrameBuffer newFrameBuffer = FrameBuffer::New(10, 10);
2705 task.SetFrameBuffer( newFrameBuffer );
2706 task.SetSourceActor( actor );
2707 task.SetScreenToFrameBufferMappingActor( actor );
2709 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2710 application.GetScene().Add( offscreenCameraActor );
2711 task.SetCameraActor( offscreenCameraActor );
2713 // flush the queue and render once
2714 application.SendNotification();
2715 application.Render();
2716 application.SendNotification();
2717 application.Render();
2725 float screenX = 50.0f;
2726 float screenY = 50.0f;
2728 DALI_TEST_CHECK( actor.ScreenToLocal(localX, localY, screenX, screenY) );
2730 DALI_TEST_CHECK( task.ViewportToLocal(actor, screenX, screenY, rtLocalX, rtLocalY ) );
2732 DALI_TEST_EQUALS(localX, rtLocalX, 0.01f, TEST_LOCATION);
2733 DALI_TEST_EQUALS(localY, rtLocalY, 0.01f, TEST_LOCATION);
2738 int UtcDaliRenderTaskRequiresSync(void)
2740 TestApplication application;
2741 RenderTaskList taskList = application.GetScene().GetRenderTaskList();
2743 RenderTask newTask = taskList.CreateTask();
2744 newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, false );
2746 DALI_TEST_EQUALS( newTask.GetProperty< bool >( RenderTask::Property::REQUIRES_SYNC ), false, TEST_LOCATION );
2747 DALI_TEST_EQUALS( newTask.GetCurrentProperty< bool >( RenderTask::Property::REQUIRES_SYNC ), false, TEST_LOCATION );
2749 newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, true );
2751 DALI_TEST_EQUALS( newTask.GetProperty< bool >( RenderTask::Property::REQUIRES_SYNC ), true, TEST_LOCATION );
2752 DALI_TEST_EQUALS( newTask.GetCurrentProperty< bool >( RenderTask::Property::REQUIRES_SYNC ), true, TEST_LOCATION );
2757 int UtcDaliRenderTaskSetClearEnabled(void)
2759 TestApplication application;
2761 tet_infoline("UtcDaliRenderTaskSetClearEnabled");
2763 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2764 TestGlAbstraction& gl = application.GetGlAbstraction();
2766 Actor renderableActor = CreateRenderableActorSuccess( application, "aFile.jpg" );
2767 application.GetScene().Add( renderableActor );
2769 Actor rootActor = Actor::New();
2770 application.GetScene().Add( rootActor );
2772 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2773 application.GetScene().Add( offscreenCameraActor );
2775 Actor sourceActor = CreateRenderableActorSuccess( application, "aFile.jpg" );
2776 application.GetScene().Add( sourceActor );
2778 RenderTask newTask = CreateRenderTask( application, offscreenCameraActor, rootActor, sourceActor, RenderTask::REFRESH_ALWAYS, false );
2780 DALI_TEST_EQUALS( gl.GetClearCountCalled(), 0, TEST_LOCATION );
2782 application.SendNotification();
2783 application.Render();
2785 // glClear should be called twice - default task and the new task.
2786 DALI_TEST_EQUALS( gl.GetClearCountCalled(), 2, TEST_LOCATION );
2788 newTask.SetClearEnabled( false );
2790 application.SendNotification();
2791 application.Render();
2793 // The count should increase by 1 - default task only.
2794 DALI_TEST_EQUALS( gl.GetClearCountCalled(), 3, TEST_LOCATION );