2 * Copyright (c) 2020 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 #include <dali/public-api/dali-core.h>
21 #include <dali/devel-api/events/hit-test-algorithm.h>
22 #include <dali-test-suite-utils.h>
23 #include <dali/integration-api/debug.h>
24 #include <test-native-image.h>
26 #include <mesh-builder.h>
28 #define BOOLSTR(x) ((x)?"T":"F")
30 //& set: DaliRenderTask
34 void utc_dali_render_task_startup(void)
36 test_return_value = TET_UNDEF;
39 void utc_dali_render_task_cleanup(void)
41 test_return_value = TET_PASS;
47 * Constructor, Destructor, DownCast, New, copy constructor, assignment operator
49 * SetSourceActor 2+ve, 1-ve
50 * GetSourceActor 1+ve, 1-ve
51 * SetExclusive 2+ve, 0-ve
52 * IsExclusive 2+ve, 0-ve
53 * SetInputEnabled 1+ve, 0-ve
54 * GetInputEnabled 1+ve, 0-ve
55 * SetCameraActor 1+ve, 1-ve
56 * GetCameraActor 1+ve, 1-ve
57 * SetTargetFrameBuffer 1+ve, 1-ve
58 * GetTargetFrameBuffer 1+ve, 1-ve
59 * SetScreenToFrameBufferFunction 1+ve, 1-ve
60 * GetScreenToFrameBufferFunction 1+ve, 1-ve
61 * SetScreenToFrameBufferMappingActor 1+ve, 1-ve
62 * GetScreenToFrameBufferMappingActor 1+ve, 1-ve
63 * SetViewportPosition 1+ve
64 * GetCurrentViewportPosition 1+ve
65 * SetViewportSize 1+ve
66 * GetCurrentViewportSize 1+ve
67 * SetViewport 2+ve, 1-ve
68 * GetViewport 2+ve, 1-ve
69 * SetClearColor 1+ve, 1-ve
70 * GetClearColor 1+ve, 1-ve
71 * SetClearEnabled 1+ve, 1-ve
72 * GetClearEnabled 1+ve, 1-ve
80 namespace // unnamed namespace
83 const int RENDER_FRAME_INTERVAL = 16; ///< Duration of each frame in ms. (at approx 60FPS)
86 * Simulate time passed by.
88 * @note this will always process at least 1 frame (1/60 sec)
90 * @param application Test application instance
91 * @param duration Time to pass in milliseconds.
92 * @return The actual time passed in milliseconds
94 int Wait(TestApplication& application, int duration = 0)
98 for(int i = 0; i <= ( duration / RENDER_FRAME_INTERVAL); i++)
100 application.SendNotification();
101 application.Render(RENDER_FRAME_INTERVAL);
102 time += RENDER_FRAME_INTERVAL;
108 struct RenderTaskFinished
110 RenderTaskFinished( bool& finished )
111 : finished( finished )
115 void operator()( RenderTask& renderTask )
123 struct RenderTaskFinishedRemoveSource
125 RenderTaskFinishedRemoveSource( bool& finished )
126 : finished( finished ),
131 void operator()( RenderTask& renderTask )
133 DALI_TEST_CHECK(finishedOnce == false);
136 Actor srcActor = renderTask.GetSourceActor();
137 UnparentAndReset(srcActor);
144 struct RenderTaskFinishedRenderAgain
146 RenderTaskFinishedRenderAgain( bool& finished )
147 : finished( finished ),
152 void operator()( RenderTask& renderTask )
154 DALI_TEST_CHECK(finishedOnce == false);
157 renderTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
165 bool TestScreenToFrameBufferFunction( Vector2& coordinates )
167 coordinates = coordinates + Vector2( 1, 2 );
172 Actor CreateRenderableActorSuccess(TestApplication& application, std::string filename)
174 PrepareResourceImage( application, 80u, 80u, Pixel::RGBA8888 );
175 Image image = ResourceImage::New(filename);
176 Actor actor = CreateRenderableActor(image);
177 actor.SetProperty( Actor::Property::SIZE, Vector2( 80.0f, 80.0f ) );
181 Actor CreateRenderableActorFailed(TestApplication& application, std::string filename)
183 Image image = ResourceImage::New(filename);
184 DALI_TEST_CHECK( image );
185 Actor actor = CreateRenderableActor(image);
186 actor.SetProperty( Actor::Property::SIZE, Vector2( 80.0f, 80.0f ) );
190 Image CreateResourceImage(TestApplication& application, std::string filename)
192 PrepareResourceImage( application, 80u, 80u, Pixel::RGBA8888 );
193 Image image = ResourceImage::New(filename);
194 DALI_TEST_CHECK( image );
198 RenderTask CreateRenderTask(TestApplication& application,
199 CameraActor offscreenCamera,
200 Actor rootActor, // Reset default render task to point at this actor
201 Actor secondRootActor, // Source actor
202 unsigned int refreshRate,
205 // Change main render task to use a different root
206 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
207 taskList.GetTask(0u).SetSourceActor( rootActor );
209 FrameBuffer frameBuffer = FrameBuffer::New(10,10);
212 NativeImageInterfacePtr testNativeImagePtr = TestNativeImage::New(10, 10);
213 Texture texture = Texture::New(*testNativeImagePtr);
214 frameBuffer.AttachColorTexture(texture);
217 // Don't draw output framebuffer // '
219 RenderTask newTask = taskList.CreateTask();
220 newTask.SetCameraActor( offscreenCamera );
221 newTask.SetSourceActor( secondRootActor );
222 newTask.SetInputEnabled( false );
223 newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
224 newTask.SetClearEnabled( true );
225 newTask.SetExclusive( true );
226 newTask.SetRefreshRate( refreshRate );
227 newTask.SetFrameBuffer( frameBuffer );
228 newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, glSync );
232 bool UpdateRender(TestApplication& application, TraceCallStack& callStack, bool testDrawn, bool& finishedSig, bool testFinished, bool testKeepUpdating, int lineNumber )
237 tet_printf("TestApplication::UpdateRender().\n");
239 application.Render(16);
240 application.SendNotification();
242 bool sigPassed = false;
245 sigPassed = finishedSig;
249 sigPassed = ! finishedSig;
252 bool drawResult = callStack.FindMethod("DrawElements") || callStack.FindMethod("DrawArrays");
254 bool drawPassed = false;
257 drawPassed = drawResult;
261 drawPassed = !drawResult;
264 bool keepUpdating = (application.GetUpdateStatus() != 0);
265 bool keepUpdatingPassed = false;
266 if( testKeepUpdating )
268 keepUpdatingPassed = keepUpdating;
272 keepUpdatingPassed = !keepUpdating;
275 bool result = (sigPassed && drawPassed && keepUpdatingPassed);
277 tet_printf("UpdateRender: Expected: Draw:%s Signal:%s KeepUpdating: %s Actual: Draw:%s Signal:%s KeepUpdating: %s %s, line %d\n",
278 BOOLSTR(testDrawn), BOOLSTR(testFinished), BOOLSTR(testKeepUpdating),
279 BOOLSTR(drawResult), BOOLSTR(finishedSig), BOOLSTR(keepUpdating),
280 result ? "Passed":"Failed",
286 } // unnamed namespace
289 /****************************************************************************************************/
290 /****************************************************************************************************/
291 /******************************** TEST CASES BELOW **********************************************/
292 /****************************************************************************************************/
293 /****************************************************************************************************/
295 int UtcDaliRenderTaskDownCast01(void)
297 TestApplication application;
299 tet_infoline("Testing RenderTask::DownCast()");
301 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
303 BaseHandle base = taskList.GetTask( 0u );
304 DALI_TEST_CHECK( base );
306 RenderTask task = RenderTask::DownCast( base );
307 DALI_TEST_CHECK( task );
309 // Try calling a method
310 DALI_TEST_CHECK( task.GetSourceActor() );
314 int UtcDaliRenderTaskDownCast02(void)
316 TestApplication application;
318 tet_infoline("Testing RenderTask::DownCast()");
320 Actor actor = Actor::New();
322 RenderTask task = RenderTask::DownCast( actor );
323 DALI_TEST_CHECK( ! task );
328 int UtcDaliRenderTaskSetSourceActorN(void)
330 TestApplication application;
331 tet_infoline("Testing RenderTask::SetSourceActor() Negative - try with empty actor handle");
332 Stage stage = Stage::GetCurrent();
336 RenderTaskList taskList = stage.GetRenderTaskList();
337 RenderTask renderTask = taskList.CreateTask();
338 renderTask.SetSourceActor(srcActor);
340 application.SendNotification();
341 application.Render();
343 DALI_TEST_CHECK( ! renderTask.GetSourceActor() );
348 int UtcDaliRenderTaskSetSourceActorP01(void)
350 TestApplication application;
352 tet_infoline("Testing RenderTask::SetSourceActor() Positive - check that setting a non-renderable actor stops existing source actor being rendered ");
354 Stage stage = Stage::GetCurrent();
355 RenderTaskList taskList = stage.GetRenderTaskList();
356 RenderTask task = taskList.GetTask( 0u );
358 Actor actor = task.GetSourceActor();
359 DALI_TEST_CHECK( actor );
361 Texture img = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
362 Actor newActor = CreateRenderableActor( img );
363 newActor.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
364 stage.Add( newActor );
366 Actor nonRenderableActor = Actor::New();
367 stage.Add( nonRenderableActor );
369 // Stop the newActor from being rendered by changing the source actor
370 DALI_TEST_CHECK( nonRenderableActor );
371 task.SetSourceActor( nonRenderableActor );
372 DALI_TEST_CHECK( task.GetSourceActor() != actor );
373 DALI_TEST_CHECK( task.GetSourceActor() == nonRenderableActor );
375 TestGlAbstraction& gl = application.GetGlAbstraction();
376 TraceCallStack& drawTrace = gl.GetDrawTrace();
377 drawTrace.Enable(true);
379 // Update & Render nothing!
380 application.GetGlAbstraction().ClearBoundTextures();
381 application.SendNotification();
382 application.Render();
384 // Check that nothing was rendered
385 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION );
391 int UtcDaliRenderTaskSetSourceActorP02(void)
393 TestApplication application;
395 tet_infoline("Testing RenderTask::SetSourceActor() Positive - check that switching source from a non-renderable to a renderable actor causes the texture to be drawn");
397 Stage stage = Stage::GetCurrent();
399 RenderTaskList taskList = stage.GetRenderTaskList();
401 RenderTask task = taskList.GetTask( 0u );
403 Actor actor = task.GetSourceActor();
404 DALI_TEST_CHECK( actor );
407 Texture img = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
408 Actor newActor = CreateRenderableActor( img );
409 newActor.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
410 stage.Add( newActor );
412 Actor nonRenderableActor = Actor::New();
413 stage.Add( nonRenderableActor );
415 TestGlAbstraction& gl = application.GetGlAbstraction();
416 TraceCallStack& drawTrace = gl.GetDrawTrace();
417 drawTrace.Enable(true);
419 // Stop the newActor from being rendered by changing the source actor
420 DALI_TEST_CHECK( nonRenderableActor );
421 task.SetSourceActor( nonRenderableActor );
422 DALI_TEST_CHECK( task.GetSourceActor() != actor );
423 DALI_TEST_CHECK( task.GetSourceActor() == nonRenderableActor );
425 // Update & Render nothing!
426 application.GetGlAbstraction().ClearBoundTextures();
427 application.SendNotification();
428 application.Render();
430 // Check that nothing was rendered
431 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION );
434 // Set newActor as the new source Actor
435 task.SetSourceActor( newActor );
436 DALI_TEST_CHECK( task.GetSourceActor() != actor );
437 DALI_TEST_CHECK( task.GetSourceActor() == newActor );
439 // Update & Render the newActor
440 application.GetGlAbstraction().ClearBoundTextures();
441 application.SendNotification();
442 application.Render();
444 // Check that the newActor was rendered
445 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 1, TEST_LOCATION );
449 int UtcDaliRenderTaskSetSourceActorOffStage(void)
451 TestApplication application;
453 tet_infoline("Testing RenderTask::SetSourceActor (on/off stage testing)");
455 Stage stage = Stage::GetCurrent();
456 RenderTaskList taskList = stage.GetRenderTaskList();
457 RenderTask task = taskList.GetTask( 0u );
459 Actor actor = task.GetSourceActor();
460 DALI_TEST_CHECK( actor );
462 TestGlAbstraction& gl = application.GetGlAbstraction();
463 TraceCallStack& drawTrace = gl.GetDrawTrace();
464 drawTrace.Enable(true);
466 Texture img = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
467 Actor newActor = CreateRenderableActor( img );
468 newActor.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
469 task.SetSourceActor( newActor );
470 // Don't add newActor to stage yet //'
472 // Update & Render with the actor initially off-stage
473 application.SendNotification();
474 application.Render();
476 // Check that nothing was rendered
477 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION );
480 stage.Add( newActor );
482 // Update & Render with the actor on-stage
483 application.GetGlAbstraction().ClearBoundTextures();
484 application.SendNotification();
485 application.Render();
487 // Check that the newActor was rendered
488 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 1, TEST_LOCATION );
491 // Now remove from stage
492 stage.Remove( newActor );
494 // Update & Render with the actor off-stage
495 application.SendNotification();
496 application.Render();
497 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION );
502 int UtcDaliRenderTaskSetSourceActorEmpty(void)
504 TestApplication application;
506 tet_infoline("Testing RenderTask::SetSourceActor (empty handle case)");
508 Stage stage = Stage::GetCurrent();
509 RenderTaskList taskList = stage.GetRenderTaskList();
510 RenderTask task = taskList.GetTask( 0u );
512 Actor actor = task.GetSourceActor();
513 DALI_TEST_CHECK( actor );
515 Texture img = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
516 Actor newActor = CreateRenderableActor( img );
517 newActor.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
518 stage.Add( newActor );
520 Actor nonRenderableActor = Actor::New();
521 stage.Add( nonRenderableActor );
523 // Set with empty handle
524 task.SetSourceActor( Actor() );
525 DALI_TEST_CHECK( ! task.GetSourceActor() );
527 TestGlAbstraction& gl = application.GetGlAbstraction();
528 TraceCallStack& drawTrace = gl.GetDrawTrace();
529 drawTrace.Enable(true);
531 // Update & Render nothing!
532 application.SendNotification();
533 application.Render();
535 // Check that nothing was rendered
536 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION );
538 // Set with non-empty handle
539 task.SetSourceActor( newActor );
540 DALI_TEST_CHECK( task.GetSourceActor() == newActor );
542 // Update & Render the newActor
543 application.GetGlAbstraction().ClearBoundTextures();
544 application.SendNotification();
545 application.Render();
547 // Check that the newActor was rendered
548 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 1, TEST_LOCATION );
552 int UtcDaliRenderTaskSetSourceActorDestroyed(void)
554 TestApplication application;
556 tet_infoline( "Testing RenderTask::SetSourceActor - Set a source actor and destroy the source actor" );
558 Stage stage = Stage::GetCurrent();
559 RenderTaskList taskList = stage.GetRenderTaskList();
560 RenderTask task = taskList.GetTask( 0u );
562 Actor actor = task.GetSourceActor();
563 DALI_TEST_CHECK( actor );
565 Texture img = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
567 Actor newActor = CreateRenderableActor( img );
568 newActor.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
569 stage.Add( newActor );
571 task.SetSourceActor( newActor );
573 DALI_TEST_CHECK( task.GetSourceActor() != actor );
574 DALI_TEST_CHECK( task.GetSourceActor() == newActor );
576 application.SendNotification();
577 application.Render();
579 // Destroy the source actor
580 stage.Remove( newActor );
583 DALI_TEST_CHECK( !task.GetSourceActor() ); // The source actor should be an empty handle.
588 int UtcDaliRenderTaskGetSourceActorP01(void)
590 TestApplication application;
592 tet_infoline("Testing RenderTask::GetSourceActor() Check the default render task has a valid source actor");
594 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
596 RenderTask task = taskList.GetTask( 0u );
598 Actor actor = task.GetSourceActor();
599 DALI_TEST_CHECK( actor );
601 // By default the entire scene should be rendered
602 Actor root = Stage::GetCurrent().GetLayer( 0 );
603 DALI_TEST_CHECK( root == actor );
607 int UtcDaliRenderTaskGetSourceActorP02(void)
609 TestApplication application;
611 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.");
613 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
614 RenderTask task = taskList.CreateTask();
615 Actor actor = Actor::New();
616 Stage::GetCurrent().Add(actor);
617 task.SetSourceActor( actor );
619 DALI_TEST_EQUALS( actor, task.GetSourceActor(), TEST_LOCATION );
624 int UtcDaliRenderTaskGetSourceActorN(void)
626 TestApplication application;
628 tet_infoline("Testing RenderTask::GetSourceActor() Try with empty handle");
633 Actor actor = task.GetSourceActor();
635 catch (Dali::DaliException& e)
637 DALI_TEST_PRINT_ASSERT( e );
638 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
644 int UtcDaliRenderTaskSetExclusive(void)
646 TestApplication application;
648 tet_infoline("Testing RenderTask::SetExclusive() Check that exclusion works");
650 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
652 // Manipulate the GenTextures behaviour, to identify different actors
654 std::vector<GLuint> ids;
655 ids.push_back( 8 ); // 8 = actor1
656 ids.push_back( 9 ); // 9 = actor2
657 ids.push_back( 10 ); // 10 = actor3
658 application.GetGlAbstraction().SetNextTextureIds( ids );
660 Texture img1 = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
661 Actor actor1 = CreateRenderableActor( img1 );
662 actor1.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
663 Stage::GetCurrent().Add( actor1 );
665 // Update & Render actor1
666 application.SendNotification();
667 application.Render();
669 // Check that the actor1 was rendered
670 const std::vector<GLuint>& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 );
671 DALI_TEST_GREATER( boundTextures.size(), static_cast<std::vector<GLuint>::size_type>( 0 ), TEST_LOCATION );
673 if ( boundTextures.size() )
676 DALI_TEST_EQUALS( boundTextures[c++], 8u/*unique to actor1*/, TEST_LOCATION );
677 if( boundTextures.size() > 1 )
679 DALI_TEST_EQUALS( boundTextures[c++], 8u/*unique to actor1*/, TEST_LOCATION );
683 Texture img2 = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
685 Actor actor2 = CreateRenderableActor( img2 );
686 actor2.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
688 // Force actor2 to be rendered before actor1
689 Layer layer = Layer::New();
690 Stage::GetCurrent().Add( layer );
692 layer.LowerToBottom();
695 application.GetGlAbstraction().ClearBoundTextures();
696 application.SendNotification();
697 application.Render();
699 // Check that the actors were rendered
700 DALI_TEST_GREATER( boundTextures.size(), static_cast<std::vector<GLuint>::size_type>( 1 ), TEST_LOCATION );
702 if ( boundTextures.size() )
705 DALI_TEST_EQUALS( boundTextures[c++], 9u/*unique to actor2*/, TEST_LOCATION );
706 if( boundTextures.size() > 2 )
708 DALI_TEST_EQUALS( boundTextures[c++], 9u/*unique to actor1*/, TEST_LOCATION );
710 DALI_TEST_EQUALS( boundTextures[c++], 8u/*unique to actor1*/, TEST_LOCATION );
713 Texture img3 = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
714 Actor actor3 = CreateRenderableActor( img3 );
715 actor3.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
717 // Force actor3 to be rendered before actor2
718 layer = Layer::New();
719 Stage::GetCurrent().Add( layer );
721 layer.LowerToBottom();
723 // Update & Render all actors
724 application.GetGlAbstraction().ClearBoundTextures();
725 application.SendNotification();
726 application.Render();
728 // Check that the actors were rendered
729 DALI_TEST_GREATER( boundTextures.size(), static_cast<std::vector<GLuint>::size_type>( 2 ), TEST_LOCATION );
731 if ( boundTextures.size() )
734 DALI_TEST_EQUALS( boundTextures[c++], 10u/*unique to actor3*/, TEST_LOCATION );
735 if( boundTextures.size() > 3 )
737 DALI_TEST_EQUALS( boundTextures[c++], 10u/*unique to actor2*/, TEST_LOCATION );
739 DALI_TEST_EQUALS( boundTextures[c++], 9u/*unique to actor2*/, TEST_LOCATION );
740 DALI_TEST_EQUALS( boundTextures[c++], 8u/*unique to actor1*/, TEST_LOCATION );
743 // Both actors are now connected to the root node
744 // Setup 2 render-tasks - the first will render from the root-node, and the second from actor2
746 // Not exclusive is the default
747 RenderTask task1 = taskList.GetTask( 0u );
748 DALI_TEST_CHECK( false == task1.IsExclusive() );
750 RenderTask task2 = taskList.CreateTask();
751 DALI_TEST_CHECK( false == task2.IsExclusive() );
752 task2.SetSourceActor( actor2 );
754 // Task1 should render all actors, and task 2 should render only actor2
756 application.GetGlAbstraction().ClearBoundTextures();
757 application.SendNotification();
758 application.Render();
760 DALI_TEST_EQUALS( boundTextures.size(), 4u, TEST_LOCATION );
762 if ( boundTextures.size() == 4 )
764 // Test that task 1 renders actor3, then actor2 & then actor1
765 DALI_TEST_CHECK( boundTextures[0] == 10u );
766 DALI_TEST_CHECK( boundTextures[1] == 9u );
767 DALI_TEST_CHECK( boundTextures[2] == 8u );
769 // Test that task 2 renders actor2
770 DALI_TEST_EQUALS( boundTextures[3], 9u, TEST_LOCATION );
773 // Make actor2 exclusive to task2
775 task2.SetExclusive( true );
776 DALI_TEST_CHECK( true == task2.IsExclusive() );
778 // Task1 should render only actor1, and task 2 should render only actor2
780 application.GetGlAbstraction().ClearBoundTextures();
781 application.SendNotification();
782 application.Render();
784 DALI_TEST_EQUALS( boundTextures.size(), 3u, TEST_LOCATION );
785 if ( boundTextures.size() == 3 )
787 // Test that task 1 renders actor3 & actor1
788 DALI_TEST_CHECK( boundTextures[0] == 10u );
789 DALI_TEST_CHECK( boundTextures[1] == 8u );
791 // Test that task 2 renders actor2
792 DALI_TEST_CHECK( boundTextures[2] == 9u );
795 // Create a renderable actor and replace the source actor in task2
796 auto actor4 = CreateRenderableActor();
797 task2.SetSourceActor( actor3 );
798 DALI_TEST_EQUALS( actor3, task2.GetSourceActor(), TEST_LOCATION );
803 int UtcDaliRenderTaskSetExclusive02(void)
805 TestApplication application;
807 tet_infoline("Testing RenderTask::SetExclusive() Check that changing from exclusive to not-exclusive works");
809 std::vector<GLuint> ids;
810 ids.push_back( 8 ); // 8 = actor1
811 application.GetGlAbstraction().SetNextTextureIds( ids );
813 Texture img1 = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 1, 1 );
814 Actor actor1 = CreateRenderableActor( img1 );
815 actor1.SetProperty( Actor::Property::SIZE, Vector2( 1.0f, 1.0f ) );
816 Stage::GetCurrent().Add( actor1 );
818 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
819 RenderTask task = taskList.CreateTask();
821 task.SetSourceActor( actor1 );
822 task.SetExclusive(true); // Actor should only render once
824 TestGlAbstraction& gl = application.GetGlAbstraction();
825 TraceCallStack& drawTrace = gl.GetDrawTrace();
826 drawTrace.Enable(true);
828 // Update & Render actor1
829 application.SendNotification();
830 application.Render();
832 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 1, TEST_LOCATION );
834 // Set task to non-exclusive - actor1 should render twice:
836 task.SetExclusive(false);
837 application.SendNotification();
838 application.Render();
840 DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 2, TEST_LOCATION );
845 int UtcDaliRenderTaskSetExclusiveN(void)
847 TestApplication application;
849 tet_infoline("Testing RenderTask::SetExclusive() on empty handle");
854 task.SetExclusive(true);
856 catch (Dali::DaliException& e)
858 DALI_TEST_PRINT_ASSERT( e );
859 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
864 int UtcDaliRenderTaskIsExclusive01(void)
866 TestApplication application;
868 tet_infoline("Testing RenderTask::IsExclusive() Check default values are non-exclusive");
870 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
872 // Not exclusive is the default
873 RenderTask task = taskList.GetTask( 0u );
874 DALI_TEST_CHECK( false == task.IsExclusive() );
876 RenderTask newTask = taskList.CreateTask();
877 DALI_TEST_CHECK( false == newTask.IsExclusive() );
882 int UtcDaliRenderTaskIsExclusive02(void)
884 TestApplication application;
886 tet_infoline("Testing RenderTask::IsExclusive() Check the getter returns set values");
888 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
890 // Not exclusive is the default
891 RenderTask newTask = taskList.CreateTask();
892 DALI_TEST_EQUALS( newTask.IsExclusive(), false, TEST_LOCATION );
894 newTask.SetExclusive(true);
895 DALI_TEST_EQUALS( newTask.IsExclusive(), true, TEST_LOCATION );
899 int UtcDaliRenderTaskIsExclusiveN(void)
901 TestApplication application;
903 tet_infoline("Testing RenderTask::IsExclusive() on empty handle");
908 bool x = task.IsExclusive();
911 catch (Dali::DaliException& e)
913 DALI_TEST_PRINT_ASSERT( e );
914 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
919 int UtcDaliRenderTaskSetInputEnabled(void)
921 TestApplication application;
923 tet_infoline("Testing RenderTask::SetInputEnabled()");
925 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
927 // Input is enabled by default
928 RenderTask task = taskList.GetTask( 0u );
929 DALI_TEST_CHECK( true == task.GetInputEnabled() );
931 task.SetInputEnabled( false );
932 DALI_TEST_CHECK( false == task.GetInputEnabled() );
934 task.SetInputEnabled( true );
935 DALI_TEST_CHECK( true == task.GetInputEnabled() );
939 int UtcDaliRenderTaskGetInputEnabled(void)
941 TestApplication application;
943 tet_infoline("Testing RenderTask::GetInputEnabled()");
945 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
947 // Input is enabled by default
948 RenderTask task = taskList.GetTask( 0u );
949 DALI_TEST_EQUALS( true, task.GetInputEnabled(), TEST_LOCATION );
951 RenderTask newTask = taskList.CreateTask();
952 DALI_TEST_EQUALS( true, newTask.GetInputEnabled(), TEST_LOCATION );
954 newTask.SetInputEnabled(false);
955 DALI_TEST_EQUALS( false, newTask.GetInputEnabled(), TEST_LOCATION );
960 int UtcDaliRenderTaskSetCameraActorP(void)
962 TestApplication application;
964 tet_infoline("Testing RenderTask::SetCameraActor()");
966 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
968 RenderTask task = taskList.GetTask( 0u );
970 Actor defaultCameraActor = task.GetCameraActor();
971 DALI_TEST_CHECK( defaultCameraActor );
973 CameraActor newCameraActor = CameraActor::New();
974 DALI_TEST_CHECK( newCameraActor );
976 task.SetCameraActor( newCameraActor );
977 DALI_TEST_CHECK( task.GetCameraActor() != defaultCameraActor );
978 DALI_TEST_EQUALS( task.GetCameraActor(), newCameraActor, TEST_LOCATION );
983 int UtcDaliRenderTaskSetCameraActorN(void)
985 TestApplication application;
987 tet_infoline("Testing RenderTask::SetCameraActor() with empty actor handle");
989 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
991 RenderTask task = taskList.GetTask( 0u );
993 Actor actor = task.GetCameraActor();
994 DALI_TEST_CHECK( actor );
996 CameraActor cameraActor;
998 task.SetCameraActor( cameraActor );
999 DALI_TEST_EQUALS( (bool)task.GetCameraActor(), false, TEST_LOCATION );
1000 DALI_TEST_EQUALS( task.GetCameraActor(), cameraActor, TEST_LOCATION );
1004 int UtcDaliRenderTaskSetCameraActorDestroyed(void)
1006 TestApplication application;
1008 tet_infoline( "Testing RenderTask::SetCameraActor - Set a camera actor and destroy the camera actor" );
1010 Stage stage = Stage::GetCurrent();
1011 RenderTaskList taskList = stage.GetRenderTaskList();
1012 RenderTask task = taskList.GetTask( 0u );
1014 CameraActor newCameraActor = CameraActor::New();
1015 task.SetCameraActor( newCameraActor );
1017 DALI_TEST_EQUALS( task.GetCameraActor(), newCameraActor, TEST_LOCATION );
1019 // Destroy the camera actor
1020 newCameraActor.Reset();
1022 CameraActor camera = task.GetCameraActor();
1023 DALI_TEST_CHECK( !camera ); // The camera actor should be an empty handle.
1028 int UtcDaliRenderTaskGetCameraActorP(void)
1030 TestApplication application;
1032 tet_infoline("Testing RenderTask::GetCameraActor()");
1034 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1036 RenderTask task = taskList.GetTask( 0u );
1038 CameraActor actor = task.GetCameraActor();
1039 DALI_TEST_CHECK( actor );
1040 DALI_TEST_EQUALS( actor.GetProjectionMode(), Dali::Camera::PERSPECTIVE_PROJECTION, TEST_LOCATION );
1041 DALI_TEST_GREATER( actor.GetFieldOfView(), 0.0f, TEST_LOCATION );
1045 int UtcDaliRenderTaskGetCameraActorN(void)
1047 TestApplication application;
1049 tet_infoline("Testing RenderTask::GetCameraActor() with empty handle");
1054 Actor actor = task.GetCameraActor();
1056 catch (Dali::DaliException& e)
1058 DALI_TEST_PRINT_ASSERT( e );
1059 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1065 int UtcDaliRenderTaskSetFrameBufferP(void)
1067 TestApplication application;
1069 tet_infoline("Testing RenderTask::SetFrameBuffer()");
1071 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1073 RenderTask task = taskList.GetTask( 0u );
1075 FrameBuffer newFrameBuffer = FrameBuffer::New( 128u, 128u, FrameBuffer::Attachment::NONE );
1076 task.SetFrameBuffer( newFrameBuffer );
1077 DALI_TEST_CHECK( task.GetFrameBuffer() == newFrameBuffer );
1081 int UtcDaliRenderTaskSetFrameBufferN(void)
1083 TestApplication application;
1085 tet_infoline("Testing RenderTask::SetFrameBuffer()");
1087 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1089 RenderTask task = taskList.GetTask( 0u );
1090 FrameBuffer newFrameBuffer; // Empty handle
1091 task.SetFrameBuffer( newFrameBuffer );
1092 DALI_TEST_EQUALS( (bool)task.GetFrameBuffer(), false, TEST_LOCATION );
1096 int UtcDaliRenderTaskGetFrameBufferP(void)
1098 TestApplication application;
1100 tet_infoline("Testing RenderTask::GetFrameBuffer()");
1102 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1104 RenderTask task = taskList.GetTask( 0u );
1106 FrameBuffer newFrameBuffer = FrameBuffer::New( 1u, 1u, FrameBuffer::Attachment::NONE );
1107 task.SetFrameBuffer( newFrameBuffer );
1108 DALI_TEST_CHECK( task.GetFrameBuffer() == newFrameBuffer );
1112 int UtcDaliRenderTaskGetFrameBufferN(void)
1114 TestApplication application;
1116 tet_infoline("Testing RenderTask::GetFrameBuffer()");
1118 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1120 RenderTask task = taskList.GetTask( 0u );
1122 // By default render-tasks do not render off-screen
1123 FrameBuffer frameBuffer = task.GetFrameBuffer();
1124 DALI_TEST_CHECK( !frameBuffer );
1129 int UtcDaliRenderTaskSetScreenToFrameBufferFunctionP(void)
1131 TestApplication application;
1133 tet_infoline("Testing RenderTask::SetScreenToFrameBufferFunction()");
1135 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1137 RenderTask task = taskList.GetTask( 0u );
1139 task.SetScreenToFrameBufferFunction( TestScreenToFrameBufferFunction );
1141 Vector2 coordinates( 5, 10 );
1142 Vector2 convertedCoordinates( 6, 12 ); // + Vector(1, 2)
1144 RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction();
1145 DALI_TEST_CHECK( func( coordinates ) );
1146 DALI_TEST_CHECK( coordinates == convertedCoordinates );
1148 task.SetScreenToFrameBufferFunction( RenderTask::FULLSCREEN_FRAMEBUFFER_FUNCTION );
1149 func = task.GetScreenToFrameBufferFunction();
1150 DALI_TEST_CHECK( func( coordinates ) );
1152 task.SetScreenToFrameBufferFunction( RenderTask::DEFAULT_SCREEN_TO_FRAMEBUFFER_FUNCTION );
1153 func = task.GetScreenToFrameBufferFunction();
1154 DALI_TEST_CHECK( ! func( coordinates ) );
1158 int UtcDaliRenderTaskSetScreenToFrameBufferFunctionN(void)
1160 TestApplication application;
1162 tet_infoline("Testing RenderTask::SetScreenToFrameBufferFunction()");
1164 RenderTask task; // Empty handle
1167 task.SetScreenToFrameBufferFunction( TestScreenToFrameBufferFunction );
1169 catch (Dali::DaliException& e)
1171 DALI_TEST_PRINT_ASSERT( e );
1172 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1177 int UtcDaliRenderTaskGetScreenToFrameBufferFunctionP(void)
1179 TestApplication application;
1181 tet_infoline("Testing RenderTask::GetScreenToFrameBufferFunction()");
1183 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1185 RenderTask task = taskList.GetTask( 0u );
1187 Vector2 originalCoordinates( 5, 10 );
1188 Vector2 coordinates( 5, 10 );
1190 RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction();
1191 DALI_TEST_CHECK( !func( coordinates ) ); // conversion should fail by default
1192 DALI_TEST_CHECK( coordinates == originalCoordinates ); // coordinates should not be modified
1196 int UtcDaliRenderTaskGetScreenToFrameBufferFunctionN(void)
1198 TestApplication application;
1200 tet_infoline("Testing RenderTask::GetScreenToFrameBufferFunction() on empty handle");
1205 RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction();
1208 catch (Dali::DaliException& e)
1210 DALI_TEST_PRINT_ASSERT( e );
1211 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1217 int UtcDaliRenderTaskGetScreenToFrameBufferMappingActorP(void)
1219 TestApplication application;
1220 tet_infoline("Testing RenderTask::GetScreenToFrameBufferMappingActor ");
1222 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1223 RenderTask renderTask = taskList.CreateTask();
1224 Actor mappingActor = Actor::New();
1225 renderTask.SetScreenToFrameBufferMappingActor(mappingActor);
1227 DALI_TEST_EQUALS( mappingActor, renderTask.GetScreenToFrameBufferMappingActor(), TEST_LOCATION );
1232 int UtcDaliRenderTaskGetScreenToFrameBufferMappingActorN(void)
1234 TestApplication application;
1235 tet_infoline("Testing RenderTask::GetScreenToFrameBufferMappingActor with empty task handle");
1241 task.SetScreenToFrameBufferMappingActor(mappingActor);
1243 catch (Dali::DaliException& e)
1245 DALI_TEST_PRINT_ASSERT( e );
1246 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1251 int UtcDaliRenderTaskGetScreenToFrameBufferMappingActor02N(void)
1253 TestApplication application;
1254 tet_infoline("Testing RenderTask::GetScreenToFrameBufferMappingActor with empty task handle");
1256 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1257 RenderTask renderTask = taskList.CreateTask();
1259 renderTask.SetScreenToFrameBufferMappingActor(actor);
1261 DALI_TEST_EQUALS( (bool)renderTask.GetScreenToFrameBufferMappingActor(), false, TEST_LOCATION);
1265 int UtcDaliRenderTaskGetViewportP01(void)
1267 TestApplication application;
1269 tet_infoline("Testing RenderTask::GetViewport() on default task");
1271 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1272 RenderTask task = taskList.GetTask( 0u );
1273 Viewport viewport = task.GetViewport();
1275 // By default the viewport should match the stage width/height
1276 Vector2 stageSize = Stage::GetCurrent().GetSize();
1277 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
1278 DALI_TEST_CHECK( viewport == expectedViewport );
1282 int UtcDaliRenderTaskGetViewportP02(void)
1284 TestApplication application;
1286 tet_infoline("Testing RenderTask::GetViewport() on new task");
1288 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1289 RenderTask task = taskList.CreateTask();
1290 Viewport viewport = task.GetViewport();
1292 // By default the viewport should match the stage width/height
1293 Vector2 stageSize = Stage::GetCurrent().GetSize();
1294 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
1295 DALI_TEST_CHECK( viewport == expectedViewport );
1299 int UtcDaliRenderTaskGetViewportN(void)
1301 TestApplication application;
1303 tet_infoline("Testing RenderTask::GetViewport() on empty handle");
1308 Viewport viewport = task.GetViewport();
1311 catch (Dali::DaliException& e)
1313 DALI_TEST_PRINT_ASSERT( e );
1314 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1320 int UtcDaliRenderTaskSetViewportP(void)
1322 TestApplication application;
1324 tet_infoline("Testing RenderTask::SetViewport()");
1326 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1328 RenderTask task = taskList.GetTask( 0u );
1329 Vector2 stageSize = Stage::GetCurrent().GetSize();
1330 Viewport newViewport( 0, 0, stageSize.width * 0.5f, stageSize.height * 0.5f );
1331 task.SetViewport( newViewport );
1333 // Update (viewport is a property)
1334 application.SendNotification();
1335 application.Render();
1337 DALI_TEST_CHECK( task.GetViewport() == newViewport );
1341 int UtcDaliRenderTaskSetViewportN(void)
1343 TestApplication application;
1345 tet_infoline("Testing RenderTask::SetViewport()");
1347 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1352 Vector2 stageSize = Stage::GetCurrent().GetSize();
1353 Viewport newViewport( 0, 0, stageSize.width * 0.5f, stageSize.height * 0.5f );
1354 task.SetViewport( newViewport );
1356 catch (Dali::DaliException& e)
1358 DALI_TEST_PRINT_ASSERT( e );
1359 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1366 int UtcDaliRenderTaskSetViewportPosition(void)
1368 TestApplication application;
1370 tet_infoline("Testing RenderTask::SetViewportPosition()");
1372 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1374 RenderTask task = taskList.GetTask( 0u );
1376 Viewport viewport = task.GetViewport();
1378 // By default the viewport should match the stage width/height
1380 Vector2 stageSize = Stage::GetCurrent().GetSize();
1381 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
1382 DALI_TEST_CHECK( viewport == expectedViewport );
1385 Vector2 newPosition(25.0f, 50.0f);
1386 task.SetViewportPosition( newPosition );
1388 // Update (viewport is a property)
1389 application.SendNotification();
1390 application.Render();
1392 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1394 // Set by Property test
1395 Vector2 newPosition2(32.0f, 32.0f);
1396 task.SetProperty( RenderTask::Property::VIEWPORT_POSITION, newPosition2 );
1397 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition2, TEST_LOCATION );
1398 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition, TEST_LOCATION ); // still the old position
1401 application.SendNotification();
1402 application.Render();
1404 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition2, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1405 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition2, TEST_LOCATION );
1406 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition2, TEST_LOCATION );
1408 Vector2 newPosition3(64.0f, 0.0f);
1409 Animation animation = Animation::New(1.0f);
1410 animation.AnimateTo( Property( task, RenderTask::Property::VIEWPORT_POSITION ), newPosition3, AlphaFunction::LINEAR );
1413 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1414 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition2, TEST_LOCATION );
1416 // Perform 1000ms worth of updates at which point animation should have completed.
1417 Wait(application, 1000);
1418 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1419 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1420 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1422 // Create another animation which animates by a certain value
1423 const Vector2 newPosition4( 75.0f, 45.0f );
1424 const Vector2 relativePosition( newPosition4 - newPosition3 );
1425 animation = Animation::New( 1.0f );
1426 animation.AnimateBy( Property( task, RenderTask::Property::VIEWPORT_POSITION ), relativePosition );
1429 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1430 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition3, TEST_LOCATION );
1432 // Perform 1000ms worth of updates at which point animation should have completed.
1433 Wait(application, 1000);
1434 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1435 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1436 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1441 int UtcDaliRenderTaskSetViewportSize(void)
1443 TestApplication application;
1445 tet_infoline("Testing RenderTask::SetViewportSize()");
1447 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1449 RenderTask task = taskList.GetTask( 0u );
1451 Viewport viewport = task.GetViewport();
1453 // By default the viewport should match the stage width/height
1455 Vector2 stageSize = Stage::GetCurrent().GetSize();
1456 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
1457 DALI_TEST_CHECK( viewport == expectedViewport );
1459 Vector2 newSize(128.0f, 64.0f);
1460 task.SetViewportSize( newSize );
1462 // Update (viewport is a property)
1463 application.SendNotification();
1464 application.Render();
1466 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1468 // Set by Property test
1469 Vector2 newSize2(50.0f, 50.0f);
1470 task.SetProperty( RenderTask::Property::VIEWPORT_SIZE, newSize2 );
1471 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize2, TEST_LOCATION );
1472 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize, TEST_LOCATION ); // still the old position
1475 application.SendNotification();
1476 application.Render();
1478 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize2, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1479 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize2, TEST_LOCATION );
1480 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize2, TEST_LOCATION );
1482 Vector2 newSize3(10.0f, 10.0f);
1483 Animation animation = Animation::New(1.0f);
1484 animation.AnimateTo( Property( task, RenderTask::Property::VIEWPORT_SIZE ), newSize3, AlphaFunction::LINEAR );
1487 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1488 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize2, TEST_LOCATION );
1490 // Perform 1000ms worth of updates at which point animation should have completed.
1491 Wait(application, 1000);
1492 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1493 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1494 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1496 // Create another animation which animates by a certain value
1497 const Vector2 newSize4( 75.0f, 45.0f );
1498 const Vector2 relativeSize( newSize4 - newSize3 );
1499 animation = Animation::New( 1.0f );
1500 animation.AnimateBy( Property( task, RenderTask::Property::VIEWPORT_SIZE ), relativeSize );
1503 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1504 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize3, TEST_LOCATION );
1506 // Perform 1000ms worth of updates at which point animation should have completed.
1507 Wait(application, 1000);
1508 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1509 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1510 DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize4, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1515 int UtcDaliRenderTaskSetClearColorP(void)
1517 TestApplication application;
1519 tet_infoline("Testing RenderTask::SetClearColor()");
1521 Vector4 testColor( 1.0f, 2.0f, 3.0f, 4.0f );
1522 Vector4 testColor2( 5.0f, 6.0f, 7.0f, 8.0f );
1524 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1526 RenderTask task = taskList.GetTask( 0u );
1527 DALI_TEST_CHECK( task.GetClearColor() != testColor );
1529 task.SetClearColor( testColor );
1534 DALI_TEST_EQUALS( task.GetClearColor(), testColor, TEST_LOCATION );
1536 task.SetProperty( RenderTask::Property::CLEAR_COLOR, testColor2 );
1537 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor2, TEST_LOCATION );
1538 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor, TEST_LOCATION ); // still the old color
1543 DALI_TEST_EQUALS( task.GetClearColor(), testColor2, TEST_LOCATION );
1544 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor2, TEST_LOCATION );
1545 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor2, TEST_LOCATION );
1547 Vector4 newColor3(10.0f, 10.0f, 20.0f, 30.0f);
1548 Animation animation = Animation::New(1.0f);
1549 animation.AnimateTo( Property( task, RenderTask::Property::CLEAR_COLOR ), newColor3, AlphaFunction::LINEAR );
1552 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1553 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor2, TEST_LOCATION );
1555 // Perform 1000ms worth of updates at which point animation should have completed.
1556 Wait(application, 1000);
1557 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1558 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1560 // Create another animation which animates by a certain value
1561 const Vector4 newColor4( 0.45f, 0.35f, 0.25f, 0.1f );
1562 const Vector4 relativeColor( newColor4 - newColor3 );
1563 animation = Animation::New( 1.0f );
1564 animation.AnimateBy( Property( task, RenderTask::Property::CLEAR_COLOR ), relativeColor );
1567 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor4, Math::MACHINE_EPSILON_10, TEST_LOCATION );
1568 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor3, Math::MACHINE_EPSILON_10, TEST_LOCATION );
1570 // Perform 1000ms worth of updates at which point animation should have completed.
1571 Wait(application, 1000);
1572 DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor4, Math::MACHINE_EPSILON_10, TEST_LOCATION );
1573 DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor4, Math::MACHINE_EPSILON_10, TEST_LOCATION );
1578 int UtcDaliRenderTaskSetClearColorN(void)
1580 TestApplication application;
1582 tet_infoline("Testing RenderTask::SetClearColor() on empty handle");
1587 task.SetClearColor( Vector4::ZERO );
1589 catch (Dali::DaliException& e)
1591 DALI_TEST_PRINT_ASSERT( e );
1592 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1597 int UtcDaliRenderTaskGetClearColorP(void)
1599 TestApplication application;
1601 tet_infoline("Testing RenderTask::GetClearColor()");
1603 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1604 RenderTask task = taskList.GetTask( 0u );
1605 DALI_TEST_EQUALS( task.GetClearColor(), RenderTask::DEFAULT_CLEAR_COLOR, TEST_LOCATION );
1609 int UtcDaliRenderTaskGetClearColorN(void)
1611 TestApplication application;
1613 tet_infoline("Testing RenderTask::GetClearColor()");
1618 Vector4 color = task.GetClearColor();
1621 catch (Dali::DaliException& e)
1623 DALI_TEST_PRINT_ASSERT( e );
1624 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1629 int UtcDaliRenderTaskSetClearEnabledP(void)
1631 TestApplication application;
1633 tet_infoline("Testing RenderTask::SetClearEnabled()");
1635 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1637 RenderTask task = taskList.GetTask( 0u );
1638 DALI_TEST_CHECK( task.GetClearEnabled() ); // defaults to true
1640 task.SetClearEnabled( false );
1641 DALI_TEST_EQUALS( task.GetClearEnabled(), false, TEST_LOCATION );
1643 task.SetClearEnabled( true );
1644 DALI_TEST_EQUALS( task.GetClearEnabled(), true, TEST_LOCATION );
1648 int UtcDaliRenderTaskSetClearEnabledN(void)
1650 TestApplication application;
1652 tet_infoline("Testing RenderTask::SetClearEnabled() with empty handle");
1657 task.SetClearEnabled(true);
1659 catch (Dali::DaliException& e)
1661 DALI_TEST_PRINT_ASSERT( e );
1662 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1667 int UtcDaliRenderTaskGetClearEnabledP(void)
1669 TestApplication application;
1671 tet_infoline("Testing RenderTask::GetClearEnabled()");
1673 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1675 RenderTask task = taskList.GetTask( 0u );
1676 DALI_TEST_CHECK( task.GetClearEnabled() ); // defaults to true
1681 int UtcDaliRenderTaskGetClearEnabledN(void)
1683 TestApplication application;
1685 tet_infoline("Testing RenderTask::GetClearEnabled() with empty handle");
1690 bool x = task.GetClearEnabled();
1693 catch (Dali::DaliException& e)
1695 DALI_TEST_PRINT_ASSERT( e );
1696 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1701 int UtcDaliRenderTaskSetCullModeP(void)
1703 TestApplication application;
1705 tet_infoline("Testing RenderTask::SetCullMode()");
1707 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1708 RenderTask task = taskList.GetTask( 0u );
1709 DALI_TEST_EQUALS( task.GetCullMode(), true, TEST_LOCATION );
1711 task.SetCullMode( false );
1713 DALI_TEST_EQUALS( task.GetCullMode(), false, TEST_LOCATION );
1718 int UtcDaliRenderTaskSetCullModeN(void)
1720 TestApplication application;
1722 tet_infoline("Testing RenderTask::SetCullMode() on empty handle");
1727 task.SetCullMode( false );
1729 catch (Dali::DaliException& e)
1731 DALI_TEST_PRINT_ASSERT( e );
1732 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1737 int UtcDaliRenderTaskGetCullModeP(void)
1739 TestApplication application;
1741 tet_infoline("Testing RenderTask::GetCullMode()");
1743 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1744 RenderTask task = taskList.GetTask( 0u );
1745 DALI_TEST_EQUALS( task.GetCullMode(), true, TEST_LOCATION );
1749 int UtcDaliRenderTaskGetCullModeN(void)
1751 TestApplication application;
1753 tet_infoline("Testing RenderTask::GetCullMode() with empty handle");
1758 bool x = task.GetCullMode();
1761 catch (Dali::DaliException& e)
1763 DALI_TEST_PRINT_ASSERT( e );
1764 DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION);
1770 int UtcDaliRenderTaskSetRefreshRate(void)
1772 TestApplication application;
1774 tet_infoline("Testing RenderTask::SetRefreshRate()");
1776 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1778 // By default tasks will be processed every frame
1779 RenderTask task = taskList.GetTask( 0u );
1780 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
1782 task.SetRefreshRate( 2u ); // every-other frame
1783 DALI_TEST_CHECK( 2u == task.GetRefreshRate() );
1785 task.SetRefreshRate( RenderTask::REFRESH_ALWAYS );
1786 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
1790 int UtcDaliRenderTaskGetRefreshRate(void)
1792 TestApplication application;
1794 tet_infoline("Testing RenderTask::GetRefreshRate()");
1796 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1798 // By default tasks will be processed every frame
1799 RenderTask task = taskList.GetTask( 0u );
1800 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
1802 RenderTask newTask = taskList.CreateTask();
1803 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == newTask.GetRefreshRate() );
1807 int UtcDaliRenderTaskSignalFinished(void)
1809 TestApplication application;
1811 tet_infoline("Testing RenderTask::SignalFinished()");
1813 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1814 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1816 CameraActor offscreenCameraActor = CameraActor::New();
1818 Stage::GetCurrent().Add( offscreenCameraActor );
1820 Texture image = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 10, 10 );
1821 Actor rootActor = CreateRenderableActor( image );
1822 rootActor.SetProperty( Actor::Property::SIZE, Vector2( 10.0f, 10.0f ) );
1823 Stage::GetCurrent().Add( rootActor );
1825 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1826 NativeImageInterfacePtr testNativeImagePtr = TestNativeImage::New(10, 10);
1827 Texture frameBufferTexture = Texture::New( *testNativeImagePtr );
1828 FrameBuffer frameBuffer = FrameBuffer::New(frameBufferTexture.GetWidth(),frameBufferTexture.GetHeight());
1829 frameBuffer.AttachColorTexture(frameBufferTexture);
1831 RenderTask newTask = taskList.CreateTask();
1832 newTask.SetCameraActor( offscreenCameraActor );
1833 newTask.SetSourceActor( rootActor );
1834 newTask.SetInputEnabled( false );
1835 newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
1836 newTask.SetClearEnabled( true );
1837 newTask.SetExclusive( true );
1838 newTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
1839 newTask.SetFrameBuffer( frameBuffer );
1840 newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, true );
1842 bool finished = false;
1843 RenderTaskFinished renderTaskFinished( finished );
1844 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1846 // Flush the queue and render.
1847 application.SendNotification();
1849 // 1 render to process render task, then wait for sync before finished msg is sent
1850 // from update to the event thread.
1852 application.Render();
1853 application.SendNotification();
1854 DALI_TEST_CHECK( !finished );
1856 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1857 DALI_TEST_CHECK( lastSyncObj != NULL );
1859 application.Render();
1860 DALI_TEST_EQUALS( (Integration::KeepUpdating::Reasons)(application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
1861 application.SendNotification();
1862 DALI_TEST_CHECK( !finished );
1864 application.Render();
1865 DALI_TEST_EQUALS( (Integration::KeepUpdating::Reasons)(application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
1866 application.SendNotification();
1867 DALI_TEST_CHECK( ! finished );
1869 sync.SetObjectSynced( lastSyncObj, true );
1871 application.Render();
1872 application.SendNotification();
1873 DALI_TEST_CHECK( !finished );
1875 application.Render();
1876 application.SendNotification();
1877 DALI_TEST_CHECK( finished );
1879 DALI_TEST_EQUALS( application.GetUpdateStatus(), 0, TEST_LOCATION );
1884 int UtcDaliRenderTaskContinuous01(void)
1886 TestApplication application;
1888 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (source actor not staged)\nPOST:continuous renders, no Finished signal");
1890 // SETUP AN OFFSCREEN RENDER TASK
1891 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1892 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1893 drawTrace.Enable(true);
1895 Actor rootActor = Actor::New();
1896 Stage::GetCurrent().Add( rootActor );
1898 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
1899 Stage::GetCurrent().Add( offscreenCameraActor );
1901 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
1903 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1904 bool finished = false;
1905 RenderTaskFinished renderTaskFinished( finished );
1906 application.SendNotification();
1908 // START PROCESS/RENDER Input, Expected Input, Expected, KeepUpdating
1909 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false, __LINE__ ) );
1910 application.GetPlatform().ClearReadyResources();
1912 // ADD SOURCE ACTOR TO STAGE - expect continuous renders to start, no finished signal
1913 Stage::GetCurrent().Add(secondRootActor);
1914 application.SendNotification();
1916 // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
1917 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
1922 int UtcDaliRenderTaskContinuous02(void)
1924 TestApplication application;
1926 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (source actor not visible)\nPOST:continuous renders, no Finished signal");
1928 // SETUP AN OFFSCREEN RENDER TASK
1929 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1930 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1931 drawTrace.Enable(true);
1933 Actor rootActor = Actor::New();
1934 Stage::GetCurrent().Add( rootActor );
1936 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
1937 Stage::GetCurrent().Add( offscreenCameraActor );
1939 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
1940 Stage::GetCurrent().Add(secondRootActor);
1941 secondRootActor.SetProperty( Actor::Property::VISIBLE,false);
1943 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1944 bool finished = false;
1945 RenderTaskFinished renderTaskFinished( finished );
1946 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1947 application.SendNotification();
1949 // START PROCESS/RENDER Input, Expected Input, Expected, KeepUpdating
1950 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false, __LINE__ ) );
1951 application.GetPlatform().ClearReadyResources();
1953 // MAKE SOURCE ACTOR VISIBLE - expect continuous renders to start, no finished signal
1954 secondRootActor.SetProperty( Actor::Property::VISIBLE,true);
1955 application.SendNotification();
1957 // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
1958 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
1962 int UtcDaliRenderTaskContinuous03(void)
1964 TestApplication application;
1966 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (camera actor not staged)\nPOST:continuous renders, no Finished signal");
1968 // SETUP AN OFFSCREEN RENDER TASK
1969 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1970 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1971 drawTrace.Enable(true);
1973 Actor rootActor = Actor::New();
1974 Stage::GetCurrent().Add( rootActor );
1976 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
1977 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
1978 Stage::GetCurrent().Add(secondRootActor);
1980 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
1981 bool finished = false;
1982 RenderTaskFinished renderTaskFinished( finished );
1983 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1984 application.SendNotification();
1986 // START PROCESS/RENDER Input, Expected Input, Expected
1987 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false, __LINE__ ) );
1988 application.GetPlatform().ClearReadyResources();
1990 // ADD CAMERA ACTOR TO STAGE - expect continuous renders to start, no finished signal
1991 Stage::GetCurrent().Add( offscreenCameraActor );
1992 application.SendNotification();
1994 // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
1995 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2000 int UtcDaliRenderTaskContinuous04(void)
2002 TestApplication application;
2004 tet_infoline("Testing RenderTask Render Continuous using loaded image");
2006 // SETUP AN OFFSCREEN RENDER TASK
2007 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2008 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2009 drawTrace.Enable(true);
2011 Actor rootActor = Actor::New();
2012 Stage::GetCurrent().Add( rootActor );
2014 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2015 Stage::GetCurrent().Add( offscreenCameraActor );
2016 Actor secondRootActor = CreateRenderableActorFailed(application, "aFile.jpg");
2017 Stage::GetCurrent().Add(secondRootActor);
2019 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
2020 bool finished = false;
2021 RenderTaskFinished renderTaskFinished( finished );
2022 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2023 application.SendNotification();
2025 // START PROCESS/RENDER Input, Expected Input, Expected
2026 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2030 int UtcDaliRenderTaskOnce01(void)
2032 TestApplication application;
2034 tet_infoline("Testing RenderTask Render Once GlSync, using loaded image");
2036 // SETUP AN OFFSCREEN RENDER TASK
2037 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2038 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2039 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2040 drawTrace.Enable(true);
2042 Actor rootActor = Actor::New();
2043 Stage::GetCurrent().Add( rootActor );
2045 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2046 Stage::GetCurrent().Add( offscreenCameraActor );
2047 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2049 Stage::GetCurrent().Add(secondRootActor);
2051 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, true);
2052 bool finished = false;
2053 RenderTaskFinished renderTaskFinished( finished );
2054 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2055 application.SendNotification();
2057 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2059 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2060 DALI_TEST_CHECK( lastSyncObj != NULL );
2061 sync.SetObjectSynced( lastSyncObj, true );
2063 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true, __LINE__ ) );
2064 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2068 int UtcDaliRenderTaskOnce02(void)
2070 TestApplication application;
2072 tet_infoline("Testing RenderTask Render Once GlSync, using Mesh which accesses texture through sampler with loaded image.\n");
2074 // SETUP AN OFFSCREEN RENDER TASK
2075 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2076 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2077 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2078 drawTrace.Enable(true);
2080 Actor rootActor = Actor::New();
2081 Stage::GetCurrent().Add( rootActor );
2083 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2084 Stage::GetCurrent().Add( offscreenCameraActor );
2086 Shader shader = CreateShader();
2087 Image image = CreateResourceImage(application, "aFile.jpg");
2088 TextureSet textureSet = CreateTextureSet( image );
2090 Geometry geometry = CreateQuadGeometry();
2091 Renderer renderer = Renderer::New(geometry, shader);
2092 renderer.SetTextures( textureSet );
2093 Actor secondRootActor = Actor::New();
2094 secondRootActor.AddRenderer(renderer);
2095 secondRootActor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
2096 Stage::GetCurrent().Add(secondRootActor);
2098 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, true);
2099 bool finished = false;
2100 RenderTaskFinished renderTaskFinished( finished );
2101 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2102 application.SendNotification();
2104 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2106 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2107 DALI_TEST_CHECK( lastSyncObj != NULL );
2108 sync.SetObjectSynced( lastSyncObj, true );
2110 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true, __LINE__ ) );
2111 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2116 int UtcDaliRenderTaskOnce03(void)
2118 TestApplication application;
2120 tet_infoline("Testing RenderTask Render Once GlSync, using loaded image. Switch from render always after ready to render once\n");
2122 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2123 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2124 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2125 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2126 drawTrace.Enable(true);
2128 Actor rootActor = Actor::New();
2129 Stage::GetCurrent().Add( rootActor );
2131 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2132 Stage::GetCurrent().Add( offscreenCameraActor );
2133 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2134 Stage::GetCurrent().Add(secondRootActor);
2136 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
2137 bool finished = false;
2138 RenderTaskFinished renderTaskFinished( finished );
2139 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2140 application.SendNotification();
2142 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2144 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2145 application.SendNotification();
2147 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2149 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2150 DALI_TEST_CHECK( lastSyncObj != NULL );
2151 sync.SetObjectSynced( lastSyncObj, true );
2153 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true, __LINE__ ) );
2154 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2160 int UtcDaliRenderTaskOnce04(void)
2162 TestApplication application;
2163 tet_infoline("Testing RenderTask Render Once GlSync, using Mesh which accesses texture through sampler with loaded image.\n"
2164 "Switch from render always after ready to render once\n"
2167 // SETUP AN OFFSCREEN RENDER TASK
2168 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2169 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2170 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2171 drawTrace.Enable(true);
2173 Actor rootActor = Actor::New();
2174 Stage::GetCurrent().Add( rootActor );
2176 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2177 Stage::GetCurrent().Add( offscreenCameraActor );
2179 Shader shader = CreateShader();
2180 Image image = CreateResourceImage(application, "aFile.jpg");
2181 TextureSet textureSet = CreateTextureSet( image );
2183 Geometry geometry = CreateQuadGeometry();
2184 Renderer renderer = Renderer::New(geometry, shader);
2185 renderer.SetTextures( textureSet );
2186 Actor secondRootActor = Actor::New();
2187 secondRootActor.AddRenderer(renderer);
2188 secondRootActor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
2189 Stage::GetCurrent().Add(secondRootActor);
2191 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
2192 bool finished = false;
2193 RenderTaskFinished renderTaskFinished( finished );
2194 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2195 application.SendNotification();
2197 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2199 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2200 application.SendNotification();
2202 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2204 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2205 DALI_TEST_CHECK( lastSyncObj != NULL );
2206 sync.SetObjectSynced( lastSyncObj, true );
2208 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true, __LINE__ ) );
2209 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2214 int UtcDaliRenderTaskOnceNoSync01(void)
2216 TestApplication application;
2218 tet_infoline("Testing RenderTask Render Once, \nPRE: Resources ready\nPOST: Finished signal sent once only");
2220 // SETUP AN OFFSCREEN RENDER TASK
2221 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2222 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2223 drawTrace.Enable(true);
2225 Actor rootActor = Actor::New();
2226 Stage::GetCurrent().Add( rootActor );
2228 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2229 Stage::GetCurrent().Add( offscreenCameraActor );
2230 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2231 Stage::GetCurrent().Add(secondRootActor);
2233 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, false);
2234 bool finished = false;
2235 RenderTaskFinished renderTaskFinished( finished );
2236 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2237 application.SendNotification();
2239 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2240 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2244 int UtcDaliRenderTaskOnceNoSync02(void)
2246 TestApplication application;
2248 tet_infoline("Testing RenderTask Render Once, using Mesh which accesses texture through sampler with loaded image.\n"
2249 "PRE: Resources ready\nPOST: Finished signal sent once only");
2250 // SETUP AN OFFSCREEN RENDER TASK
2251 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2252 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2253 drawTrace.Enable(true);
2255 Actor rootActor = Actor::New();
2256 Stage::GetCurrent().Add( rootActor );
2258 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2259 Stage::GetCurrent().Add( offscreenCameraActor );
2261 Shader shader = CreateShader();
2262 Image image = CreateResourceImage(application, "aFile.jpg");
2263 TextureSet textureSet = CreateTextureSet( image );
2265 Geometry geometry = CreateQuadGeometry();
2266 Renderer renderer = Renderer::New(geometry, shader);
2267 renderer.SetTextures( textureSet );
2268 Actor secondRootActor = Actor::New();
2269 secondRootActor.AddRenderer(renderer);
2270 secondRootActor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
2271 Stage::GetCurrent().Add(secondRootActor);
2273 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, false);
2274 bool finished = false;
2275 RenderTaskFinished renderTaskFinished( finished );
2276 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2277 application.SendNotification();
2279 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2280 application.GetPlatform().ClearReadyResources();
2281 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2286 int UtcDaliRenderTaskOnceNoSync03(void)
2288 TestApplication application;
2290 tet_infoline("Testing RenderTask Render Once, using loaded image. Switch from render always after ready to render once\n"
2291 "PRE: Render task ready, Image loaded\n"
2292 "POST: Finished signal sent only once");
2294 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2295 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2296 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2297 drawTrace.Enable(true);
2299 Actor rootActor = Actor::New();
2300 Stage::GetCurrent().Add( rootActor );
2302 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2303 Stage::GetCurrent().Add( offscreenCameraActor );
2304 Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2305 Stage::GetCurrent().Add(secondRootActor);
2307 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2308 bool finished = false;
2309 RenderTaskFinished renderTaskFinished( finished );
2310 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2311 application.SendNotification();
2313 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2315 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2316 application.SendNotification(); // Input, Expected Input, Expected
2317 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2318 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2322 int UtcDaliRenderTaskOnceNoSync04(void)
2324 TestApplication application;
2326 tet_infoline("Testing RenderTask Render Once, using Mesh which accesses texture through sampler with loading image.\n"
2327 "Switch from render always after ready to render once\n"
2328 "PRE: Render task ready, Image not loaded\n"
2329 "POST: Finished signal sent only once");
2331 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2332 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2333 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2334 drawTrace.Enable(true);
2336 Actor rootActor = Actor::New();
2337 Stage::GetCurrent().Add( rootActor );
2339 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2340 Stage::GetCurrent().Add( offscreenCameraActor );
2342 Shader shader = CreateShader();
2343 Image image = CreateResourceImage(application, "aFile.jpg");
2344 TextureSet textureSet = CreateTextureSet( image );
2346 Geometry geometry = CreateQuadGeometry();
2347 Renderer renderer = Renderer::New(geometry, shader);
2348 renderer.SetTextures( textureSet );
2349 Actor secondRootActor = Actor::New();
2350 secondRootActor.AddRenderer(renderer);
2351 secondRootActor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
2352 Stage::GetCurrent().Add(secondRootActor);
2355 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2356 bool finished = false;
2357 RenderTaskFinished renderTaskFinished( finished );
2358 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2359 application.SendNotification();
2361 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2362 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2363 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2364 DALI_TEST_CHECK( lastSyncObj == NULL );
2366 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2367 application.SendNotification(); // Input, Expected Input, Expected
2368 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) );
2369 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) );
2371 lastSyncObj = sync.GetLastSyncObject();
2372 DALI_TEST_CHECK( lastSyncObj == NULL );
2377 int UtcDaliRenderTaskOnceNoSync05(void)
2379 TestApplication application;
2381 tet_infoline("Testing RenderTask Render Once\n"
2382 "SetRefreshRate(ONCE), resource load failed, completes render task.\n"
2383 "PRE: resources failed to load\n"
2384 "POST: No finished signal sent.");
2386 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2387 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2388 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2389 drawTrace.Enable(true);
2391 Actor rootActor = Actor::New();
2392 Stage::GetCurrent().Add( rootActor );
2394 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2395 Stage::GetCurrent().Add( offscreenCameraActor );
2396 Actor secondRootActor = CreateRenderableActorFailed(application, "aFile.jpg");
2397 Stage::GetCurrent().Add(secondRootActor);
2399 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
2400 bool finished = false;
2401 RenderTaskFinished renderTaskFinished( finished );
2402 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2403 application.SendNotification();
2405 // START PROCESS/RENDER Input, Expected Input, Expected
2406 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2408 // CHANGE TO RENDER ONCE,
2409 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2410 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) );
2417 int UtcDaliRenderTaskOnceChain01(void)
2419 TestApplication application;
2421 tet_infoline("Testing RenderTask Render Once Chained render tasks\n"
2422 "SetRefreshRate(ONCE), resource load completes, both render tasks render.\n"
2423 "PRE: resources ready\n"
2424 "POST: 2 finished signals sent.");
2426 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2427 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2428 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2429 drawTrace.Enable(true);
2431 Actor defaultRootActor = Actor::New(); // Root for default RT
2432 Stage::GetCurrent().Add( defaultRootActor );
2434 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2435 Stage::GetCurrent().Add( offscreenCameraActor );
2436 Actor firstRootActor = CreateRenderableActorSuccess(application, "aFile.jpg");
2437 Stage::GetCurrent().Add(firstRootActor);
2439 // first render task
2440 RenderTask firstTask = CreateRenderTask(application, offscreenCameraActor, defaultRootActor, firstRootActor, RenderTask::REFRESH_ONCE, false);
2441 bool firstFinished = false;
2442 RenderTaskFinished renderTask1Finished( firstFinished );
2443 firstTask.FinishedSignal().Connect( &application, renderTask1Finished );
2445 // Second render task
2446 FrameBuffer fbo = firstTask.GetFrameBuffer();
2447 Actor secondRootActor = CreateRenderableActor( fbo.GetColorTexture() );
2448 Stage::GetCurrent().Add(secondRootActor);
2449 RenderTask secondTask = CreateRenderTask(application, offscreenCameraActor, defaultRootActor, secondRootActor, RenderTask::REFRESH_ONCE, false);
2450 bool secondFinished = false;
2451 RenderTaskFinished renderTask2Finished( secondFinished );
2452 secondTask.FinishedSignal().Connect( &application, renderTask2Finished );
2454 application.SendNotification();
2456 //Both render tasks are executed.
2457 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false, true, __LINE__ ) );
2458 DALI_TEST_CHECK( firstFinished == false );
2459 DALI_TEST_CHECK( secondFinished == false );
2461 //Nothing else to render and both render task should have finished now
2462 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, firstFinished, true, false, __LINE__ ) );
2463 DALI_TEST_CHECK( firstFinished == true );
2464 DALI_TEST_CHECK( secondFinished == true );
2469 int UtcDaliRenderTaskProperties(void)
2471 TestApplication application;
2473 RenderTask task = Stage::GetCurrent().GetRenderTaskList().CreateTask();
2475 Property::IndexContainer indices;
2476 task.GetPropertyIndices( indices );
2477 DALI_TEST_CHECK( indices.Size() );
2478 DALI_TEST_EQUALS( indices.Size(), task.GetPropertyCount(), TEST_LOCATION );
2482 int UtcDaliRenderTaskFinishInvisibleSourceActor(void)
2484 TestApplication application;
2486 tet_infoline("Testing RenderTask::FinishInvisibleSourceActor()");
2488 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2489 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2491 CameraActor offscreenCameraActor = CameraActor::New();
2493 Stage::GetCurrent().Add( offscreenCameraActor );
2495 Texture image = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 10, 10 );
2496 Actor rootActor = CreateRenderableActor( image );
2497 rootActor.SetProperty( Actor::Property::SIZE, Vector2( 10.0f, 10.0f ) );
2498 rootActor.SetProperty( Actor::Property::VISIBLE,false);
2499 Stage::GetCurrent().Add( rootActor );
2501 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
2502 NativeImageInterfacePtr testNativeImagePtr = TestNativeImage::New(10, 10);
2503 Texture frameBufferTexture = Texture::New( *testNativeImagePtr );
2504 FrameBuffer frameBuffer = FrameBuffer::New(frameBufferTexture.GetWidth(), frameBufferTexture.GetHeight());
2505 frameBuffer.AttachColorTexture(frameBufferTexture);
2507 // Flush all outstanding messages
2508 application.SendNotification();
2509 application.Render();
2511 RenderTask newTask = taskList.CreateTask();
2512 newTask.SetCameraActor( offscreenCameraActor );
2513 newTask.SetSourceActor( rootActor );
2514 newTask.SetInputEnabled( false );
2515 newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
2516 newTask.SetClearEnabled( true );
2517 newTask.SetExclusive( true );
2518 newTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
2519 newTask.SetFrameBuffer( frameBuffer );
2520 newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, true );
2522 // Framebuffer doesn't actually get created until Connected, i.e. by previous line
2524 bool finished = false;
2525 RenderTaskFinished renderTaskFinished( finished );
2526 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2528 // Flush the queue and render.
2529 application.SendNotification();
2531 // 1 render to process render task, then wait for sync before finished msg is sent
2532 // from update to the event thread.
2534 application.Render();
2535 application.SendNotification();
2536 DALI_TEST_CHECK( !finished );
2538 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2539 DALI_TEST_CHECK( lastSyncObj != NULL );
2541 application.Render();
2542 DALI_TEST_EQUALS( (Integration::KeepUpdating::Reasons)(application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
2543 application.SendNotification();
2544 DALI_TEST_CHECK( !finished );
2546 application.Render();
2547 DALI_TEST_EQUALS( (Integration::KeepUpdating::Reasons)(application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
2548 application.SendNotification();
2549 DALI_TEST_CHECK( ! finished );
2551 sync.SetObjectSynced( lastSyncObj, true );
2553 application.Render();
2554 application.SendNotification();
2555 DALI_TEST_CHECK( !finished );
2557 application.Render();
2558 application.SendNotification();
2559 DALI_TEST_CHECK( finished );
2562 application.Render(); // Double check no more finished signal
2563 application.SendNotification();
2564 DALI_TEST_CHECK( ! finished );
2569 int UtcDaliRenderTaskFinishMissingImage(void)
2571 TestApplication application;
2573 // Previously we had bugs where not having a resource ID would cause render-tasks to wait forever
2574 tet_infoline("Testing RenderTask::SignalFinished() when an Actor has no Image set");
2576 Stage stage = Stage::GetCurrent();
2578 Texture image = Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, 10, 10 );
2579 Actor rootActor = CreateRenderableActor( image );
2580 rootActor.SetProperty( Actor::Property::SIZE, Vector2( 10.0f, 10.0f ) );
2581 stage.Add( rootActor );
2583 Actor actorWithMissingImage = CreateRenderableActor( Image() );
2584 actorWithMissingImage.SetProperty( Actor::Property::SIZE, Vector2( 10.0f, 10.0f ) );
2585 stage.Add( actorWithMissingImage );
2587 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
2588 RenderTask newTask = taskList.CreateTask();
2589 newTask.SetInputEnabled( false );
2590 newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
2591 newTask.SetClearEnabled( true );
2592 newTask.SetExclusive( true );
2593 newTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
2595 bool finished = false;
2596 RenderTaskFinished renderTaskFinished( finished );
2597 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2599 // 1 render to process render task, then 1 before finished msg is sent from update to the event thread.
2600 application.SendNotification();
2601 application.Render();
2602 application.Render();
2604 application.SendNotification();
2605 DALI_TEST_CHECK( finished );
2610 int UtcDaliRenderTaskWorldToViewport(void)
2612 TestApplication application( 400u, 400u ); // square surface
2614 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
2616 Actor actor = Actor::New();
2617 actor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
2618 actor.SetProperty( Actor::Property::POSITION, Vector3(0.0, 0.0, 0.0) );
2620 actor.SetProperty( Actor::Property::PARENT_ORIGIN, Vector3(0.5, 0.5, 0.5) );
2621 actor.SetProperty( Actor::Property::ANCHOR_POINT, Vector3(0.5, 0.5, 0.5) );
2623 Stage::GetCurrent().Add(actor);
2625 application.SendNotification();
2626 application.Render();
2627 application.SendNotification();
2629 RenderTask task = taskList.GetTask( 0u );
2631 CameraActor camera = task.GetCameraActor();
2633 Vector2 screenSize = task.GetCurrentViewportSize();
2635 float screenX = 0.0;
2636 float screenY = 0.0;
2638 bool ok = task.WorldToViewport(actor.GetCurrentProperty< Vector3 >( Actor::Property::WORLD_POSITION ), screenX, screenY);
2639 DALI_TEST_CHECK(ok == true);
2641 DALI_TEST_EQUALS(screenX, screenSize.x/2, Math::MACHINE_EPSILON_10000, TEST_LOCATION);
2642 DALI_TEST_EQUALS(screenY, screenSize.y/2, Math::MACHINE_EPSILON_10000, TEST_LOCATION);
2644 Actor actor2 = Actor::New();
2645 float actor2Size = 100.f;
2646 actor2.SetProperty( Actor::Property::SIZE, Vector2( actor2Size, actor2Size ) );
2647 actor2.SetProperty( Actor::Property::POSITION, Vector3(0.0, 0.0, 0.0) );
2648 actor2.SetProperty( Actor::Property::PARENT_ORIGIN, Vector3(0.5, 0.5, 0.0) );
2649 actor2.SetProperty( Actor::Property::ANCHOR_POINT, Vector3(0.5, 0.5, 0.0) );
2650 Stage::GetCurrent().Add( actor2 );
2652 actor.SetProperty( Actor::Property::PARENT_ORIGIN, Vector3(0,0,0) );
2654 application.SendNotification();
2655 application.Render();
2656 application.SendNotification();
2658 ok = task.WorldToViewport(actor.GetCurrentProperty< Vector3 >( Actor::Property::WORLD_POSITION ), screenX, screenY);
2659 DALI_TEST_CHECK(ok == true);
2661 DALI_TEST_EQUALS(screenX, screenSize.x/2 - actor2Size/2, Math::MACHINE_EPSILON_10000, TEST_LOCATION);
2662 DALI_TEST_EQUALS(screenY, screenSize.y/2 - actor2Size/2, Math::MACHINE_EPSILON_10000, TEST_LOCATION);
2668 int UtcDaliRenderTaskViewportToLocal(void)
2670 TestApplication application;
2671 Actor actor = Actor::New();
2672 actor.SetProperty( Actor::Property::ANCHOR_POINT,AnchorPoint::TOP_LEFT);
2673 actor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
2674 actor.SetProperty( Actor::Property::POSITION, Vector2(10.0f, 10.0f));
2675 Stage::GetCurrent().Add(actor);
2677 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
2678 RenderTask task = taskList.GetTask( 0u );
2680 // flush the queue and render once
2681 application.SendNotification();
2682 application.Render();
2683 application.SendNotification();
2684 application.Render();
2692 float screenX = 50.0f;
2693 float screenY = 50.0f;
2695 DALI_TEST_CHECK( actor.ScreenToLocal(localX, localY, screenX, screenY) );
2697 DALI_TEST_CHECK( task.ViewportToLocal(actor, screenX, screenY, rtLocalX, rtLocalY ) );
2699 DALI_TEST_EQUALS(localX, rtLocalX, 0.01f, TEST_LOCATION);
2700 DALI_TEST_EQUALS(localY, rtLocalY, 0.01f, TEST_LOCATION);
2706 int UtcDaliRenderTaskOffscreenViewportToLocal(void)
2708 TestApplication application;
2709 Actor actor = Actor::New();
2710 actor.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT );
2711 actor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
2712 actor.SetProperty( Actor::Property::POSITION, Vector2( 10.0f, 10.0f ));
2713 Stage::GetCurrent().Add( actor );
2715 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
2716 RenderTask task = taskList.CreateTask();
2718 FrameBuffer newFrameBuffer = FrameBuffer::New(10, 10);
2719 task.SetFrameBuffer( newFrameBuffer );
2720 task.SetSourceActor( actor );
2721 task.SetScreenToFrameBufferMappingActor( actor );
2723 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2724 Stage::GetCurrent().Add( offscreenCameraActor );
2725 task.SetCameraActor( offscreenCameraActor );
2727 // flush the queue and render once
2728 application.SendNotification();
2729 application.Render();
2730 application.SendNotification();
2731 application.Render();
2739 float screenX = 50.0f;
2740 float screenY = 50.0f;
2742 DALI_TEST_CHECK( actor.ScreenToLocal(localX, localY, screenX, screenY) );
2744 DALI_TEST_CHECK( task.ViewportToLocal(actor, screenX, screenY, rtLocalX, rtLocalY ) );
2746 DALI_TEST_EQUALS(localX, rtLocalX, 0.01f, TEST_LOCATION);
2747 DALI_TEST_EQUALS(localY, rtLocalY, 0.01f, TEST_LOCATION);
2752 int UtcDaliRenderTaskRequiresSync(void)
2754 TestApplication application;
2755 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
2757 RenderTask newTask = taskList.CreateTask();
2758 newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, false );
2760 DALI_TEST_EQUALS( newTask.GetProperty< bool >( RenderTask::Property::REQUIRES_SYNC ), false, TEST_LOCATION );
2761 DALI_TEST_EQUALS( newTask.GetCurrentProperty< bool >( RenderTask::Property::REQUIRES_SYNC ), false, TEST_LOCATION );
2763 newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, true );
2765 DALI_TEST_EQUALS( newTask.GetProperty< bool >( RenderTask::Property::REQUIRES_SYNC ), true, TEST_LOCATION );
2766 DALI_TEST_EQUALS( newTask.GetCurrentProperty< bool >( RenderTask::Property::REQUIRES_SYNC ), true, TEST_LOCATION );
2771 int UtcDaliRenderTaskSetClearEnabled(void)
2773 TestApplication application;
2775 tet_infoline("UtcDaliRenderTaskSetClearEnabled");
2777 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2778 TestGlAbstraction& gl = application.GetGlAbstraction();
2780 Actor renderableActor = CreateRenderableActorSuccess( application, "aFile.jpg" );
2781 Stage::GetCurrent().Add( renderableActor );
2783 Actor rootActor = Actor::New();
2784 Stage::GetCurrent().Add( rootActor );
2786 CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
2787 Stage::GetCurrent().Add( offscreenCameraActor );
2789 Actor sourceActor = CreateRenderableActorSuccess( application, "aFile.jpg" );
2790 Stage::GetCurrent().Add( sourceActor );
2792 RenderTask newTask = CreateRenderTask( application, offscreenCameraActor, rootActor, sourceActor, RenderTask::REFRESH_ALWAYS, false );
2794 DALI_TEST_EQUALS( gl.GetClearCountCalled(), 0, TEST_LOCATION );
2796 application.SendNotification();
2797 application.Render();
2799 // glClear should be called twice - default task and the new task.
2800 DALI_TEST_EQUALS( gl.GetClearCountCalled(), 2, TEST_LOCATION );
2802 newTask.SetClearEnabled( false );
2804 application.SendNotification();
2805 application.Render();
2807 // The count should increase by 1 - default task only.
2808 DALI_TEST_EQUALS( gl.GetClearCountCalled(), 3, TEST_LOCATION );