2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 // Licensed under the Flora License, Version 1.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://floralicense.org/license/
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.
22 #include <dali/public-api/dali-core.h>
23 #include <dali-test-suite-utils.h>
24 #include <dali/internal/event/images/image-impl.h>
25 #include <dali/integration-api/debug.h>
29 static void Startup();
30 static void Cleanup();
33 void (*tet_startup)() = Startup;
34 void (*tet_cleanup)() = Cleanup;
38 POSITIVE_TC_IDX = 0x01,
42 #define MAX_NUMBER_OF_TESTS 10000
44 struct tet_testlist tet_testlist[MAX_NUMBER_OF_TESTS];
47 // Add test functionality for all APIs in the class (Positive and Negative)
48 TEST_FUNCTION( UtcDaliRenderTaskDownCast, POSITIVE_TC_IDX );
49 TEST_FUNCTION( UtcDaliRenderTaskSetSourceActor, POSITIVE_TC_IDX );
50 TEST_FUNCTION( UtcDaliRenderTaskSetSourceActorOffStage, POSITIVE_TC_IDX );
51 TEST_FUNCTION( UtcDaliRenderTaskSetSourceActorEmpty, POSITIVE_TC_IDX );
52 TEST_FUNCTION( UtcDaliRenderTaskGetSourceActor, POSITIVE_TC_IDX );
53 TEST_FUNCTION( UtcDaliRenderTaskSetExclusive, POSITIVE_TC_IDX );
54 TEST_FUNCTION( UtcDaliRenderTaskIsExclusive, POSITIVE_TC_IDX );
55 TEST_FUNCTION( UtcDaliRenderTaskSetInputEnabled, POSITIVE_TC_IDX );
56 TEST_FUNCTION( UtcDaliRenderTaskGetInputEnabled, POSITIVE_TC_IDX );
57 TEST_FUNCTION( UtcDaliRenderTaskSetCameraActor, POSITIVE_TC_IDX );
58 TEST_FUNCTION( UtcDaliRenderTaskGetCameraActor, POSITIVE_TC_IDX );
59 TEST_FUNCTION( UtcDaliRenderTaskSetTargetFrameBuffer, POSITIVE_TC_IDX );
60 TEST_FUNCTION( UtcDaliRenderTaskGetTargetFrameBuffer, POSITIVE_TC_IDX );
61 TEST_FUNCTION( UtcDaliRenderTaskSetScreenToFrameBufferFunction, POSITIVE_TC_IDX );
62 TEST_FUNCTION( UtcDaliRenderTaskGetScreenToFrameBufferFunction, POSITIVE_TC_IDX );
63 TEST_FUNCTION( UtcDaliRenderTaskSetScreenToFrameBufferMappingActor, POSITIVE_TC_IDX );
64 TEST_FUNCTION( UtcDaliRenderTaskGetScreenToFrameBufferMappingActor, POSITIVE_TC_IDX );
65 TEST_FUNCTION( UtcDaliRenderTaskSetViewport, POSITIVE_TC_IDX );
66 TEST_FUNCTION( UtcDaliRenderTaskGetViewport, POSITIVE_TC_IDX );
67 TEST_FUNCTION( UtcDaliRenderTaskSetClearColor, POSITIVE_TC_IDX );
68 TEST_FUNCTION( UtcDaliRenderTaskGetClearColor, POSITIVE_TC_IDX );
69 TEST_FUNCTION( UtcDaliRenderTaskSetClearEnabled, POSITIVE_TC_IDX );
70 TEST_FUNCTION( UtcDaliRenderTaskGetClearEnabled, POSITIVE_TC_IDX );
71 TEST_FUNCTION( UtcDaliRenderTaskSetRefreshRate, POSITIVE_TC_IDX );
72 TEST_FUNCTION( UtcDaliRenderTaskGetRefreshRate, POSITIVE_TC_IDX );
73 TEST_FUNCTION( UtcDaliRenderTaskSetViewportPosition, POSITIVE_TC_IDX );
74 TEST_FUNCTION( UtcDaliRenderTaskSetViewportSize, POSITIVE_TC_IDX );
75 TEST_FUNCTION( UtcDaliRenderTaskSignalFinished, POSITIVE_TC_IDX );
76 TEST_FUNCTION( UtcDaliRenderTaskContinuous01, POSITIVE_TC_IDX );
77 TEST_FUNCTION( UtcDaliRenderTaskContinuous02, POSITIVE_TC_IDX );
78 TEST_FUNCTION( UtcDaliRenderTaskContinuous03, POSITIVE_TC_IDX );
79 TEST_FUNCTION( UtcDaliRenderTaskContinuous04, POSITIVE_TC_IDX );
80 TEST_FUNCTION( UtcDaliRenderTaskContinuous05, POSITIVE_TC_IDX );
81 TEST_FUNCTION( UtcDaliRenderTaskContinuous06, POSITIVE_TC_IDX );
82 TEST_FUNCTION( UtcDaliRenderTaskOnce01, POSITIVE_TC_IDX );
83 TEST_FUNCTION( UtcDaliRenderTaskOnce02, POSITIVE_TC_IDX );
84 TEST_FUNCTION( UtcDaliRenderTaskOnce03, POSITIVE_TC_IDX );
85 //TEST_FUNCTION( UtcDaliRenderTaskOnce04, POSITIVE_TC_IDX );
86 TEST_FUNCTION( UtcDaliRenderTaskOnce05, POSITIVE_TC_IDX );
87 TEST_FUNCTION( UtcDaliRenderTaskOnce06, POSITIVE_TC_IDX );
88 TEST_FUNCTION( UtcDaliRenderTaskOnce07, POSITIVE_TC_IDX );
89 TEST_FUNCTION( UtcDaliRenderTaskOnce08, POSITIVE_TC_IDX );
90 TEST_FUNCTION( UtcDaliRenderTaskOnceNoSync01, POSITIVE_TC_IDX );
91 TEST_FUNCTION( UtcDaliRenderTaskOnceNoSync02, POSITIVE_TC_IDX );
92 TEST_FUNCTION( UtcDaliRenderTaskOnceNoSync03, POSITIVE_TC_IDX );
93 //TEST_FUNCTION( UtcDaliRenderTaskOnceNoSync04, POSITIVE_TC_IDX );
94 TEST_FUNCTION( UtcDaliRenderTaskOnceNoSync05, POSITIVE_TC_IDX );
95 TEST_FUNCTION( UtcDaliRenderTaskOnceNoSync06, POSITIVE_TC_IDX );
96 TEST_FUNCTION( UtcDaliRenderTaskOnceNoSync07, POSITIVE_TC_IDX );
97 TEST_FUNCTION( UtcDaliRenderTaskOnceNoSync08, POSITIVE_TC_IDX );
98 TEST_FUNCTION( UtcDaliRenderTaskOnceChain01, POSITIVE_TC_IDX );
99 TEST_FUNCTION( UtcDaliRenderTaskProperties, POSITIVE_TC_IDX );
101 // TODO - work out how to reload images in test harness
104 class TestNativeImage : public NativeImage
109 TestNativeImage(int width, int height)
114 virtual bool GlExtensionCreate() {return true;};
117 * Destroy the GL resource for the NativeImage.
118 * e.g. For the EglImageKHR extension, this corresponds to calling eglDestroyImageKHR()
119 * @pre There is a GL context for the current thread.
121 virtual void GlExtensionDestroy() {};
124 * Use the NativeImage as a texture for rendering
125 * @pre There is a GL context for the current thread.
126 * @return A GL error code
128 virtual unsigned int TargetTexture() {return 0;};
131 * Called in each NativeTexture::Bind() call to allow implementation specific operations.
132 * The correct texture sampler has already been bound before the function gets called.
133 * @pre glAbstraction is being used by context in current thread
135 virtual void PrepareTexture() {}
138 * Returns the width of the NativeImage
141 virtual unsigned int GetWidth() const {return mWidth;}
144 * Returns the height of the NativeImage
147 virtual unsigned int GetHeight() const {return mHeight;}
150 * Returns the internal pixel NativeImage::PixelFormat of the NativeImage
151 * @return pixel format
153 virtual Pixel::Format GetPixelFormat() const { return Pixel::RGBA8888; }
160 namespace // unnamed namespace
163 const int RENDER_FRAME_INTERVAL = 16; ///< Duration of each frame in ms. (at approx 60FPS)
166 * Simulate time passed by.
168 * @note this will always process at least 1 frame (1/60 sec)
170 * @param application Test application instance
171 * @param duration Time to pass in milliseconds.
172 * @return The actual time passed in milliseconds
174 int Wait(TestApplication& application, int duration = 0)
178 for(int i = 0; i <= ( duration / RENDER_FRAME_INTERVAL); i++)
180 application.SendNotification();
181 application.Render(RENDER_FRAME_INTERVAL);
182 time += RENDER_FRAME_INTERVAL;
188 struct RenderTaskFinished
190 RenderTaskFinished( bool& finished )
191 : finished( finished )
195 void operator()( RenderTask& renderTask )
203 struct RenderTaskFinishedRemoveSource
205 RenderTaskFinishedRemoveSource( bool& finished )
206 : finished( finished ),
211 void operator()( RenderTask& renderTask )
213 DALI_TEST_CHECK(finishedOnce == false);
216 Actor srcActor = renderTask.GetSourceActor();
217 UnparentAndReset(srcActor);
224 struct RenderTaskFinishedRenderAgain
226 RenderTaskFinishedRenderAgain( bool& finished )
227 : finished( finished ),
232 void operator()( RenderTask& renderTask )
234 DALI_TEST_CHECK(finishedOnce == false);
237 renderTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
244 } // unnamed namespace
246 // Called only once before first test is run.
247 static void Startup()
251 // Called only once after last test is run
252 static void Cleanup()
256 bool TestScreenToFrameBufferFunction( Vector2& coordinates )
258 coordinates = coordinates + Vector2( 1, 2 );
263 // The functor to be used in the hit-test algorithm to check whether the actor is hittable.
264 bool IsActorHittableFunction(Actor actor, Dali::HitTestAlgorithm::TraverseType type)
266 bool hittable = false;
270 case Dali::HitTestAlgorithm::CHECK_ACTOR:
272 // Check whether the actor is visible and not fully transparent.
273 if( actor.IsVisible()
274 && actor.GetCurrentWorldColor().a > 0.01f) // not FULLY_TRANSPARENT
281 case Dali::HitTestAlgorithm::DESCEND_ACTOR_TREE:
283 if( actor.IsVisible() ) // Actor is visible, if not visible then none of its children are visible.
299 ImageActor CreateLoadingImage(TestApplication& application, std::string filename, Image::LoadPolicy loadPolicy, Image::ReleasePolicy releasePolicy)
301 Image image = Image::New(filename, loadPolicy, releasePolicy);
302 DALI_TEST_CHECK( image );
303 application.SendNotification();
304 application.Render(16);
305 DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
306 ImageActor actor = ImageActor::New(image);
307 actor.SetSize( 80, 80 );
308 application.SendNotification();
309 application.Render(16);
313 void CompleteImageLoad(TestApplication& application, Integration::ResourceId resourceId, Integration::ResourceTypeId requestType)
315 std::vector<GLuint> ids;
317 application.GetGlAbstraction().SetNextTextureIds( ids );
319 Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
320 Integration::ResourcePointer resource(bitmap);
321 bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
323 application.GetPlatform().SetResourceLoaded(resourceId, requestType, resource);
326 void FailImageLoad(TestApplication& application, Integration::ResourceId resourceId )
328 application.GetPlatform().SetResourceLoadFailed(resourceId, Integration::FailureUnknown);
331 void ReloadImage(TestApplication& application, Image image)
333 application.GetPlatform().ClearReadyResources();
334 application.GetPlatform().DiscardRequest();
335 application.GetPlatform().ResetTrace();
336 application.GetPlatform().SetClosestImageSize(Vector2(80.0f, 80.0f)); // Ensure reload is called.
341 * Get the last request ID - it does this by loading a new image and
342 * reading the request ID. The last ID is therefore the ID previous to this.
344 unsigned int GetLastResourceId(TestApplication& application)
349 sprintf(imageName, "anImage%04d\n", index); // Generate a unique image name
351 Internal::ImagePtr image = Internal::Image::New(imageName);
352 application.SendNotification(); // Flush update messages
353 application.Render(); // Process resource request
354 Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
356 Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
357 bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
358 Integration::ResourcePointer resourcePtr(bitmap); // reference it
359 unsigned int id = req->GetId();
361 application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr);
362 application.Render(); // Process LoadComplete
363 application.SendNotification(); // Process event messages
364 application.GetPlatform().DiscardRequest(); // Ensure load request is discarded
366 application.GetPlatform().ResetTrace();
367 // Image goes out of scope - will then get destroyed.
371 RenderTask CreateRenderTask(TestApplication& application,
372 CameraActor offscreenCamera,
373 Actor rootActor, // Reset default render task to point at this actor
374 Actor secondRootActor, // Source actor
375 unsigned int refreshRate,
376 unsigned int& offscreenResourceId,
380 // Change main render task to use a different root
381 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
382 taskList.GetTask(0u).SetSourceActor( rootActor );
384 FrameBufferImage frameBufferImage;
387 NativeImagePtr testNativeImagePtr = new TestNativeImage(10, 10);
388 frameBufferImage= FrameBufferImage::New( *testNativeImagePtr.Get() );
392 frameBufferImage = FrameBufferImage::New( 10, 10 );
395 // Don't draw output framebuffer
397 RenderTask newTask = taskList.CreateTask();
398 newTask.SetCameraActor( offscreenCamera );
399 newTask.SetSourceActor( secondRootActor );
400 newTask.SetInputEnabled( false );
401 newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
402 newTask.SetClearEnabled( true );
403 newTask.SetExclusive( true );
404 newTask.SetRefreshRate( refreshRate );
405 newTask.SetTargetFrameBuffer( frameBufferImage );
407 // Framebuffer doesn't actually get created until Connected, i.e. by previous line
408 offscreenResourceId = GetLastResourceId(application);
414 bool UpdateRender(TestApplication& application, TraceCallStack& callStack, bool testDrawn, bool& finishedSig, bool testFinished )
418 application.Render(16);
419 application.SendNotification();
421 bool sigPassed = false;
424 sigPassed = finishedSig;
428 sigPassed = ! finishedSig;
431 bool drawPassed = false;
434 drawPassed = callStack.FindMethod("DrawElements") || callStack.FindMethod("DrawArrays");
438 drawPassed = ! callStack.FindMethod("DrawElements") && ! callStack.FindMethod("DrawArrays") ;
441 tet_printf("UpdateRender: drawPassed:%s sigPassed:%s (Expected: %s %s)\n", drawPassed?"T":"F", sigPassed?"T":"F", testDrawn?"T":"F", testFinished?"T":"F");
443 return (sigPassed && drawPassed);
447 /****************************************************************************************************/
448 /****************************************************************************************************/
449 /******************************** TEST CASES BELOW **********************************************/
450 /****************************************************************************************************/
451 /****************************************************************************************************/
453 static void UtcDaliRenderTaskDownCast()
455 TestApplication application;
457 tet_infoline("Testing RenderTask::DownCast()");
459 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
461 BaseHandle base = taskList.GetTask( 0u );
462 DALI_TEST_CHECK( base );
464 RenderTask task = RenderTask::DownCast( base );
465 DALI_TEST_CHECK( task );
467 // Try calling a method
468 DALI_TEST_CHECK( task.GetSourceActor() );
471 static void UtcDaliRenderTaskSetSourceActor()
473 TestApplication application;
475 tet_infoline("Testing RenderTask::SetSourceActor()");
477 Stage stage = Stage::GetCurrent();
479 const std::vector<GLuint>& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 );
481 RenderTaskList taskList = stage.GetRenderTaskList();
483 RenderTask task = taskList.GetTask( 0u );
485 Actor actor = task.GetSourceActor();
486 DALI_TEST_CHECK( actor );
488 std::vector<GLuint> ids;
490 application.GetGlAbstraction().SetNextTextureIds( ids );
492 BitmapImage img = BitmapImage::New( 1,1 );
493 ImageActor newActor = ImageActor::New( img );
494 newActor.SetSize(1,1);
495 stage.Add( newActor );
497 Actor nonRenderableActor = Actor::New();
498 stage.Add( nonRenderableActor );
500 // Stop the newActor from being rendered by changing the source actor
501 DALI_TEST_CHECK( nonRenderableActor );
502 task.SetSourceActor( nonRenderableActor );
503 DALI_TEST_CHECK( task.GetSourceActor() != actor );
504 DALI_TEST_CHECK( task.GetSourceActor() == nonRenderableActor );
506 // Update & Render nothing!
507 application.GetGlAbstraction().ClearBoundTextures();
508 application.SendNotification();
509 application.Render();
511 // Check that nothing was rendered
512 DALI_TEST_EQUALS( boundTextures.size(), 0u, TEST_LOCATION );
514 // Set newActor as the new source Actor
515 task.SetSourceActor( newActor );
516 DALI_TEST_CHECK( task.GetSourceActor() != actor );
517 DALI_TEST_CHECK( task.GetSourceActor() == newActor );
519 // Update & Render the newActor
520 application.GetGlAbstraction().ClearBoundTextures();
521 application.SendNotification();
522 application.Render();
524 // Check that the newActor was rendered
525 DALI_TEST_EQUALS( boundTextures.size(), 1u, TEST_LOCATION );
526 if ( boundTextures.size() )
528 DALI_TEST_EQUALS( boundTextures[0], 7u, TEST_LOCATION );
532 static void UtcDaliRenderTaskSetSourceActorOffStage()
534 TestApplication application;
536 tet_infoline("Testing RenderTask::SetSourceActor (on/off stage testing)");
538 Stage stage = Stage::GetCurrent();
540 const std::vector<GLuint>& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 );
542 RenderTaskList taskList = stage.GetRenderTaskList();
544 RenderTask task = taskList.GetTask( 0u );
546 Actor actor = task.GetSourceActor();
547 DALI_TEST_CHECK( actor );
549 std::vector<GLuint> ids;
550 GLuint expectedTextureId( 3 );
551 ids.push_back( expectedTextureId );
552 application.GetGlAbstraction().SetNextTextureIds( ids );
554 BitmapImage img = BitmapImage::New( 1,1 );
555 ImageActor newActor = ImageActor::New( img );
556 newActor.SetSize(1,1);
557 task.SetSourceActor( newActor );
558 // Don't add newActor to stage yet
560 // Update & Render with the actor initially off-stage
561 application.GetGlAbstraction().ClearBoundTextures();
562 application.SendNotification();
563 application.Render();
565 // Check that nothing was rendered
566 DALI_TEST_EQUALS( boundTextures.size(), 0u, TEST_LOCATION );
569 stage.Add( newActor );
571 // Update & Render with the actor on-stage
572 application.GetGlAbstraction().ClearBoundTextures();
573 application.SendNotification();
574 application.Render();
576 // Check that the newActor was rendered
577 DALI_TEST_EQUALS( boundTextures.size(), 1u, TEST_LOCATION );
578 if ( boundTextures.size() )
580 DALI_TEST_EQUALS( boundTextures[0], expectedTextureId, TEST_LOCATION );
583 // Now remove from stage
584 stage.Remove( newActor );
586 // Update & Render with the actor off-stage
587 application.GetGlAbstraction().ClearBoundTextures();
588 application.SendNotification();
589 application.Render();
592 static void UtcDaliRenderTaskSetSourceActorEmpty()
594 TestApplication application;
596 tet_infoline("Testing RenderTask::SetSourceActor (empty handle case)");
598 Stage stage = Stage::GetCurrent();
600 const std::vector<GLuint>& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 );
602 RenderTaskList taskList = stage.GetRenderTaskList();
604 RenderTask task = taskList.GetTask( 0u );
606 Actor actor = task.GetSourceActor();
607 DALI_TEST_CHECK( actor );
609 std::vector<GLuint> ids;
610 GLuint expectedTextureId( 5 );
611 ids.push_back( expectedTextureId );
612 application.GetGlAbstraction().SetNextTextureIds( ids );
614 BitmapImage img = BitmapImage::New( 1,1 );
615 ImageActor newActor = ImageActor::New( img );
616 newActor.SetSize(1,1);
617 stage.Add( newActor );
619 Actor nonRenderableActor = Actor::New();
620 stage.Add( nonRenderableActor );
622 // Set with empty handle
623 task.SetSourceActor( Actor() );
624 DALI_TEST_CHECK( ! task.GetSourceActor() );
626 // Update & Render nothing!
627 application.GetGlAbstraction().ClearBoundTextures();
628 application.SendNotification();
629 application.Render();
631 // Check that nothing was rendered
632 DALI_TEST_EQUALS( boundTextures.size(), 0u, TEST_LOCATION );
634 // Set with non-empty handle
635 task.SetSourceActor( newActor );
636 DALI_TEST_CHECK( task.GetSourceActor() == newActor );
638 // Update & Render the newActor
639 application.GetGlAbstraction().ClearBoundTextures();
640 application.SendNotification();
641 application.Render();
643 // Check that the newActor was rendered
644 DALI_TEST_EQUALS( boundTextures.size(), 1u, TEST_LOCATION );
645 if ( boundTextures.size() )
647 DALI_TEST_EQUALS( boundTextures[0], expectedTextureId, TEST_LOCATION );
651 static void UtcDaliRenderTaskGetSourceActor()
653 TestApplication application;
655 tet_infoline("Testing RenderTask::GetSourceActor()");
657 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
659 RenderTask task = taskList.GetTask( 0u );
661 Actor actor = task.GetSourceActor();
662 DALI_TEST_CHECK( actor );
664 // By default the entire scene should be rendered
665 Actor root = Stage::GetCurrent().GetLayer( 0 );
666 DALI_TEST_CHECK( root == actor );
669 static void UtcDaliRenderTaskSetExclusive()
671 TestApplication application;
673 tet_infoline("Testing RenderTask::SetExclusive()");
675 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
677 // Manipulate the GenTextures behaviour, to identify different ImageActors
679 std::vector<GLuint> ids;
680 ids.push_back( 8 ); // 8 = actor1
681 ids.push_back( 9 ); // 9 = actor2
682 ids.push_back( 10 ); // 10 = actor3
683 application.GetGlAbstraction().SetNextTextureIds( ids );
685 BitmapImage img1 = BitmapImage::New( 1,1 );
686 ImageActor actor1 = ImageActor::New( img1 );
688 Stage::GetCurrent().Add( actor1 );
690 // Update & Render actor1
691 application.SendNotification();
692 application.Render();
694 // Check that the actor1 was rendered
695 const std::vector<GLuint>& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 );
696 DALI_TEST_EQUALS( boundTextures.size(), 1u, TEST_LOCATION );
698 if ( boundTextures.size() )
700 DALI_TEST_EQUALS( boundTextures[0], 8u/*unique to actor1*/, TEST_LOCATION );
703 BitmapImage img2 = BitmapImage::New( 1,1 );
704 ImageActor actor2 = ImageActor::New( img2 );
707 // Force actor2 to be rendered before actor1
708 Layer layer = Layer::New();
709 Stage::GetCurrent().Add( layer );
711 layer.LowerToBottom();
714 application.GetGlAbstraction().ClearBoundTextures();
715 application.SendNotification();
716 application.Render();
718 // Check that the actors were rendered
719 DALI_TEST_EQUALS( boundTextures.size(), 2u, TEST_LOCATION );
721 if ( boundTextures.size() )
723 DALI_TEST_EQUALS( boundTextures[0], 9u/*unique to actor2*/, TEST_LOCATION );
724 DALI_TEST_EQUALS( boundTextures[1], 8u/*unique to actor1*/, TEST_LOCATION );
727 BitmapImage img3 = BitmapImage::New( 1,1 );
728 ImageActor actor3 = ImageActor::New( img3 );
731 // Force actor3 to be rendered before actor2
732 layer = Layer::New();
733 Stage::GetCurrent().Add( layer );
735 layer.LowerToBottom();
737 // Update & Render all actors
738 application.GetGlAbstraction().ClearBoundTextures();
739 application.SendNotification();
740 application.Render();
742 // Check that the actors were rendered
743 DALI_TEST_EQUALS( boundTextures.size(), 3u, TEST_LOCATION );
745 if ( boundTextures.size() )
747 DALI_TEST_EQUALS( boundTextures[0], 10u/*unique to actor3*/, TEST_LOCATION );
748 DALI_TEST_EQUALS( boundTextures[1], 9u/*unique to actor2*/, TEST_LOCATION );
749 DALI_TEST_EQUALS( boundTextures[2], 8u/*unique to actor1*/, TEST_LOCATION );
752 // Both actors are now connected to the root node
753 // Setup 2 render-tasks - the first will render from the root-node, and the second from actor2
755 // Not exclusive is the default
756 RenderTask task1 = taskList.GetTask( 0u );
757 DALI_TEST_CHECK( false == task1.IsExclusive() );
759 RenderTask task2 = taskList.CreateTask();
760 DALI_TEST_CHECK( false == task2.IsExclusive() );
761 task2.SetSourceActor( actor2 );
763 // Task1 should render all actors, and task 2 should render only actor2
765 application.GetGlAbstraction().ClearBoundTextures();
766 application.SendNotification();
767 application.Render();
769 DALI_TEST_EQUALS( boundTextures.size(), 4u, TEST_LOCATION );
771 if ( boundTextures.size() == 4 )
773 // Test that task 1 renders actor3, then actor2 & then actor1
774 DALI_TEST_CHECK( boundTextures[0] == 10u );
775 DALI_TEST_CHECK( boundTextures[1] == 9u );
776 DALI_TEST_CHECK( boundTextures[2] == 8u );
778 // Test that task 2 renders actor2
779 DALI_TEST_EQUALS( boundTextures[3], 9u, TEST_LOCATION );
782 // Make actor2 exclusive to task2
784 task2.SetExclusive( true );
785 DALI_TEST_CHECK( true == task2.IsExclusive() );
787 // Task1 should render only actor1, and task 2 should render only actor2
789 application.GetGlAbstraction().ClearBoundTextures();
790 application.SendNotification();
791 application.Render();
793 DALI_TEST_EQUALS( boundTextures.size(), 3u, TEST_LOCATION );
794 if ( boundTextures.size() == 3 )
796 // Test that task 1 renders actor3 & actor1
797 DALI_TEST_CHECK( boundTextures[0] == 10u );
798 DALI_TEST_CHECK( boundTextures[1] == 8u );
800 // Test that task 2 renders actor2
801 DALI_TEST_CHECK( boundTextures[2] == 9u );
805 static void UtcDaliRenderTaskIsExclusive()
807 TestApplication application;
809 tet_infoline("Testing RenderTask::IsExclusive()");
811 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
813 // Not exclusive is the default
814 RenderTask task = taskList.GetTask( 0u );
815 DALI_TEST_CHECK( false == task.IsExclusive() );
817 RenderTask newTask = taskList.CreateTask();
818 DALI_TEST_CHECK( false == newTask.IsExclusive() );
821 static void UtcDaliRenderTaskSetInputEnabled()
823 TestApplication application;
825 tet_infoline("Testing RenderTask::SetInputEnabled()");
827 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
829 // Input is enabled by default
830 RenderTask task = taskList.GetTask( 0u );
831 DALI_TEST_CHECK( true == task.GetInputEnabled() );
833 task.SetInputEnabled( false );
834 DALI_TEST_CHECK( false == task.GetInputEnabled() );
836 task.SetInputEnabled( true );
837 DALI_TEST_CHECK( true == task.GetInputEnabled() );
840 static void UtcDaliRenderTaskGetInputEnabled()
842 TestApplication application;
844 tet_infoline("Testing RenderTask::GetInputEnabled()");
846 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
848 // Input is enabled by default
849 RenderTask task = taskList.GetTask( 0u );
850 DALI_TEST_CHECK( true == task.GetInputEnabled() );
852 RenderTask newTask = taskList.CreateTask();
853 DALI_TEST_CHECK( true == newTask.GetInputEnabled() );
856 static void UtcDaliRenderTaskSetCameraActor()
858 TestApplication application;
860 tet_infoline("Testing RenderTask::SetCameraActor()");
862 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
864 RenderTask task = taskList.GetTask( 0u );
866 Actor actor = task.GetCameraActor();
867 DALI_TEST_CHECK( actor );
869 CameraActor newActor = CameraActor::New();
870 DALI_TEST_CHECK( newActor );
872 task.SetCameraActor( newActor );
873 DALI_TEST_CHECK( task.GetCameraActor() != actor );
874 DALI_TEST_CHECK( task.GetCameraActor() == newActor );
877 static void UtcDaliRenderTaskGetCameraActor()
879 TestApplication application;
881 tet_infoline("Testing RenderTask::GetCameraActor()");
883 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
885 RenderTask task = taskList.GetTask( 0u );
887 Actor actor = task.GetCameraActor();
888 DALI_TEST_CHECK( actor );
890 RenderTask newTask = taskList.CreateTask();
891 DALI_TEST_CHECK( actor == newTask.GetCameraActor() );
894 static void UtcDaliRenderTaskSetTargetFrameBuffer()
896 TestApplication application;
898 tet_infoline("Testing RenderTask::SetTargetFrameBuffer()");
900 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
902 RenderTask task = taskList.GetTask( 0u );
904 // By default render-tasks do not render off-screen
905 FrameBufferImage image = task.GetTargetFrameBuffer();
906 DALI_TEST_CHECK( !image );
908 FrameBufferImage newImage = FrameBufferImage::New();
910 task.SetTargetFrameBuffer( newImage );
911 DALI_TEST_CHECK( task.GetTargetFrameBuffer() == newImage );
914 static void UtcDaliRenderTaskGetTargetFrameBuffer()
916 TestApplication application;
918 tet_infoline("Testing RenderTask::GetTargetFrameBuffer()");
920 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
922 RenderTask task = taskList.GetTask( 0u );
924 // By default render-tasks do not render off-screen
925 FrameBufferImage image = task.GetTargetFrameBuffer();
926 DALI_TEST_CHECK( !image );
928 RenderTask newTask = taskList.CreateTask();
929 DALI_TEST_CHECK( !newTask.GetTargetFrameBuffer() );
932 static void UtcDaliRenderTaskSetScreenToFrameBufferFunction()
934 TestApplication application;
936 tet_infoline("Testing RenderTask::SetScreenToFrameBufferFunction()");
938 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
940 RenderTask task = taskList.GetTask( 0u );
942 task.SetScreenToFrameBufferFunction( TestScreenToFrameBufferFunction );
944 Vector2 coordinates( 5, 10 );
945 Vector2 convertedCoordinates( 6, 12 ); // + Vector(1, 2)
947 RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction();
948 DALI_TEST_CHECK( func( coordinates ) );
949 DALI_TEST_CHECK( coordinates == convertedCoordinates );
951 task.SetScreenToFrameBufferFunction( RenderTask::FULLSCREEN_FRAMEBUFFER_FUNCTION );
952 func = task.GetScreenToFrameBufferFunction();
953 DALI_TEST_CHECK( func( coordinates ) );
955 task.SetScreenToFrameBufferFunction( RenderTask::DEFAULT_SCREEN_TO_FRAMEBUFFER_FUNCTION );
956 func = task.GetScreenToFrameBufferFunction();
957 DALI_TEST_CHECK( ! func( coordinates ) );
960 static void UtcDaliRenderTaskGetScreenToFrameBufferFunction()
962 TestApplication application;
964 tet_infoline("Testing RenderTask::GetScreenToFrameBufferFunction()");
966 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
968 RenderTask task = taskList.GetTask( 0u );
970 Vector2 originalCoordinates( 5, 10 );
971 Vector2 coordinates( 5, 10 );
973 RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction();
974 DALI_TEST_CHECK( !func( coordinates ) ); // conversion should fail by default
975 DALI_TEST_CHECK( coordinates == originalCoordinates ); // coordinates should not be modified
978 static void UtcDaliRenderTaskSetScreenToFrameBufferMappingActor()
980 TestApplication application;
981 tet_infoline("Testing RenderTask::SetScreenToFrameBufferMappingActor ");
983 Stage stage = Stage::GetCurrent();
984 Size stageSize = stage.GetSize();
985 Actor mappingActor = Actor::New();
986 Vector2 scale( 0.6f, 0.75f);
987 Vector2 offset( stageSize.x*0.1f, stageSize.y*0.15f);
988 mappingActor.SetSize( stageSize * scale );
989 mappingActor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
990 mappingActor.SetPosition( offset.x, offset.y );
991 stage.Add( mappingActor );
993 Actor offscreenActor = Actor::New();
994 offscreenActor.SetSize( stageSize );
995 offscreenActor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
996 stage.Add( offscreenActor );
998 RenderTaskList taskList = stage.GetRenderTaskList();
999 RenderTask renderTask = taskList.CreateTask();
1000 FrameBufferImage frameBufferImage = FrameBufferImage::New(stageSize.width*scale.x, stageSize.height*scale.y, Pixel::A8, Image::Never);
1001 renderTask.SetSourceActor( offscreenActor );
1002 renderTask.SetExclusive( true );
1003 renderTask.SetInputEnabled( true );
1004 renderTask.SetTargetFrameBuffer( frameBufferImage );
1005 renderTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
1006 renderTask.SetScreenToFrameBufferMappingActor( mappingActor );
1008 // Render and notify
1009 application.SendNotification();
1010 application.Render();
1011 application.Render();
1012 application.SendNotification();
1014 Vector2 screenCoordinates( stageSize.x * 0.05f, stageSize.y * 0.05f );
1015 Dali::HitTestAlgorithm::Results results;
1016 Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction );
1017 DALI_TEST_CHECK( !results.actor);
1018 DALI_TEST_EQUALS( Vector2::ZERO, results.actorCoordinates, 0.1f, TEST_LOCATION );
1020 screenCoordinates.x = stageSize.x * 0.265f;
1021 screenCoordinates.y = stageSize.y * 0.33f;
1022 results.actor = Actor();
1023 results.actorCoordinates = Vector2::ZERO;
1024 Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction );
1025 DALI_TEST_CHECK( results.actor == offscreenActor);
1026 DALI_TEST_EQUALS( (screenCoordinates-offset)/scale , results.actorCoordinates, 0.1f, TEST_LOCATION );
1028 screenCoordinates.x = stageSize.x * 0.435f;
1029 screenCoordinates.y = stageSize.y * 0.52f;
1030 Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction );
1031 DALI_TEST_CHECK( results.actor == offscreenActor);
1032 DALI_TEST_EQUALS( (screenCoordinates-offset)/scale , results.actorCoordinates, 0.1f, TEST_LOCATION );
1034 screenCoordinates.x = stageSize.x * 0.65f;
1035 screenCoordinates.y = stageSize.y * 0.95f;
1036 Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction );
1037 DALI_TEST_CHECK( !results.actor);
1038 DALI_TEST_EQUALS( Vector2::ZERO, results.actorCoordinates, 0.1f, TEST_LOCATION );
1041 static void UtcDaliRenderTaskGetScreenToFrameBufferMappingActor()
1043 TestApplication application;
1044 tet_infoline("Testing RenderTask::GetScreenToFrameBufferMappingActor ");
1046 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1047 RenderTask renderTask = taskList.CreateTask();
1048 Actor mappingActor = Actor::New();
1049 renderTask.SetScreenToFrameBufferMappingActor(mappingActor);
1051 DALI_TEST_CHECK( mappingActor == renderTask.GetScreenToFrameBufferMappingActor() );
1054 static void UtcDaliRenderTaskSetViewport()
1056 TestApplication application;
1058 tet_infoline("Testing RenderTask::SetViewport()");
1060 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1062 RenderTask task = taskList.GetTask( 0u );
1064 Viewport viewport = task.GetViewport();
1066 // By default the viewport should match the stage width/height
1068 Vector2 stageSize = Stage::GetCurrent().GetSize();
1069 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
1070 DALI_TEST_CHECK( viewport == expectedViewport );
1072 Viewport newViewport( 0, 0, stageSize.width * 0.5f, stageSize.height * 0.5f );
1073 task.SetViewport( newViewport );
1075 // Update (viewport is a property)
1076 application.SendNotification();
1077 application.Render();
1079 DALI_TEST_CHECK( task.GetViewport() == newViewport );
1082 static void UtcDaliRenderTaskGetViewport()
1084 TestApplication application;
1086 tet_infoline("Testing RenderTask::GetViewport()");
1088 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1090 RenderTask task = taskList.GetTask( 0u );
1092 Viewport viewport = task.GetViewport();
1094 // By default the viewport should match the stage width/height
1096 Vector2 stageSize = Stage::GetCurrent().GetSize();
1097 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
1098 DALI_TEST_CHECK( viewport == expectedViewport );
1100 RenderTask newTask = taskList.CreateTask();
1101 DALI_TEST_CHECK( newTask.GetViewport() == expectedViewport );
1104 static void UtcDaliRenderTaskSetViewportPosition()
1106 TestApplication application;
1108 tet_infoline("Testing RenderTask::SetViewportPosition()");
1110 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1112 RenderTask task = taskList.GetTask( 0u );
1114 Viewport viewport = task.GetViewport();
1116 // By default the viewport should match the stage width/height
1118 Vector2 stageSize = Stage::GetCurrent().GetSize();
1119 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
1120 DALI_TEST_CHECK( viewport == expectedViewport );
1123 Vector2 newPosition(25.0f, 50.0f);
1124 task.SetViewportPosition( newPosition );
1126 // Update (viewport is a property)
1127 application.SendNotification();
1128 application.Render();
1130 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1132 // Set by Property test
1133 Vector2 newPosition2(32.0f, 32.0f);
1134 task.SetProperty( RenderTask::VIEWPORT_POSITION, newPosition2 );
1137 application.SendNotification();
1138 application.Render();
1140 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition2, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1142 Vector2 newPosition3(64.0f, 0.0f);
1143 Animation animation = Animation::New(1.0f);
1144 animation.AnimateTo( Property( task, RenderTask::VIEWPORT_POSITION ), newPosition3, AlphaFunctions::Linear );
1147 // Perform 1000ms worth of updates at which point animation should have completed.
1148 Wait(application, 1000);
1149 DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1152 static void UtcDaliRenderTaskSetViewportSize()
1154 TestApplication application;
1156 tet_infoline("Testing RenderTask::SetViewportSize()");
1158 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1160 RenderTask task = taskList.GetTask( 0u );
1162 Viewport viewport = task.GetViewport();
1164 // By default the viewport should match the stage width/height
1166 Vector2 stageSize = Stage::GetCurrent().GetSize();
1167 Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
1168 DALI_TEST_CHECK( viewport == expectedViewport );
1170 Vector2 newSize(128.0f, 64.0f);
1171 task.SetViewportSize( newSize );
1173 // Update (viewport is a property)
1174 application.SendNotification();
1175 application.Render();
1177 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1179 // Set by Property test
1180 Vector2 newSize2(50.0f, 50.0f);
1181 task.SetProperty( RenderTask::VIEWPORT_SIZE, newSize2 );
1184 application.SendNotification();
1185 application.Render();
1187 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize2, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1189 Vector2 newSize3(10.0f, 10.0f);
1190 Animation animation = Animation::New(1.0f);
1191 animation.AnimateTo( Property( task, RenderTask::VIEWPORT_SIZE ), newSize3, AlphaFunctions::Linear );
1194 // Perform 1000ms worth of updates at which point animation should have completed.
1195 Wait(application, 1000);
1196 DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
1200 static void UtcDaliRenderTaskSetClearColor()
1202 TestApplication application;
1204 tet_infoline("Testing RenderTask::SetClearColor()");
1206 Vector4 testColor( 1.0f, 2.0f, 3.0f, 4.0f );
1207 Vector4 testColor2( 5.0f, 6.0f, 7.0f, 8.0f );
1209 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1211 RenderTask task = taskList.GetTask( 0u );
1212 DALI_TEST_CHECK( task.GetClearColor() != testColor );
1214 task.SetClearColor( testColor );
1219 DALI_TEST_EQUALS( task.GetClearColor(), testColor, TEST_LOCATION );
1221 task.SetProperty( RenderTask::CLEAR_COLOR, testColor2 );
1226 DALI_TEST_EQUALS( task.GetClearColor(), testColor2, TEST_LOCATION );
1229 static void UtcDaliRenderTaskGetClearColor()
1231 TestApplication application;
1233 tet_infoline("Testing RenderTask::GetClearColor()");
1235 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1236 RenderTask task = taskList.GetTask( 0u );
1237 DALI_TEST_EQUALS( task.GetClearColor(), RenderTask::DEFAULT_CLEAR_COLOR, TEST_LOCATION );
1240 static void UtcDaliRenderTaskSetClearEnabled()
1242 TestApplication application;
1244 tet_infoline("Testing RenderTask::SetClearEnabled()");
1246 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1248 RenderTask task = taskList.GetTask( 0u );
1249 DALI_TEST_CHECK( !task.GetClearEnabled() ); // defaults to false
1251 task.SetClearEnabled( true );
1252 DALI_TEST_EQUALS( task.GetClearEnabled(), true, TEST_LOCATION );
1254 task.SetClearEnabled( false );
1255 DALI_TEST_EQUALS( task.GetClearEnabled(), false, TEST_LOCATION );
1258 static void UtcDaliRenderTaskGetClearEnabled()
1260 TestApplication application;
1262 tet_infoline("Testing RenderTask::GetClearEnabled()");
1264 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1266 RenderTask task = taskList.GetTask( 0u );
1267 DALI_TEST_CHECK( !task.GetClearEnabled() ); // defaults to false
1270 static void UtcDaliRenderTaskSetRefreshRate()
1272 TestApplication application;
1274 tet_infoline("Testing RenderTask::SetRefreshRate()");
1276 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1278 // By default tasks will be processed every frame
1279 RenderTask task = taskList.GetTask( 0u );
1280 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
1282 task.SetRefreshRate( 2u ); // every-other frame
1283 DALI_TEST_CHECK( 2u == task.GetRefreshRate() );
1285 task.SetRefreshRate( RenderTask::REFRESH_ALWAYS );
1286 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
1289 static void UtcDaliRenderTaskGetRefreshRate()
1291 TestApplication application;
1293 tet_infoline("Testing RenderTask::GetRefreshRate()");
1295 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1297 // By default tasks will be processed every frame
1298 RenderTask task = taskList.GetTask( 0u );
1299 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
1301 RenderTask newTask = taskList.CreateTask();
1302 DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == newTask.GetRefreshRate() );
1305 static void UtcDaliRenderTaskSignalFinished()
1307 TestApplication application;
1308 extern Debug::Filter* gRenderTaskLogFilter;
1309 DALI_LOG_FILTER_SET_LEVEL(gRenderTaskLogFilter, Debug::General);
1310 DALI_LOG_FILTER_ENABLE_TRACE(gRenderTaskLogFilter);
1312 tet_infoline("Testing RenderTask::SignalFinished()");
1314 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1315 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1317 CameraActor offscreenCameraActor = CameraActor::New();
1319 Stage::GetCurrent().Add( offscreenCameraActor );
1321 BitmapImage image = BitmapImage::New( 10, 10 );
1322 ImageActor rootActor = ImageActor::New( image );
1323 rootActor.SetSize( 10, 10 );
1324 Stage::GetCurrent().Add( rootActor );
1326 RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
1327 NativeImagePtr testNativeImagePtr = new TestNativeImage(10, 10);
1328 FrameBufferImage frameBufferImage = FrameBufferImage::New( *testNativeImagePtr.Get() );
1330 // Flush all outstanding messages
1331 application.SendNotification();
1332 application.Render();
1334 RenderTask newTask = taskList.CreateTask();
1335 newTask.SetCameraActor( offscreenCameraActor );
1336 newTask.SetSourceActor( rootActor );
1337 newTask.SetInputEnabled( false );
1338 newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
1339 newTask.SetClearEnabled( true );
1340 newTask.SetExclusive( true );
1341 newTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
1342 newTask.SetTargetFrameBuffer( frameBufferImage );
1344 // Framebuffer doesn't actually get created until Connected, i.e. by previous line
1346 bool finished = false;
1347 RenderTaskFinished renderTaskFinished( finished );
1348 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1350 // Flush the queue and render.
1351 application.SendNotification();
1353 // 1 render to process render task, then wait for sync before finished msg is sent
1354 // from update to the event thread.
1356 application.Render();
1357 application.SendNotification();
1358 DALI_TEST_CHECK( !finished );
1360 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1361 DALI_TEST_CHECK( lastSyncObj != NULL );
1363 application.Render();
1364 DALI_TEST_EQUALS( (application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
1365 application.SendNotification();
1366 DALI_TEST_CHECK( !finished );
1368 application.Render();
1369 DALI_TEST_EQUALS( (application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
1370 application.SendNotification();
1371 DALI_TEST_CHECK( ! finished );
1373 sync.SetObjectSynced( lastSyncObj, true );
1375 application.Render();
1376 application.SendNotification();
1377 DALI_TEST_CHECK( !finished );
1379 application.Render();
1380 application.SendNotification();
1381 DALI_TEST_CHECK( finished );
1384 application.Render(); // Double check no more finished signal
1385 application.SendNotification();
1386 DALI_TEST_CHECK( ! finished );
1390 static void UtcDaliRenderTaskContinuous01()
1392 TestApplication application;
1393 extern Debug::Filter* gRenderTaskLogFilter;
1394 DALI_LOG_FILTER_SET_LEVEL(gRenderTaskLogFilter, Debug::General);
1395 DALI_LOG_FILTER_ENABLE_TRACE(gRenderTaskLogFilter);
1397 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (source actor not staged)\nPOST:continuous renders, no Finished signal");
1399 // SETUP AN OFFSCREEN RENDER TASK
1400 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1401 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1402 drawTrace.Enable(true);
1404 Actor rootActor = Actor::New();
1405 Stage::GetCurrent().Add( rootActor );
1407 CameraActor offscreenCameraActor = CameraActor::New();
1408 Stage::GetCurrent().Add( offscreenCameraActor );
1410 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1411 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1412 Integration::ResourceId imageRequestId = imageRequest->GetId();
1413 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1415 unsigned int offscreenFramebufferId;
1416 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, offscreenFramebufferId, true);
1417 bool finished = false;
1418 RenderTaskFinished renderTaskFinished( finished );
1419 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1420 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1421 application.SendNotification();
1423 // START PROCESS/RENDER Input, Expected Input, Expected
1424 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1425 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1427 // ADD SOURCE ACTOR TO STAGE - expect continuous renders to start, no finished signal
1428 Stage::GetCurrent().Add(secondRootActor);
1429 application.SendNotification();
1431 // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
1432 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1433 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1434 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1435 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1436 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1440 static void UtcDaliRenderTaskContinuous02()
1442 TestApplication application;
1443 extern Debug::Filter* gRenderTaskLogFilter;
1444 DALI_LOG_FILTER_SET_LEVEL(gRenderTaskLogFilter, Debug::General);
1445 DALI_LOG_FILTER_ENABLE_TRACE(gRenderTaskLogFilter);
1447 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (source actor not visible)\nPOST:continuous renders, no Finished signal");
1449 // SETUP AN OFFSCREEN RENDER TASK
1450 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1451 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1452 drawTrace.Enable(true);
1454 Actor rootActor = Actor::New();
1455 Stage::GetCurrent().Add( rootActor );
1457 CameraActor offscreenCameraActor = CameraActor::New();
1458 Stage::GetCurrent().Add( offscreenCameraActor );
1460 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1461 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1462 Integration::ResourceId imageRequestId = imageRequest->GetId();
1463 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1464 Stage::GetCurrent().Add(secondRootActor);
1465 secondRootActor.SetVisible(false);
1467 unsigned int offscreenFramebufferId;
1468 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, offscreenFramebufferId, true);
1469 bool finished = false;
1470 RenderTaskFinished renderTaskFinished( finished );
1471 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1472 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1473 application.SendNotification();
1475 // START PROCESS/RENDER Input, Expected Input, Expected
1476 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1477 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1479 // MAKE SOURCE ACTOR VISIBLE - expect continuous renders to start, no finished signal
1480 secondRootActor.SetVisible(true);
1481 application.SendNotification();
1483 // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
1484 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1485 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1486 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1487 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1488 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1491 static void UtcDaliRenderTaskContinuous03()
1493 TestApplication application;
1494 extern Debug::Filter* gRenderTaskLogFilter;
1495 DALI_LOG_FILTER_SET_LEVEL(gRenderTaskLogFilter, Debug::General);
1496 DALI_LOG_FILTER_ENABLE_TRACE(gRenderTaskLogFilter);
1498 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (camera actor not staged)\nPOST:continuous renders, no Finished signal");
1500 // SETUP AN OFFSCREEN RENDER TASK
1501 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1502 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1503 drawTrace.Enable(true);
1505 Actor rootActor = Actor::New();
1506 Stage::GetCurrent().Add( rootActor );
1508 CameraActor offscreenCameraActor = CameraActor::New();
1509 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1510 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1511 Integration::ResourceId imageRequestId = imageRequest->GetId();
1512 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1513 Stage::GetCurrent().Add(secondRootActor);
1515 unsigned int offscreenFramebufferId;
1516 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, offscreenFramebufferId, true);
1517 bool finished = false;
1518 RenderTaskFinished renderTaskFinished( finished );
1519 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1520 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1521 application.SendNotification();
1523 // START PROCESS/RENDER Input, Expected Input, Expected
1524 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1525 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1527 // ADD CAMERA ACTOR TO STAGE - expect continuous renders to start, no finished signal
1528 Stage::GetCurrent().Add( offscreenCameraActor );
1529 application.SendNotification();
1531 // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
1532 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1533 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1534 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1535 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1536 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1540 static void UtcDaliRenderTaskContinuous04()
1542 TestApplication application;
1543 extern Debug::Filter* gRenderTaskLogFilter;
1544 DALI_LOG_FILTER_SET_LEVEL(gRenderTaskLogFilter, Debug::General);
1545 DALI_LOG_FILTER_ENABLE_TRACE(gRenderTaskLogFilter);
1547 tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: Resource not ready\nPOST:continuous renders, no Finished signal");
1549 // SETUP AN OFFSCREEN RENDER TASK
1550 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1551 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1552 drawTrace.Enable(true);
1554 Actor rootActor = Actor::New();
1555 Stage::GetCurrent().Add( rootActor );
1557 CameraActor offscreenCameraActor = CameraActor::New();
1558 Stage::GetCurrent().Add( offscreenCameraActor );
1559 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1560 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1561 Integration::ResourceId imageRequestId = imageRequest->GetId();
1562 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1563 Stage::GetCurrent().Add(secondRootActor);
1565 unsigned int offscreenFramebufferId;
1566 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, offscreenFramebufferId, true);
1567 bool finished = false;
1568 RenderTaskFinished renderTaskFinished( finished );
1569 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1570 application.SendNotification();
1572 // START PROCESS/RENDER Input, Expected Input, Expected
1573 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1574 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1576 // FINISH RESOURCE LOADING - expect continuous renders to start, no finished signal
1577 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1578 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1580 // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
1581 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1582 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1583 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1584 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1587 static void UtcDaliRenderTaskContinuous05()
1589 TestApplication application;
1590 extern Debug::Filter* gRenderTaskLogFilter;
1591 DALI_LOG_FILTER_SET_LEVEL(gRenderTaskLogFilter, Debug::General);
1592 DALI_LOG_FILTER_ENABLE_TRACE(gRenderTaskLogFilter);
1594 tet_infoline("Testing RenderTask Render Continuous, every 3 frames using loading image\nPRE: Resources not ready\nPOST:continuous renders, no Finished signal");
1596 // SETUP AN OFFSCREEN RENDER TASK
1597 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1598 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1599 drawTrace.Enable(true);
1601 Actor rootActor = Actor::New();
1602 Stage::GetCurrent().Add( rootActor );
1604 CameraActor offscreenCameraActor = CameraActor::New();
1605 Stage::GetCurrent().Add( offscreenCameraActor );
1606 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1607 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1608 Integration::ResourceId imageRequestId = imageRequest->GetId();
1609 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1610 Stage::GetCurrent().Add(secondRootActor);
1612 unsigned int offscreenFramebufferId;
1613 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, 3, offscreenFramebufferId, true);
1614 bool finished = false;
1615 RenderTaskFinished renderTaskFinished( finished );
1616 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1617 application.SendNotification();
1619 // START PROCESS/RENDER Input, Expected Input, Expected
1620 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1621 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1623 // FINISH RESOURCE LOADING - expect continuous renders to start, no finished signal
1624 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1625 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1626 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1627 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1628 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1629 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1630 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1633 static void UtcDaliRenderTaskContinuous06()
1635 TestApplication application;
1636 extern Debug::Filter* gRenderTaskLogFilter;
1637 DALI_LOG_FILTER_SET_LEVEL(gRenderTaskLogFilter, Debug::General);
1638 DALI_LOG_FILTER_ENABLE_TRACE(gRenderTaskLogFilter);
1640 tet_infoline("Testing RenderTask Render Continuous, every 3 frames using loading image\nPRE: Render Always, Resources not ready\nPOST:continuous renders at reduced freq, no Finished signal");
1642 // SETUP AN OFFSCREEN RENDER TASK
1643 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1644 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1645 drawTrace.Enable(true);
1647 Actor rootActor = Actor::New();
1648 Stage::GetCurrent().Add( rootActor );
1650 CameraActor offscreenCameraActor = CameraActor::New();
1651 Stage::GetCurrent().Add( offscreenCameraActor );
1652 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1653 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1654 Integration::ResourceId imageRequestId = imageRequest->GetId();
1655 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1656 Stage::GetCurrent().Add(secondRootActor);
1658 unsigned int offscreenFramebufferId;
1659 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, offscreenFramebufferId, true);
1660 bool finished = false;
1661 RenderTaskFinished renderTaskFinished( finished );
1662 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1663 application.SendNotification();
1665 // START PROCESS/RENDER Input, Expected Input, Expected
1666 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1667 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1669 // FINISH RESOURCE LOADING - expect continuous renders to start, no finished signal
1670 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1671 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1672 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1675 newTask.SetRefreshRate(3); // Input, Expected Input, Expected
1676 application.SendNotification();
1677 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1678 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1679 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1680 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1681 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1682 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1683 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1684 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1686 newTask.SetRefreshRate(RenderTask::REFRESH_ALWAYS); // Should render every frame immediately
1687 application.SendNotification();
1688 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1689 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1690 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1694 static void UtcDaliRenderTaskOnce01()
1696 TestApplication application;
1697 extern Debug::Filter* gRenderTaskLogFilter;
1698 DALI_LOG_FILTER_SET_LEVEL(gRenderTaskLogFilter, Debug::General);
1699 DALI_LOG_FILTER_ENABLE_TRACE(gRenderTaskLogFilter);
1701 tet_infoline("Testing RenderTask Render Once GlSync, using loading image\nPRE: Resources not ready, Source not visible\nPOST: Finished signal sent once only");
1703 // SETUP AN OFFSCREEN RENDER TASK
1704 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1705 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1706 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1707 drawTrace.Enable(true);
1709 Actor rootActor = Actor::New();
1710 Stage::GetCurrent().Add( rootActor );
1712 CameraActor offscreenCameraActor = CameraActor::New();
1713 Stage::GetCurrent().Add( offscreenCameraActor );
1714 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1715 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1716 Integration::ResourceId imageRequestId = imageRequest->GetId();
1717 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1719 Stage::GetCurrent().Add(secondRootActor);
1720 secondRootActor.SetVisible(false);
1722 unsigned int offscreenFramebufferId;
1723 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, offscreenFramebufferId, true);
1724 bool finished = false;
1725 RenderTaskFinished renderTaskFinished( finished );
1726 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1727 application.SendNotification();
1729 // START PROCESS/RENDER Input, Expected Input, Expected
1730 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1731 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1733 // MAKE SOURCE VISIBLE
1734 secondRootActor.SetVisible(true);
1735 application.SendNotification();
1736 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1737 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1739 // FINISH RESOURCE LOADING - expect no rendering yet
1740 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1741 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1742 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1743 DALI_TEST_CHECK( lastSyncObj != NULL );
1745 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1746 sync.SetObjectSynced( lastSyncObj, true );
1747 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1748 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
1750 // Finished rendering - expect no more renders, no more signals:
1751 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1752 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1753 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1754 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1755 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1756 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1759 static void UtcDaliRenderTaskOnce02()
1761 TestApplication application;
1762 extern Debug::Filter* gRenderTaskLogFilter;
1763 DALI_LOG_FILTER_SET_LEVEL(gRenderTaskLogFilter, Debug::General);
1764 DALI_LOG_FILTER_ENABLE_TRACE(gRenderTaskLogFilter);
1766 tet_infoline("Testing RenderTask Render Once GlSync, using loading image. Switch from render always after ready to render once\n"
1767 "PRE: Render task ready, Image not loaded\n"
1768 "POST: Finished signal sent only once");
1770 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1771 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1772 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1773 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1774 drawTrace.Enable(true);
1776 Actor rootActor = Actor::New();
1777 Stage::GetCurrent().Add( rootActor );
1779 CameraActor offscreenCameraActor = CameraActor::New();
1780 Stage::GetCurrent().Add( offscreenCameraActor );
1781 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1782 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1783 Integration::ResourceId imageRequestId = imageRequest->GetId();
1784 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1785 Stage::GetCurrent().Add(secondRootActor);
1787 unsigned int offscreenFramebufferId;
1788 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, offscreenFramebufferId, true);
1789 bool finished = false;
1790 RenderTaskFinished renderTaskFinished( finished );
1791 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1792 application.SendNotification();
1794 // START PROCESS/RENDER Input, Expected Input, Expected
1795 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1796 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1798 // FINISH RESOURCE LOADING
1799 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1800 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1801 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1803 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1804 application.SendNotification(); // Input, Expected Input, Expected
1805 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1806 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1807 DALI_TEST_CHECK( lastSyncObj != NULL );
1809 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1810 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1811 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1812 sync.SetObjectSynced( lastSyncObj, true );
1813 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1814 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
1816 // Finished rendering - expect no more renders, no more signals:
1817 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1818 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1819 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1820 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1821 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1822 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1826 static void UtcDaliRenderTaskOnce03()
1828 TestApplication application;
1830 tet_infoline("Testing RenderTask Render Once GlSync\n"
1831 "Switch from Render always after ready to render once with resources unready\n"
1832 "PRE: Everything ready to render\n"
1833 "POST: Finished signal sent once");
1835 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1836 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1837 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1838 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1839 drawTrace.Enable(true);
1841 Actor rootActor = Actor::New();
1842 Stage::GetCurrent().Add( rootActor );
1844 CameraActor offscreenCameraActor = CameraActor::New();
1845 Stage::GetCurrent().Add( offscreenCameraActor );
1846 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1847 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1848 Integration::ResourceId imageRequestId = imageRequest->GetId();
1849 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1850 Stage::GetCurrent().Add(secondRootActor);
1852 unsigned int offscreenFramebufferId;
1853 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, offscreenFramebufferId, true);
1854 bool finished = false;
1855 RenderTaskFinished renderTaskFinished( finished );
1856 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1857 application.SendNotification();
1859 // START PROCESS/RENDER Input, Expected Input, Expected
1860 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1861 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1863 // CHANGE TO RENDER ONCE
1864 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1865 application.SendNotification(); // Input, Expected Input, Expected
1866 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1867 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1869 // FINISH RESOURCE LOADING
1870 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1871 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1872 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1873 DALI_TEST_CHECK( lastSyncObj != NULL );
1875 sync.SetObjectSynced( lastSyncObj, true );
1876 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1877 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
1879 // Finished rendering - expect no more renders, no more signals:
1880 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1881 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1882 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1883 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1884 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1885 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1889 static void UtcDaliRenderTaskOnce04()
1891 TestApplication application;
1893 tet_infoline("Testing RenderTask Render Once GlSync\n"
1894 "During RenderOnce, make ready resources unready before sending first finished signal\n"
1895 "PRE: Everything ready.\n"
1896 "POST: Finished signal sent only once");
1898 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1899 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1900 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1901 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1902 drawTrace.Enable(true);
1904 Actor rootActor = Actor::New();
1905 Stage::GetCurrent().Add( rootActor );
1907 CameraActor offscreenCameraActor = CameraActor::New();
1908 Stage::GetCurrent().Add( offscreenCameraActor );
1909 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1910 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1911 Integration::ResourceId imageRequestId = imageRequest->GetId();
1912 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1913 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1914 application.Render();
1916 Stage::GetCurrent().Add(secondRootActor);
1918 unsigned int offscreenFramebufferId;
1919 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, offscreenFramebufferId, true);
1920 bool finished = false;
1921 RenderTaskFinished renderTaskFinished( finished );
1922 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1923 application.SendNotification();
1925 // START PROCESS/RENDER Input, Expected Input, Expected
1926 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1927 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1929 // CHANGE TO RENDER ONCE, RESOURCES BECOME NOT READY
1930 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
1933 ReloadImage(application, secondRootActor.GetImage());
1934 application.SendNotification(); // Input, Expected Input, Expected
1936 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1937 DALI_TEST_EQUALS( secondRootActor.GetImage().GetLoadingState(), Dali::ResourceLoading, TEST_LOCATION);
1938 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1940 // FINISH RESOURCE LOADING
1941 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1942 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1943 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
1944 DALI_TEST_CHECK( lastSyncObj != NULL );
1946 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1947 sync.SetObjectSynced( lastSyncObj, true );
1948 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1949 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
1951 // Finished rendering - expect no more renders, no more signals:
1952 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1953 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1954 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1955 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1956 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1957 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
1961 static void UtcDaliRenderTaskOnce05()
1963 TestApplication application;
1965 tet_infoline("Testing RenderTask Render Once GLSync\n"
1966 "Render once, Second call to SetRefreshRate(ONCE) triggers only one more finished signal\n"
1967 "PRE: Everything ready\n"
1968 "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)");
1970 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
1971 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
1972 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
1973 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
1974 drawTrace.Enable(true);
1976 Actor rootActor = Actor::New();
1977 Stage::GetCurrent().Add( rootActor );
1979 CameraActor offscreenCameraActor = CameraActor::New();
1980 Stage::GetCurrent().Add( offscreenCameraActor );
1981 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
1982 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
1983 Integration::ResourceId imageRequestId = imageRequest->GetId();
1984 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
1985 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
1986 application.Render();
1988 Stage::GetCurrent().Add(secondRootActor);
1990 unsigned int offscreenFramebufferId;
1991 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, offscreenFramebufferId, true);
1992 bool finished = false;
1993 RenderTaskFinished renderTaskFinished( finished );
1994 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
1995 application.SendNotification();
1997 // START PROCESS/RENDER Input, Expected Input, Expected
1998 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
1999 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2001 // CHANGE TO RENDER ONCE,
2002 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2003 application.SendNotification();
2004 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2005 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2006 DALI_TEST_CHECK( lastSyncObj != NULL );
2008 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2009 sync.SetObjectSynced( lastSyncObj, true );
2010 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2011 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
2012 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2013 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2015 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2016 application.SendNotification();
2017 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2018 lastSyncObj = sync.GetLastSyncObject();
2019 DALI_TEST_CHECK( lastSyncObj != NULL );
2021 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2022 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2023 sync.SetObjectSynced( lastSyncObj, true );
2024 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2025 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
2026 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2027 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2028 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2029 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2030 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2033 static void UtcDaliRenderTaskOnce06()
2035 TestApplication application;
2037 tet_infoline("Testing RenderTask Render Once GLSync\n"
2038 "Render once, Call to SetRefreshRate(ONCE) in Finished signal callback triggers "
2039 "another render & another finished signal\n"
2040 "PRE: Everything ready\n"
2041 "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)");
2044 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2045 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2046 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2047 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2048 drawTrace.Enable(true);
2050 Actor rootActor = Actor::New();
2051 Stage::GetCurrent().Add( rootActor );
2053 CameraActor offscreenCameraActor = CameraActor::New();
2054 Stage::GetCurrent().Add( offscreenCameraActor );
2055 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
2056 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2057 Integration::ResourceId imageRequestId = imageRequest->GetId();
2058 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2059 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2060 application.Render();
2062 Stage::GetCurrent().Add(secondRootActor);
2064 unsigned int offscreenFramebufferId;
2065 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, offscreenFramebufferId, true);
2066 bool finished = false;
2068 ConnectionTracker connectionTracker;
2069 RenderTaskFinishedRenderAgain renderTaskFinishedRenderAgain( finished );
2070 newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinishedRenderAgain );
2072 application.SendNotification();
2074 // START PROCESS/RENDER Input, Expected Input, Expected
2075 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2076 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2077 DALI_TEST_CHECK( lastSyncObj == NULL );
2079 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2081 // CHANGE TO RENDER ONCE,
2082 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2083 application.SendNotification();
2084 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2085 lastSyncObj = sync.GetLastSyncObject();
2086 DALI_TEST_CHECK( lastSyncObj != NULL );
2088 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2089 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2091 sync.SetObjectSynced( lastSyncObj, true );
2092 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2093 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
2094 application.SendNotification();
2096 // Expect SetRefreshRate to have been called again
2097 // Prevent next finished signal calling refresh once again
2098 RenderTaskFinished renderTaskFinished( finished );
2099 connectionTracker.DisconnectAll();
2100 newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinished );
2101 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2102 lastSyncObj = sync.GetLastSyncObject();
2103 DALI_TEST_CHECK( lastSyncObj != NULL );
2105 sync.SetObjectSynced( lastSyncObj, true );
2106 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2107 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
2109 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2110 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2111 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2112 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2116 static void UtcDaliRenderTaskOnce07()
2118 TestApplication application;
2120 tet_infoline("Testing RenderTask Render Once GlSync\n"
2121 "SetRefreshRate(ONCE) again before first finished signal has been sent.\n"
2122 "PRE: resources ready\n"
2123 "POST: Only 1 finished signal sent.");
2125 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2126 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2127 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2128 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2129 drawTrace.Enable(true);
2131 Actor rootActor = Actor::New();
2132 Stage::GetCurrent().Add( rootActor );
2134 CameraActor offscreenCameraActor = CameraActor::New();
2135 Stage::GetCurrent().Add( offscreenCameraActor );
2136 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
2137 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2138 Integration::ResourceId imageRequestId = imageRequest->GetId();
2139 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2140 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2141 application.Render();
2143 Stage::GetCurrent().Add(secondRootActor);
2145 unsigned int offscreenFramebufferId;
2146 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, offscreenFramebufferId, true);
2147 bool finished = false;
2148 RenderTaskFinished renderTaskFinished( finished );
2149 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2150 application.SendNotification();
2152 // START PROCESS/RENDER Input, Expected Input, Expected
2153 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2154 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2156 // CHANGE TO RENDER ONCE,
2157 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2158 application.SendNotification();
2159 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2160 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2161 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2163 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2164 application.SendNotification();
2165 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2166 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2167 DALI_TEST_CHECK( lastSyncObj != NULL );
2169 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2170 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2171 sync.SetObjectSynced( lastSyncObj, true );
2172 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2173 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
2175 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2176 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2177 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2178 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2183 static void UtcDaliRenderTaskOnce08()
2185 TestApplication application;
2187 tet_infoline("Testing RenderTask Render Once GlSync\n"
2188 "SetRefreshRate(ONCE), resource load failed completes render task.\n"
2189 "PRE: resources not ready\n"
2190 "POST: Only 1 finished signal sent.");
2192 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2193 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2194 TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
2195 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2196 drawTrace.Enable(true);
2198 Actor rootActor = Actor::New();
2199 Stage::GetCurrent().Add( rootActor );
2201 CameraActor offscreenCameraActor = CameraActor::New();
2202 Stage::GetCurrent().Add( offscreenCameraActor );
2203 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
2204 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2205 Integration::ResourceId imageRequestId = imageRequest->GetId();
2206 Stage::GetCurrent().Add(secondRootActor);
2208 unsigned int offscreenFramebufferId;
2209 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, offscreenFramebufferId, true);
2210 bool finished = false;
2211 RenderTaskFinished renderTaskFinished( finished );
2212 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2213 application.SendNotification();
2215 // START PROCESS/RENDER Input, Expected Input, Expected
2216 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2217 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2219 // CHANGE TO RENDER ONCE,
2220 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2221 application.SendNotification();
2222 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2223 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2224 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2226 FailImageLoad(application, imageRequestId); // Need to run Update again for this to complete
2227 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) ); // nothing to draw
2228 Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
2229 DALI_TEST_CHECK( lastSyncObj != NULL );
2231 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2232 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2233 sync.SetObjectSynced( lastSyncObj, true );
2234 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2235 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
2237 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2238 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2239 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2240 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2245 static void UtcDaliRenderTaskOnceNoSync01()
2247 TestApplication application;
2248 extern Debug::Filter* gRenderTaskLogFilter;
2249 DALI_LOG_FILTER_SET_LEVEL(gRenderTaskLogFilter, Debug::General);
2250 DALI_LOG_FILTER_ENABLE_TRACE(gRenderTaskLogFilter);
2252 tet_infoline("Testing RenderTask Render Once, using loading image\nPRE: Resources not ready, Source not visible\nPOST: Finished signal sent once only");
2254 // SETUP AN OFFSCREEN RENDER TASK
2255 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2256 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2257 drawTrace.Enable(true);
2259 Actor rootActor = Actor::New();
2260 Stage::GetCurrent().Add( rootActor );
2262 CameraActor offscreenCameraActor = CameraActor::New();
2263 Stage::GetCurrent().Add( offscreenCameraActor );
2264 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
2265 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2266 Integration::ResourceId imageRequestId = imageRequest->GetId();
2267 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2269 Stage::GetCurrent().Add(secondRootActor);
2270 secondRootActor.SetVisible(false);
2272 unsigned int offscreenFramebufferId;
2273 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, offscreenFramebufferId, false);
2274 bool finished = false;
2275 RenderTaskFinished renderTaskFinished( finished );
2276 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2277 application.SendNotification();
2279 // START PROCESS/RENDER Input, Expected Input, Expected
2280 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2281 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2283 // MAKE SOURCE VISIBLE
2284 secondRootActor.SetVisible(true);
2285 application.SendNotification();
2286 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2287 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2289 // FINISH RESOURCE LOADING - expect immediate rendering yet
2290 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2291 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2292 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
2293 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2294 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2295 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2298 static void UtcDaliRenderTaskOnceNoSync02()
2300 TestApplication application;
2301 extern Debug::Filter* gRenderTaskLogFilter;
2302 DALI_LOG_FILTER_SET_LEVEL(gRenderTaskLogFilter, Debug::General);
2303 DALI_LOG_FILTER_ENABLE_TRACE(gRenderTaskLogFilter);
2305 tet_infoline("Testing RenderTask Render Once, using loading image. Switch from render always after ready to render once\n"
2306 "PRE: Render task ready, Image not loaded\n"
2307 "POST: Finished signal sent only once");
2309 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2310 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2311 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2312 drawTrace.Enable(true);
2314 Actor rootActor = Actor::New();
2315 Stage::GetCurrent().Add( rootActor );
2317 CameraActor offscreenCameraActor = CameraActor::New();
2318 Stage::GetCurrent().Add( offscreenCameraActor );
2319 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
2320 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2321 Integration::ResourceId imageRequestId = imageRequest->GetId();
2322 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2323 Stage::GetCurrent().Add(secondRootActor);
2325 unsigned int offscreenFramebufferId;
2326 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, offscreenFramebufferId, false);
2327 bool finished = false;
2328 RenderTaskFinished renderTaskFinished( finished );
2329 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2330 application.SendNotification();
2332 // START PROCESS/RENDER Input, Expected Input, Expected
2333 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2334 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2336 // FINISH RESOURCE LOADING
2337 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2338 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2339 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2341 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2342 application.SendNotification(); // Input, Expected Input, Expected
2343 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2344 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
2345 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2346 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2347 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2348 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2352 static void UtcDaliRenderTaskOnceNoSync03()
2354 TestApplication application;
2356 tet_infoline("Testing RenderTask Render Once\n"
2357 "Switch from Render always after ready to render once with resources unready\n"
2358 "PRE: Everything ready to render\n"
2359 "POST: Finished signal sent once");
2361 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2362 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2363 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2364 drawTrace.Enable(true);
2366 Actor rootActor = Actor::New();
2367 Stage::GetCurrent().Add( rootActor );
2369 CameraActor offscreenCameraActor = CameraActor::New();
2370 Stage::GetCurrent().Add( offscreenCameraActor );
2371 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
2372 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2373 Integration::ResourceId imageRequestId = imageRequest->GetId();
2374 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2375 Stage::GetCurrent().Add(secondRootActor);
2377 unsigned int offscreenFramebufferId;
2378 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, offscreenFramebufferId, false);
2379 bool finished = false;
2380 RenderTaskFinished renderTaskFinished( finished );
2381 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2382 application.SendNotification();
2384 // START PROCESS/RENDER Input, Expected Input, Expected
2385 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2386 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2388 // CHANGE TO RENDER ONCE
2389 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2390 application.SendNotification(); // Input, Expected Input, Expected
2391 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2392 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2394 // FINISH RESOURCE LOADING
2395 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2396 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2397 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
2398 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2399 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2400 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2404 static void UtcDaliRenderTaskOnceNoSync04()
2406 TestApplication application;
2408 tet_infoline("Testing RenderTask Render Once\n"
2409 "During RenderOnce, make ready resources unready before sending first finished signal\n"
2410 "PRE: Everything ready.\n"
2411 "POST: Finished signal sent only once");
2413 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2414 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2415 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2416 drawTrace.Enable(true);
2418 Actor rootActor = Actor::New();
2419 Stage::GetCurrent().Add( rootActor );
2421 CameraActor offscreenCameraActor = CameraActor::New();
2422 Stage::GetCurrent().Add( offscreenCameraActor );
2423 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
2424 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2425 Integration::ResourceId imageRequestId = imageRequest->GetId();
2426 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2427 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2428 application.Render();
2430 Stage::GetCurrent().Add(secondRootActor);
2432 unsigned int offscreenFramebufferId;
2433 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, offscreenFramebufferId, false);
2434 bool finished = false;
2435 RenderTaskFinished renderTaskFinished( finished );
2436 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2437 application.SendNotification();
2439 // START PROCESS/RENDER Input, Expected Input, Expected
2440 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2441 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2443 // CHANGE TO RENDER ONCE, RESOURCES BECOME NOT READY
2444 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2447 ReloadImage(application, secondRootActor.GetImage());
2448 application.SendNotification(); // Input, Expected Input, Expected
2450 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2451 DALI_TEST_EQUALS( secondRootActor.GetImage().GetLoadingState(), Dali::ResourceLoading, TEST_LOCATION);
2452 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2454 // FINISH RESOURCE LOADING
2455 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2456 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, true ) );
2457 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2458 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2459 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2460 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2464 static void UtcDaliRenderTaskOnceNoSync05()
2466 TestApplication application;
2468 tet_infoline("Testing RenderTask Render Once\n"
2469 "Render once, Second call to SetRefreshRate(ONCE) triggers only one more finished signal\n"
2470 "PRE: Everything ready\n"
2471 "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)");
2473 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2474 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2475 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2476 drawTrace.Enable(true);
2478 Actor rootActor = Actor::New();
2479 Stage::GetCurrent().Add( rootActor );
2481 CameraActor offscreenCameraActor = CameraActor::New();
2482 Stage::GetCurrent().Add( offscreenCameraActor );
2483 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
2484 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2485 Integration::ResourceId imageRequestId = imageRequest->GetId();
2486 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2487 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2488 application.Render();
2490 Stage::GetCurrent().Add(secondRootActor);
2492 unsigned int offscreenFramebufferId;
2493 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, offscreenFramebufferId, false);
2494 bool finished = false;
2495 RenderTaskFinished renderTaskFinished( finished );
2496 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2497 application.SendNotification();
2499 // START PROCESS/RENDER Input, Expected Input, Expected
2500 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2501 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2503 // CHANGE TO RENDER ONCE,
2504 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2505 application.SendNotification();
2506 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2507 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
2508 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2509 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2510 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2512 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2513 application.SendNotification();
2514 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2515 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
2516 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2517 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2518 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2521 static void UtcDaliRenderTaskOnceNoSync06()
2523 TestApplication application;
2525 tet_infoline("Testing RenderTask Render Once\n"
2526 "Render once, Call to SetRefreshRate(ONCE) in Finished signal callback triggers\n"
2527 "another render & another finished signal\n"
2528 "PRE: Everything ready\n"
2529 "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)");
2532 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2533 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2534 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2535 drawTrace.Enable(true);
2537 Actor rootActor = Actor::New();
2538 Stage::GetCurrent().Add( rootActor );
2540 CameraActor offscreenCameraActor = CameraActor::New();
2541 Stage::GetCurrent().Add( offscreenCameraActor );
2542 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
2543 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2544 Integration::ResourceId imageRequestId = imageRequest->GetId();
2545 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2546 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2547 application.Render();
2549 Stage::GetCurrent().Add(secondRootActor);
2551 unsigned int offscreenFramebufferId;
2552 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, offscreenFramebufferId, false);
2553 bool finished = false;
2555 ConnectionTracker connectionTracker;
2556 RenderTaskFinishedRenderAgain renderTaskFinishedRenderAgain( finished );
2557 newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinishedRenderAgain );
2559 application.SendNotification();
2561 // START PROCESS/RENDER Input, Expected Input, Expected
2562 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2563 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2565 // CHANGE TO RENDER ONCE,
2566 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2567 application.SendNotification();
2568 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2569 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
2571 // Expect SetRefreshRate to have been called again
2572 // Prevent next finished signal calling refresh once again
2573 RenderTaskFinished renderTaskFinished( finished );
2574 connectionTracker.DisconnectAll();
2575 newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinished );
2577 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2578 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
2579 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2580 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2581 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2585 static void UtcDaliRenderTaskOnceNoSync07()
2587 TestApplication application;
2589 tet_infoline("Testing RenderTask Render Once\n"
2590 "SetRefreshRate(ONCE) again before first finished signal has been sent.\n"
2591 "PRE: resources ready\n"
2592 "POST: Only 1 finished signal sent.");
2594 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2595 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2596 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2597 drawTrace.Enable(true);
2599 Actor rootActor = Actor::New();
2600 Stage::GetCurrent().Add( rootActor );
2602 CameraActor offscreenCameraActor = CameraActor::New();
2603 Stage::GetCurrent().Add( offscreenCameraActor );
2604 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
2605 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2606 Integration::ResourceId imageRequestId = imageRequest->GetId();
2607 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2608 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2609 application.Render();
2611 Stage::GetCurrent().Add(secondRootActor);
2613 unsigned int offscreenFramebufferId;
2614 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, offscreenFramebufferId, false);
2615 bool finished = false;
2616 RenderTaskFinished renderTaskFinished( finished );
2617 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2618 application.SendNotification();
2620 // START PROCESS/RENDER Input, Expected Input, Expected
2621 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2622 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2624 // CHANGE TO RENDER ONCE,
2625 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2626 application.SendNotification();
2627 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2628 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
2629 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2631 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2632 application.SendNotification();
2633 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
2634 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
2635 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2636 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2637 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2640 static void UtcDaliRenderTaskOnceNoSync08()
2642 TestApplication application;
2644 tet_infoline("Testing RenderTask Render Once\n"
2645 "SetRefreshRate(ONCE), resource load failed, completes render task.\n"
2646 "PRE: resources not ready\n"
2647 "POST: Only 1 finished signal sent.");
2649 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2650 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2651 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2652 drawTrace.Enable(true);
2654 Actor rootActor = Actor::New();
2655 Stage::GetCurrent().Add( rootActor );
2657 CameraActor offscreenCameraActor = CameraActor::New();
2658 Stage::GetCurrent().Add( offscreenCameraActor );
2659 ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
2660 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2661 Integration::ResourceId imageRequestId = imageRequest->GetId();
2662 Stage::GetCurrent().Add(secondRootActor);
2664 unsigned int offscreenFramebufferId;
2665 RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, offscreenFramebufferId, false);
2666 bool finished = false;
2667 RenderTaskFinished renderTaskFinished( finished );
2668 newTask.FinishedSignal().Connect( &application, renderTaskFinished );
2669 application.SendNotification();
2671 // START PROCESS/RENDER Input, Expected Input, Expected
2672 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2673 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2675 // CHANGE TO RENDER ONCE,
2676 newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
2677 application.SendNotification();
2678 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2679 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2680 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2682 FailImageLoad(application, imageRequestId); // Need to run Update again for this to complete
2683 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) ); // nothing to draw
2684 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
2685 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2686 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2687 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2688 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2689 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
2693 static void UtcDaliRenderTaskOnceChain01()
2695 TestApplication application;
2697 tet_infoline("Testing RenderTask Render Once Chained render tasks\n"
2698 "SetRefreshRate(ONCE), resource load completes, both render tasks render.\n"
2699 "PRE: resources not ready\n"
2700 "POST: 2 finished signals sent.");
2702 // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
2703 application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
2704 TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
2705 drawTrace.Enable(true);
2707 Actor defaultRootActor = Actor::New(); // Root for default RT
2708 Stage::GetCurrent().Add( defaultRootActor );
2710 CameraActor offscreenCameraActor = CameraActor::New();
2711 Stage::GetCurrent().Add( offscreenCameraActor );
2712 ImageActor firstRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
2713 Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
2714 Integration::ResourceId imageRequestId = imageRequest->GetId();
2715 Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
2716 Stage::GetCurrent().Add(firstRootActor);
2718 // first render task
2719 unsigned int offscreenFramebufferId;
2720 RenderTask firstTask = CreateRenderTask(application, offscreenCameraActor, defaultRootActor, firstRootActor, RenderTask::REFRESH_ONCE, offscreenFramebufferId, false);
2721 bool firstFinished = false;
2722 RenderTaskFinished renderTask1Finished( firstFinished );
2723 firstTask.FinishedSignal().Connect( &application, renderTask1Finished );
2725 // Second render task
2726 FrameBufferImage fbo = firstTask.GetTargetFrameBuffer();
2727 ImageActor secondRootActor = ImageActor::New( fbo );
2728 Stage::GetCurrent().Add(secondRootActor);
2730 RenderTask secondTask = CreateRenderTask(application, offscreenCameraActor, defaultRootActor, secondRootActor, RenderTask::REFRESH_ONCE, offscreenFramebufferId, false);
2731 bool secondFinished = false;
2732 RenderTaskFinished renderTask2Finished( secondFinished );
2733 secondTask.FinishedSignal().Connect( &application, renderTask2Finished );
2735 application.SendNotification();
2737 // START PROCESS/RENDER Input, Expected Input, Expected
2738 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false ) );
2739 DALI_TEST_CHECK( secondFinished == false );
2740 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false ) );
2741 DALI_TEST_CHECK( secondFinished == false );
2743 CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
2744 DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false ) );
2745 DALI_TEST_CHECK( secondFinished == false );
2746 application.GetPlatform().ClearReadyResources();
2748 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, firstFinished, true ) );
2749 DALI_TEST_CHECK( secondFinished == true );
2751 secondFinished = false;
2752 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, firstFinished, false ) );
2753 DALI_TEST_CHECK( secondFinished == false );
2754 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, firstFinished, false ) );
2755 DALI_TEST_CHECK( secondFinished == false );
2756 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, firstFinished, false ) );
2757 DALI_TEST_CHECK( secondFinished == false );
2758 DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, firstFinished, false ) );
2759 DALI_TEST_CHECK( secondFinished == false );
2762 void UtcDaliRenderTaskProperties()
2764 TestApplication application;
2766 RenderTask task = Stage::GetCurrent().GetRenderTaskList().CreateTask();
2768 Property::IndexContainer indices;
2769 task.GetPropertyIndices( indices );
2770 DALI_TEST_CHECK( ! indices.empty() );
2771 DALI_TEST_EQUALS( indices.size(), task.GetPropertyCount(), TEST_LOCATION );