X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali%2Futc-Dali-RenderTask.cpp;h=792ade5569966ffa5547cb53a01e305c8880ad00;hb=a6eaccc46e976736d7f9f9b72105dd7a2b2a51f4;hp=9619b50c6bfcb82feaa08ac7c7e5ec3683075318;hpb=e424c13b4dd452d36ce86a29e1e3c6943cd07714;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/automated-tests/src/dali/utc-Dali-RenderTask.cpp b/automated-tests/src/dali/utc-Dali-RenderTask.cpp index 9619b50..4bd248e 100644 --- a/automated-tests/src/dali/utc-Dali-RenderTask.cpp +++ b/automated-tests/src/dali/utc-Dali-RenderTask.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2019 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,14 +16,18 @@ */ #include - #include #include +#include #include #include +#include + +#include #define BOOLSTR(x) ((x)?"T":"F") +//& set: DaliRenderTask using namespace Dali; @@ -37,64 +41,45 @@ void utc_dali_render_task_cleanup(void) test_return_value = TET_PASS; } +/** + * APIs: + * + * Constructor, Destructor, DownCast, New, copy constructor, assignment operator + * + * SetSourceActor 2+ve, 1-ve + * GetSourceActor 1+ve, 1-ve + * SetExclusive 2+ve, 0-ve + * IsExclusive 2+ve, 0-ve + * SetInputEnabled 1+ve, 0-ve + * GetInputEnabled 1+ve, 0-ve + * SetCameraActor 1+ve, 1-ve + * GetCameraActor 1+ve, 1-ve + * SetTargetFrameBuffer 1+ve, 1-ve + * GetTargetFrameBuffer 1+ve, 1-ve + * SetScreenToFrameBufferFunction 1+ve, 1-ve + * GetScreenToFrameBufferFunction 1+ve, 1-ve + * SetScreenToFrameBufferMappingActor 1+ve, 1-ve + * GetScreenToFrameBufferMappingActor 1+ve, 1-ve + * SetViewportPosition 1+ve + * GetCurrentViewportPosition 1+ve + * SetViewportSize 1+ve + * GetCurrentViewportSize 1+ve + * SetViewport 2+ve, 1-ve + * GetViewport 2+ve, 1-ve + * SetClearColor 1+ve, 1-ve + * GetClearColor 1+ve, 1-ve + * SetClearEnabled 1+ve, 1-ve + * GetClearEnabled 1+ve, 1-ve + * SetCullMode + * GetCullMode + * SetRefreshRate Many + * GetRefreshRate 1+ve + * FinishedSignal 1+ve + */ + namespace // unnamed namespace { -class TestNativeImage : public NativeImage -{ -public: - int mWidth; - int mHeight; - TestNativeImage(int width, int height) - : mWidth(width), - mHeight(height) - {} - - virtual bool GlExtensionCreate() {return true;}; - - /** - * Destroy the GL resource for the NativeImage. - * e.g. For the EglImageKHR extension, this corresponds to calling eglDestroyImageKHR() - * @pre There is a GL context for the current thread. - */ - virtual void GlExtensionDestroy() {}; - - /** - * Use the NativeImage as a texture for rendering - * @pre There is a GL context for the current thread. - * @return A GL error code - */ - virtual unsigned int TargetTexture() {return 0;}; - - /** - * Called in each NativeTexture::Bind() call to allow implementation specific operations. - * The correct texture sampler has already been bound before the function gets called. - * @pre glAbstraction is being used by context in current thread - */ - virtual void PrepareTexture() {} - - /** - * Returns the width of the NativeImage - * @return width - */ - virtual unsigned int GetWidth() const {return mWidth;} - - /** - * Returns the height of the NativeImage - * @return height - */ - virtual unsigned int GetHeight() const {return mHeight;} - - /** - * Returns the internal pixel NativeImage::PixelFormat of the NativeImage - * @return pixel format - */ - virtual Pixel::Format GetPixelFormat() const { return Pixel::RGBA8888; } -protected: - ~TestNativeImage(){} -}; - - const int RENDER_FRAME_INTERVAL = 16; ///< Duration of each frame in ms. (at approx 60FPS) /* @@ -184,45 +169,30 @@ bool TestScreenToFrameBufferFunction( Vector2& coordinates ) return true; } -ImageActor CreateLoadingImage(TestApplication& application, std::string filename, Image::LoadPolicy loadPolicy, Image::ReleasePolicy releasePolicy) +Actor CreateRenderableActorSuccess(TestApplication& application, std::string filename) { - Image image = Image::New(filename, loadPolicy, releasePolicy); - DALI_TEST_CHECK( image ); - application.SendNotification(); - application.Render(16); - DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) ); - ImageActor actor = ImageActor::New(image); + PrepareResourceImage( application, 80u, 80u, Pixel::RGBA8888 ); + Image image = ResourceImage::New(filename); + Actor actor = CreateRenderableActor(image); actor.SetSize( 80, 80 ); - application.SendNotification(); - application.Render(16); return actor; } -void CompleteImageLoad(TestApplication& application, Integration::ResourceId resourceId, Integration::ResourceTypeId requestType) -{ - std::vector ids; - ids.push_back( 23 ); - application.GetGlAbstraction().SetNextTextureIds( ids ); - - Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD ); - Integration::ResourcePointer resource(bitmap); - bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80); - - application.GetPlatform().SetResourceLoaded(resourceId, requestType, resource); -} - -void FailImageLoad(TestApplication& application, Integration::ResourceId resourceId ) +Actor CreateRenderableActorFailed(TestApplication& application, std::string filename) { - application.GetPlatform().SetResourceLoadFailed(resourceId, Integration::FailureUnknown); + Image image = ResourceImage::New(filename); + DALI_TEST_CHECK( image ); + Actor actor = CreateRenderableActor(image); + actor.SetSize( 80, 80 ); + return actor; } -void ReloadImage(TestApplication& application, Image image) +Image CreateResourceImage(TestApplication& application, std::string filename) { - application.GetPlatform().ClearReadyResources(); - application.GetPlatform().DiscardRequest(); - application.GetPlatform().ResetTrace(); - application.GetPlatform().SetClosestImageSize(Vector2(80.0f, 80.0f)); // Ensure reload is called. - image.Reload(); + PrepareResourceImage( application, 80u, 80u, Pixel::RGBA8888 ); + Image image = ResourceImage::New(filename); + DALI_TEST_CHECK( image ); + return image; } RenderTask CreateRenderTask(TestApplication& application, @@ -239,15 +209,15 @@ RenderTask CreateRenderTask(TestApplication& application, FrameBufferImage frameBufferImage; if( glSync ) { - NativeImagePtr testNativeImagePtr = new TestNativeImage(10, 10); - frameBufferImage= FrameBufferImage::New( *testNativeImagePtr.Get() ); + NativeImageInterfacePtr testNativeImagePtr = TestNativeImage::New(10, 10); + frameBufferImage= FrameBufferImage::New( *(testNativeImagePtr.Get()) ); } else { frameBufferImage = FrameBufferImage::New( 10, 10 ); } - // Don't draw output framebuffer + // Don't draw output framebuffer // ' RenderTask newTask = taskList.CreateTask(); newTask.SetCameraActor( offscreenCamera ); @@ -258,13 +228,17 @@ RenderTask CreateRenderTask(TestApplication& application, newTask.SetExclusive( true ); newTask.SetRefreshRate( refreshRate ); newTask.SetTargetFrameBuffer( frameBufferImage ); + newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, glSync ); return newTask; } -bool UpdateRender(TestApplication& application, TraceCallStack& callStack, bool testDrawn, bool& finishedSig, bool testFinished, bool testKeepUpdating ) +bool UpdateRender(TestApplication& application, TraceCallStack& callStack, bool testDrawn, bool& finishedSig, bool testFinished, bool testKeepUpdating, int lineNumber ) { finishedSig = false; callStack.Reset(); + + tet_printf("TestApplication::UpdateRender().\n"); + application.Render(16); application.SendNotification(); @@ -303,49 +277,15 @@ bool UpdateRender(TestApplication& application, TraceCallStack& callStack, bool bool result = (sigPassed && drawPassed && keepUpdatingPassed); - tet_printf("UpdateRender: Expected: Draw:%s Signal:%s Keep Updating: %s Actual: Draw:%s Signal:%s KeepUpdating: %s %s\n", + tet_printf("UpdateRender: Expected: Draw:%s Signal:%s KeepUpdating: %s Actual: Draw:%s Signal:%s KeepUpdating: %s %s, line %d\n", BOOLSTR(testDrawn), BOOLSTR(testFinished), BOOLSTR(testKeepUpdating), BOOLSTR(drawResult), BOOLSTR(finishedSig), BOOLSTR(keepUpdating), - result ? "Passed":"Failed"); + result ? "Passed":"Failed", + lineNumber ); return result; } -// The functor to be used in the hit-test algorithm to check whether the actor is hittable. -bool IsActorHittableFunction(Actor actor, Dali::HitTestAlgorithm::TraverseType type) -{ - bool hittable = false; - - switch (type) - { - case Dali::HitTestAlgorithm::CHECK_ACTOR: - { - // Check whether the actor is visible and not fully transparent. - if( actor.IsVisible() - && actor.GetCurrentWorldColor().a > 0.01f) // not FULLY_TRANSPARENT - { - - hittable = true; - } - break; - } - case Dali::HitTestAlgorithm::DESCEND_ACTOR_TREE: - { - if( actor.IsVisible() ) // Actor is visible, if not visible then none of its children are visible. - { - hittable = true; - } - break; - } - default: - { - break; - } - } - - return hittable; -} - } // unnamed namespace @@ -355,7 +295,7 @@ bool IsActorHittableFunction(Actor actor, Dali::HitTestAlgorithm::TraverseType t /****************************************************************************************************/ /****************************************************************************************************/ -int UtcDaliRenderTaskDownCast(void) +int UtcDaliRenderTaskDownCast01(void) { TestApplication application; @@ -374,15 +314,90 @@ int UtcDaliRenderTaskDownCast(void) END_TEST; } -int UtcDaliRenderTaskSetSourceActor(void) +int UtcDaliRenderTaskDownCast02(void) { TestApplication application; - tet_infoline("Testing RenderTask::SetSourceActor()"); + tet_infoline("Testing RenderTask::DownCast()"); + + Actor actor = Actor::New(); + + RenderTask task = RenderTask::DownCast( actor ); + DALI_TEST_CHECK( ! task ); + END_TEST; +} + +int UtcDaliRenderTaskSetSourceActorN(void) +{ + TestApplication application; + tet_infoline("Testing RenderTask::SetSourceActor() Negative - try with empty actor handle"); Stage stage = Stage::GetCurrent(); - const std::vector& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 ); + Actor srcActor; + + RenderTaskList taskList = stage.GetRenderTaskList(); + RenderTask renderTask = taskList.CreateTask(); + renderTask.SetSourceActor(srcActor); + + application.SendNotification(); + application.Render(); + + DALI_TEST_CHECK( ! renderTask.GetSourceActor() ); + END_TEST; +} + + +int UtcDaliRenderTaskSetSourceActorP01(void) +{ + TestApplication application; + + tet_infoline("Testing RenderTask::SetSourceActor() Positive - check that setting a non-renderable actor stops existing source actor being rendered "); + + Stage stage = Stage::GetCurrent(); + RenderTaskList taskList = stage.GetRenderTaskList(); + RenderTask task = taskList.GetTask( 0u ); + + Actor actor = task.GetSourceActor(); + DALI_TEST_CHECK( actor ); + + BufferImage img = BufferImage::New( 1,1 ); + Actor newActor = CreateRenderableActor( img ); + newActor.SetSize(1,1); + stage.Add( newActor ); + + Actor nonRenderableActor = Actor::New(); + stage.Add( nonRenderableActor ); + + // Stop the newActor from being rendered by changing the source actor + DALI_TEST_CHECK( nonRenderableActor ); + task.SetSourceActor( nonRenderableActor ); + DALI_TEST_CHECK( task.GetSourceActor() != actor ); + DALI_TEST_CHECK( task.GetSourceActor() == nonRenderableActor ); + + TestGlAbstraction& gl = application.GetGlAbstraction(); + TraceCallStack& drawTrace = gl.GetDrawTrace(); + drawTrace.Enable(true); + + // Update & Render nothing! + application.GetGlAbstraction().ClearBoundTextures(); + application.SendNotification(); + application.Render(); + + // Check that nothing was rendered + DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION ); + + END_TEST; +} + + +int UtcDaliRenderTaskSetSourceActorP02(void) +{ + TestApplication application; + + tet_infoline("Testing RenderTask::SetSourceActor() Positive - check that switching source from a non-renderable to a renderable actor causes the texture to be drawn"); + + Stage stage = Stage::GetCurrent(); RenderTaskList taskList = stage.GetRenderTaskList(); @@ -391,18 +406,19 @@ int UtcDaliRenderTaskSetSourceActor(void) Actor actor = task.GetSourceActor(); DALI_TEST_CHECK( actor ); - std::vector ids; - ids.push_back( 7 ); - application.GetGlAbstraction().SetNextTextureIds( ids ); - BitmapImage img = BitmapImage::New( 1,1 ); - ImageActor newActor = ImageActor::New( img ); + BufferImage img = BufferImage::New( 1,1 ); + Actor newActor = CreateRenderableActor( img ); newActor.SetSize(1,1); stage.Add( newActor ); Actor nonRenderableActor = Actor::New(); stage.Add( nonRenderableActor ); + TestGlAbstraction& gl = application.GetGlAbstraction(); + TraceCallStack& drawTrace = gl.GetDrawTrace(); + drawTrace.Enable(true); + // Stop the newActor from being rendered by changing the source actor DALI_TEST_CHECK( nonRenderableActor ); task.SetSourceActor( nonRenderableActor ); @@ -415,7 +431,8 @@ int UtcDaliRenderTaskSetSourceActor(void) application.Render(); // Check that nothing was rendered - DALI_TEST_EQUALS( boundTextures.size(), 0u, TEST_LOCATION ); + DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION ); + drawTrace.Reset(); // Set newActor as the new source Actor task.SetSourceActor( newActor ); @@ -428,11 +445,7 @@ int UtcDaliRenderTaskSetSourceActor(void) application.Render(); // Check that the newActor was rendered - DALI_TEST_EQUALS( boundTextures.size(), 1u, TEST_LOCATION ); - if ( boundTextures.size() ) - { - DALI_TEST_EQUALS( boundTextures[0], 7u, TEST_LOCATION ); - } + DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 1, TEST_LOCATION ); END_TEST; } @@ -443,34 +456,28 @@ int UtcDaliRenderTaskSetSourceActorOffStage(void) tet_infoline("Testing RenderTask::SetSourceActor (on/off stage testing)"); Stage stage = Stage::GetCurrent(); - - const std::vector& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 ); - RenderTaskList taskList = stage.GetRenderTaskList(); - RenderTask task = taskList.GetTask( 0u ); Actor actor = task.GetSourceActor(); DALI_TEST_CHECK( actor ); - std::vector ids; - GLuint expectedTextureId( 3 ); - ids.push_back( expectedTextureId ); - application.GetGlAbstraction().SetNextTextureIds( ids ); + TestGlAbstraction& gl = application.GetGlAbstraction(); + TraceCallStack& drawTrace = gl.GetDrawTrace(); + drawTrace.Enable(true); - BitmapImage img = BitmapImage::New( 1,1 ); - ImageActor newActor = ImageActor::New( img ); + BufferImage img = BufferImage::New( 1,1 ); + Actor newActor = CreateRenderableActor( img ); newActor.SetSize(1,1); task.SetSourceActor( newActor ); - // Don't add newActor to stage yet + // Don't add newActor to stage yet //' // Update & Render with the actor initially off-stage - application.GetGlAbstraction().ClearBoundTextures(); application.SendNotification(); application.Render(); // Check that nothing was rendered - DALI_TEST_EQUALS( boundTextures.size(), 0u, TEST_LOCATION ); + DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION ); // Now add to stage stage.Add( newActor ); @@ -481,19 +488,17 @@ int UtcDaliRenderTaskSetSourceActorOffStage(void) application.Render(); // Check that the newActor was rendered - DALI_TEST_EQUALS( boundTextures.size(), 1u, TEST_LOCATION ); - if ( boundTextures.size() ) - { - DALI_TEST_EQUALS( boundTextures[0], expectedTextureId, TEST_LOCATION ); - } + DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 1, TEST_LOCATION ); + drawTrace.Reset(); // Now remove from stage stage.Remove( newActor ); // Update & Render with the actor off-stage - application.GetGlAbstraction().ClearBoundTextures(); application.SendNotification(); application.Render(); + DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION ); + END_TEST; } @@ -504,23 +509,14 @@ int UtcDaliRenderTaskSetSourceActorEmpty(void) tet_infoline("Testing RenderTask::SetSourceActor (empty handle case)"); Stage stage = Stage::GetCurrent(); - - const std::vector& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 ); - RenderTaskList taskList = stage.GetRenderTaskList(); - RenderTask task = taskList.GetTask( 0u ); Actor actor = task.GetSourceActor(); DALI_TEST_CHECK( actor ); - std::vector ids; - GLuint expectedTextureId( 5 ); - ids.push_back( expectedTextureId ); - application.GetGlAbstraction().SetNextTextureIds( ids ); - - BitmapImage img = BitmapImage::New( 1,1 ); - ImageActor newActor = ImageActor::New( img ); + BufferImage img = BufferImage::New( 1,1 ); + Actor newActor = CreateRenderableActor( img ); newActor.SetSize(1,1); stage.Add( newActor ); @@ -531,13 +527,16 @@ int UtcDaliRenderTaskSetSourceActorEmpty(void) task.SetSourceActor( Actor() ); DALI_TEST_CHECK( ! task.GetSourceActor() ); + TestGlAbstraction& gl = application.GetGlAbstraction(); + TraceCallStack& drawTrace = gl.GetDrawTrace(); + drawTrace.Enable(true); + // Update & Render nothing! - application.GetGlAbstraction().ClearBoundTextures(); application.SendNotification(); application.Render(); // Check that nothing was rendered - DALI_TEST_EQUALS( boundTextures.size(), 0u, TEST_LOCATION ); + DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION ); // Set with non-empty handle task.SetSourceActor( newActor ); @@ -549,19 +548,50 @@ int UtcDaliRenderTaskSetSourceActorEmpty(void) application.Render(); // Check that the newActor was rendered - DALI_TEST_EQUALS( boundTextures.size(), 1u, TEST_LOCATION ); - if ( boundTextures.size() ) - { - DALI_TEST_EQUALS( boundTextures[0], expectedTextureId, TEST_LOCATION ); - } + DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 1, TEST_LOCATION ); + END_TEST; +} + +int UtcDaliRenderTaskSetSourceActorDestroyed(void) +{ + TestApplication application; + + tet_infoline( "Testing RenderTask::SetSourceActor - Set a source actor and destroy the source actor" ); + + Stage stage = Stage::GetCurrent(); + RenderTaskList taskList = stage.GetRenderTaskList(); + RenderTask task = taskList.GetTask( 0u ); + + Actor actor = task.GetSourceActor(); + DALI_TEST_CHECK( actor ); + + BufferImage img = BufferImage::New( 1,1 ); + Actor newActor = CreateRenderableActor( img ); + newActor.SetSize(1,1); + stage.Add( newActor ); + + task.SetSourceActor( newActor ); + + DALI_TEST_CHECK( task.GetSourceActor() != actor ); + DALI_TEST_CHECK( task.GetSourceActor() == newActor ); + + application.SendNotification(); + application.Render(); + + // Destroy the source actor + stage.Remove( newActor ); + newActor.Reset(); + + DALI_TEST_CHECK( !task.GetSourceActor() ); // The source actor should be an empty handle. + END_TEST; } -int UtcDaliRenderTaskGetSourceActor(void) +int UtcDaliRenderTaskGetSourceActorP01(void) { TestApplication application; - tet_infoline("Testing RenderTask::GetSourceActor()"); + tet_infoline("Testing RenderTask::GetSourceActor() Check the default render task has a valid source actor"); RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); @@ -576,15 +606,52 @@ int UtcDaliRenderTaskGetSourceActor(void) END_TEST; } +int UtcDaliRenderTaskGetSourceActorP02(void) +{ + TestApplication application; + + tet_infoline("Testing RenderTask::GetSourceActor() Create a new render task, Add a new actor to the stage and set it as the source of the new render task. Get its source actor and check that it is equivalent to what was set."); + + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + RenderTask task = taskList.CreateTask(); + Actor actor = Actor::New(); + Stage::GetCurrent().Add(actor); + task.SetSourceActor( actor ); + + DALI_TEST_EQUALS( actor, task.GetSourceActor(), TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliRenderTaskGetSourceActorN(void) +{ + TestApplication application; + + tet_infoline("Testing RenderTask::GetSourceActor() Try with empty handle"); + + RenderTask task; + try + { + Actor actor = task.GetSourceActor(); + } + catch (Dali::DaliException& e) + { + DALI_TEST_PRINT_ASSERT( e ); + DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION); + } + + END_TEST; +} + int UtcDaliRenderTaskSetExclusive(void) { TestApplication application; - tet_infoline("Testing RenderTask::SetExclusive()"); + tet_infoline("Testing RenderTask::SetExclusive() Check that exclusion works"); RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); - // Manipulate the GenTextures behaviour, to identify different ImageActors + // Manipulate the GenTextures behaviour, to identify different actors std::vector ids; ids.push_back( 8 ); // 8 = actor1 @@ -592,8 +659,8 @@ int UtcDaliRenderTaskSetExclusive(void) ids.push_back( 10 ); // 10 = actor3 application.GetGlAbstraction().SetNextTextureIds( ids ); - BitmapImage img1 = BitmapImage::New( 1,1 ); - ImageActor actor1 = ImageActor::New( img1 ); + BufferImage img1 = BufferImage::New( 1,1 ); + Actor actor1 = CreateRenderableActor( img1 ); actor1.SetSize(1,1); Stage::GetCurrent().Add( actor1 ); @@ -603,15 +670,20 @@ int UtcDaliRenderTaskSetExclusive(void) // Check that the actor1 was rendered const std::vector& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 ); - DALI_TEST_EQUALS( boundTextures.size(), 1u, TEST_LOCATION ); + DALI_TEST_GREATER( boundTextures.size(), static_cast::size_type>( 0 ), TEST_LOCATION ); if ( boundTextures.size() ) { - DALI_TEST_EQUALS( boundTextures[0], 8u/*unique to actor1*/, TEST_LOCATION ); + int c = 0; + DALI_TEST_EQUALS( boundTextures[c++], 8u/*unique to actor1*/, TEST_LOCATION ); + if( boundTextures.size() > 1 ) + { + DALI_TEST_EQUALS( boundTextures[c++], 8u/*unique to actor1*/, TEST_LOCATION ); + } } - BitmapImage img2 = BitmapImage::New( 1,1 ); - ImageActor actor2 = ImageActor::New( img2 ); + BufferImage img2 = BufferImage::New( 1,1 ); + Actor actor2 = CreateRenderableActor( img2 ); actor2.SetSize(1,1); // Force actor2 to be rendered before actor1 @@ -626,16 +698,21 @@ int UtcDaliRenderTaskSetExclusive(void) application.Render(); // Check that the actors were rendered - DALI_TEST_EQUALS( boundTextures.size(), 2u, TEST_LOCATION ); + DALI_TEST_GREATER( boundTextures.size(), static_cast::size_type>( 1 ), TEST_LOCATION ); if ( boundTextures.size() ) { - DALI_TEST_EQUALS( boundTextures[0], 9u/*unique to actor2*/, TEST_LOCATION ); - DALI_TEST_EQUALS( boundTextures[1], 8u/*unique to actor1*/, TEST_LOCATION ); + int c = 0; + DALI_TEST_EQUALS( boundTextures[c++], 9u/*unique to actor2*/, TEST_LOCATION ); + if( boundTextures.size() > 2 ) + { + DALI_TEST_EQUALS( boundTextures[c++], 9u/*unique to actor1*/, TEST_LOCATION ); + } + DALI_TEST_EQUALS( boundTextures[c++], 8u/*unique to actor1*/, TEST_LOCATION ); } - BitmapImage img3 = BitmapImage::New( 1,1 ); - ImageActor actor3 = ImageActor::New( img3 ); + BufferImage img3 = BufferImage::New( 1,1 ); + Actor actor3 = CreateRenderableActor( img3 ); actor3.SetSize(1,1); // Force actor3 to be rendered before actor2 @@ -650,13 +727,18 @@ int UtcDaliRenderTaskSetExclusive(void) application.Render(); // Check that the actors were rendered - DALI_TEST_EQUALS( boundTextures.size(), 3u, TEST_LOCATION ); + DALI_TEST_GREATER( boundTextures.size(), static_cast::size_type>( 2 ), TEST_LOCATION ); if ( boundTextures.size() ) { - DALI_TEST_EQUALS( boundTextures[0], 10u/*unique to actor3*/, TEST_LOCATION ); - DALI_TEST_EQUALS( boundTextures[1], 9u/*unique to actor2*/, TEST_LOCATION ); - DALI_TEST_EQUALS( boundTextures[2], 8u/*unique to actor1*/, TEST_LOCATION ); + int c = 0; + DALI_TEST_EQUALS( boundTextures[c++], 10u/*unique to actor3*/, TEST_LOCATION ); + if( boundTextures.size() > 3 ) + { + DALI_TEST_EQUALS( boundTextures[c++], 10u/*unique to actor2*/, TEST_LOCATION ); + } + DALI_TEST_EQUALS( boundTextures[c++], 9u/*unique to actor2*/, TEST_LOCATION ); + DALI_TEST_EQUALS( boundTextures[c++], 8u/*unique to actor1*/, TEST_LOCATION ); } // Both actors are now connected to the root node @@ -710,998 +792,1216 @@ int UtcDaliRenderTaskSetExclusive(void) // Test that task 2 renders actor2 DALI_TEST_CHECK( boundTextures[2] == 9u ); } + + // Create a renderable actor and replace the source actor in task2 + auto actor4 = CreateRenderableActor(); + task2.SetSourceActor( actor3 ); + DALI_TEST_EQUALS( actor3, task2.GetSourceActor(), TEST_LOCATION ); + END_TEST; } -int UtcDaliRenderTaskIsExclusive(void) +int UtcDaliRenderTaskSetExclusive02(void) { TestApplication application; - tet_infoline("Testing RenderTask::IsExclusive()"); + tet_infoline("Testing RenderTask::SetExclusive() Check that changing from exclusive to not-exclusive works"); - RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + std::vector ids; + ids.push_back( 8 ); // 8 = actor1 + application.GetGlAbstraction().SetNextTextureIds( ids ); - // Not exclusive is the default - RenderTask task = taskList.GetTask( 0u ); - DALI_TEST_CHECK( false == task.IsExclusive() ); + BufferImage img1 = BufferImage::New( 1,1 ); + Actor actor1 = CreateRenderableActor( img1 ); + actor1.SetSize(1,1); + Stage::GetCurrent().Add( actor1 ); - RenderTask newTask = taskList.CreateTask(); - DALI_TEST_CHECK( false == newTask.IsExclusive() ); - END_TEST; -} + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + RenderTask task = taskList.CreateTask(); -int UtcDaliRenderTaskSetInputEnabled(void) -{ - TestApplication application; + task.SetSourceActor( actor1 ); + task.SetExclusive(true); // Actor should only render once - tet_infoline("Testing RenderTask::SetInputEnabled()"); + TestGlAbstraction& gl = application.GetGlAbstraction(); + TraceCallStack& drawTrace = gl.GetDrawTrace(); + drawTrace.Enable(true); - RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + // Update & Render actor1 + application.SendNotification(); + application.Render(); - // Input is enabled by default - RenderTask task = taskList.GetTask( 0u ); - DALI_TEST_CHECK( true == task.GetInputEnabled() ); + DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 1, TEST_LOCATION ); - task.SetInputEnabled( false ); - DALI_TEST_CHECK( false == task.GetInputEnabled() ); + // Set task to non-exclusive - actor1 should render twice: + drawTrace.Reset(); + task.SetExclusive(false); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( drawTrace.CountMethod("DrawElements"), 2, TEST_LOCATION ); - task.SetInputEnabled( true ); - DALI_TEST_CHECK( true == task.GetInputEnabled() ); END_TEST; } -int UtcDaliRenderTaskGetInputEnabled(void) +int UtcDaliRenderTaskSetExclusiveN(void) { TestApplication application; - tet_infoline("Testing RenderTask::GetInputEnabled()"); - - RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); - - // Input is enabled by default - RenderTask task = taskList.GetTask( 0u ); - DALI_TEST_CHECK( true == task.GetInputEnabled() ); + tet_infoline("Testing RenderTask::SetExclusive() on empty handle"); - RenderTask newTask = taskList.CreateTask(); - DALI_TEST_CHECK( true == newTask.GetInputEnabled() ); + RenderTask task; + try + { + task.SetExclusive(true); + } + catch (Dali::DaliException& e) + { + DALI_TEST_PRINT_ASSERT( e ); + DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION); + } END_TEST; } -int UtcDaliRenderTaskSetCameraActor(void) +int UtcDaliRenderTaskIsExclusive01(void) { TestApplication application; - tet_infoline("Testing RenderTask::SetCameraActor()"); + tet_infoline("Testing RenderTask::IsExclusive() Check default values are non-exclusive"); RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + // Not exclusive is the default RenderTask task = taskList.GetTask( 0u ); + DALI_TEST_CHECK( false == task.IsExclusive() ); - Actor actor = task.GetCameraActor(); - DALI_TEST_CHECK( actor ); - - CameraActor newActor = CameraActor::New(); - DALI_TEST_CHECK( newActor ); + RenderTask newTask = taskList.CreateTask(); + DALI_TEST_CHECK( false == newTask.IsExclusive() ); - task.SetCameraActor( newActor ); - DALI_TEST_CHECK( task.GetCameraActor() != actor ); - DALI_TEST_CHECK( task.GetCameraActor() == newActor ); END_TEST; } -int UtcDaliRenderTaskGetCameraActor(void) +int UtcDaliRenderTaskIsExclusive02(void) { TestApplication application; - tet_infoline("Testing RenderTask::GetCameraActor()"); + tet_infoline("Testing RenderTask::IsExclusive() Check the getter returns set values"); RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); - RenderTask task = taskList.GetTask( 0u ); - - Actor actor = task.GetCameraActor(); - DALI_TEST_CHECK( actor ); - + // Not exclusive is the default RenderTask newTask = taskList.CreateTask(); - DALI_TEST_CHECK( actor == newTask.GetCameraActor() ); + DALI_TEST_EQUALS( newTask.IsExclusive(), false, TEST_LOCATION ); + + newTask.SetExclusive(true); + DALI_TEST_EQUALS( newTask.IsExclusive(), true, TEST_LOCATION ); END_TEST; } -int UtcDaliRenderTaskSetTargetFrameBuffer(void) +int UtcDaliRenderTaskIsExclusiveN(void) { TestApplication application; - tet_infoline("Testing RenderTask::SetTargetFrameBuffer()"); - - RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); - - RenderTask task = taskList.GetTask( 0u ); - - // By default render-tasks do not render off-screen - FrameBufferImage image = task.GetTargetFrameBuffer(); - DALI_TEST_CHECK( !image ); - - FrameBufferImage newImage = FrameBufferImage::New(); + tet_infoline("Testing RenderTask::IsExclusive() on empty handle"); - task.SetTargetFrameBuffer( newImage ); - DALI_TEST_CHECK( task.GetTargetFrameBuffer() == newImage ); + RenderTask task; + try + { + bool x = task.IsExclusive(); + (void) x; + } + catch (Dali::DaliException& e) + { + DALI_TEST_PRINT_ASSERT( e ); + DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION); + } END_TEST; } -int UtcDaliRenderTaskGetTargetFrameBuffer(void) +int UtcDaliRenderTaskSetInputEnabled(void) { TestApplication application; - tet_infoline("Testing RenderTask::GetTargetFrameBuffer()"); + tet_infoline("Testing RenderTask::SetInputEnabled()"); RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + // Input is enabled by default RenderTask task = taskList.GetTask( 0u ); + DALI_TEST_CHECK( true == task.GetInputEnabled() ); - // By default render-tasks do not render off-screen - FrameBufferImage image = task.GetTargetFrameBuffer(); - DALI_TEST_CHECK( !image ); + task.SetInputEnabled( false ); + DALI_TEST_CHECK( false == task.GetInputEnabled() ); - RenderTask newTask = taskList.CreateTask(); - DALI_TEST_CHECK( !newTask.GetTargetFrameBuffer() ); + task.SetInputEnabled( true ); + DALI_TEST_CHECK( true == task.GetInputEnabled() ); END_TEST; } -int UtcDaliRenderTaskSetScreenToFrameBufferFunction(void) +int UtcDaliRenderTaskGetInputEnabled(void) { TestApplication application; - tet_infoline("Testing RenderTask::SetScreenToFrameBufferFunction()"); + tet_infoline("Testing RenderTask::GetInputEnabled()"); RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + // Input is enabled by default RenderTask task = taskList.GetTask( 0u ); + DALI_TEST_EQUALS( true, task.GetInputEnabled(), TEST_LOCATION ); - task.SetScreenToFrameBufferFunction( TestScreenToFrameBufferFunction ); - - Vector2 coordinates( 5, 10 ); - Vector2 convertedCoordinates( 6, 12 ); // + Vector(1, 2) - - RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction(); - DALI_TEST_CHECK( func( coordinates ) ); - DALI_TEST_CHECK( coordinates == convertedCoordinates ); + RenderTask newTask = taskList.CreateTask(); + DALI_TEST_EQUALS( true, newTask.GetInputEnabled(), TEST_LOCATION ); - task.SetScreenToFrameBufferFunction( RenderTask::FULLSCREEN_FRAMEBUFFER_FUNCTION ); - func = task.GetScreenToFrameBufferFunction(); - DALI_TEST_CHECK( func( coordinates ) ); + newTask.SetInputEnabled(false); + DALI_TEST_EQUALS( false, newTask.GetInputEnabled(), TEST_LOCATION ); - task.SetScreenToFrameBufferFunction( RenderTask::DEFAULT_SCREEN_TO_FRAMEBUFFER_FUNCTION ); - func = task.GetScreenToFrameBufferFunction(); - DALI_TEST_CHECK( ! func( coordinates ) ); END_TEST; } -int UtcDaliRenderTaskGetScreenToFrameBufferFunction(void) +int UtcDaliRenderTaskSetCameraActorP(void) { TestApplication application; - tet_infoline("Testing RenderTask::GetScreenToFrameBufferFunction()"); + tet_infoline("Testing RenderTask::SetCameraActor()"); RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); RenderTask task = taskList.GetTask( 0u ); - Vector2 originalCoordinates( 5, 10 ); - Vector2 coordinates( 5, 10 ); + Actor defaultCameraActor = task.GetCameraActor(); + DALI_TEST_CHECK( defaultCameraActor ); - RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction(); - DALI_TEST_CHECK( !func( coordinates ) ); // conversion should fail by default - DALI_TEST_CHECK( coordinates == originalCoordinates ); // coordinates should not be modified + CameraActor newCameraActor = CameraActor::New(); + DALI_TEST_CHECK( newCameraActor ); + + task.SetCameraActor( newCameraActor ); + DALI_TEST_CHECK( task.GetCameraActor() != defaultCameraActor ); + DALI_TEST_EQUALS( task.GetCameraActor(), newCameraActor, TEST_LOCATION ); END_TEST; } -int UtcDaliRenderTaskGetScreenToFrameBufferMappingActor(void) +int UtcDaliRenderTaskSetCameraActorN(void) { TestApplication application; - tet_infoline("Testing RenderTask::GetScreenToFrameBufferMappingActor "); + + tet_infoline("Testing RenderTask::SetCameraActor() with empty actor handle"); RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); - RenderTask renderTask = taskList.CreateTask(); - Actor mappingActor = Actor::New(); - renderTask.SetScreenToFrameBufferMappingActor(mappingActor); - DALI_TEST_CHECK( mappingActor == renderTask.GetScreenToFrameBufferMappingActor() ); + RenderTask task = taskList.GetTask( 0u ); + + Actor actor = task.GetCameraActor(); + DALI_TEST_CHECK( actor ); + + CameraActor cameraActor; + + task.SetCameraActor( cameraActor ); + DALI_TEST_EQUALS( (bool)task.GetCameraActor(), false, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetCameraActor(), cameraActor, TEST_LOCATION ); END_TEST; } -int UtcDaliRenderTaskSetViewport(void) +int UtcDaliRenderTaskSetCameraActorDestroyed(void) { TestApplication application; - tet_infoline("Testing RenderTask::SetViewport()"); - - RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + tet_infoline( "Testing RenderTask::SetCameraActor - Set a camera actor and destroy the camera actor" ); + Stage stage = Stage::GetCurrent(); + RenderTaskList taskList = stage.GetRenderTaskList(); RenderTask task = taskList.GetTask( 0u ); - Viewport viewport = task.GetViewport(); - - // By default the viewport should match the stage width/height + CameraActor newCameraActor = CameraActor::New(); + task.SetCameraActor( newCameraActor ); - Vector2 stageSize = Stage::GetCurrent().GetSize(); - Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height ); - DALI_TEST_CHECK( viewport == expectedViewport ); + DALI_TEST_EQUALS( task.GetCameraActor(), newCameraActor, TEST_LOCATION ); - Viewport newViewport( 0, 0, stageSize.width * 0.5f, stageSize.height * 0.5f ); - task.SetViewport( newViewport ); + // Destroy the camera actor + newCameraActor.Reset(); - // Update (viewport is a property) - application.SendNotification(); - application.Render(); + CameraActor camera = task.GetCameraActor(); + DALI_TEST_CHECK( !camera ); // The camera actor should be an empty handle. - DALI_TEST_CHECK( task.GetViewport() == newViewport ); END_TEST; } -int UtcDaliRenderTaskGetViewport(void) +int UtcDaliRenderTaskGetCameraActorP(void) { TestApplication application; - tet_infoline("Testing RenderTask::GetViewport()"); + tet_infoline("Testing RenderTask::GetCameraActor()"); RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); RenderTask task = taskList.GetTask( 0u ); - Viewport viewport = task.GetViewport(); + CameraActor actor = task.GetCameraActor(); + DALI_TEST_CHECK( actor ); + DALI_TEST_EQUALS( actor.GetProjectionMode(), Dali::Camera::PERSPECTIVE_PROJECTION, TEST_LOCATION ); + DALI_TEST_GREATER( actor.GetFieldOfView(), 0.0f, TEST_LOCATION ); + END_TEST; +} - // By default the viewport should match the stage width/height +int UtcDaliRenderTaskGetCameraActorN(void) +{ + TestApplication application; - Vector2 stageSize = Stage::GetCurrent().GetSize(); - Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height ); - DALI_TEST_CHECK( viewport == expectedViewport ); + tet_infoline("Testing RenderTask::GetCameraActor() with empty handle"); + RenderTask task; + + try + { + Actor actor = task.GetCameraActor(); + } + catch (Dali::DaliException& e) + { + DALI_TEST_PRINT_ASSERT( e ); + DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION); + } - RenderTask newTask = taskList.CreateTask(); - DALI_TEST_CHECK( newTask.GetViewport() == expectedViewport ); END_TEST; } -int UtcDaliRenderTaskSetViewportPosition(void) +int UtcDaliRenderTaskSetTargetFrameBufferP(void) { TestApplication application; - tet_infoline("Testing RenderTask::SetViewportPosition()"); + tet_infoline("Testing RenderTask::SetTargetFrameBuffer()"); RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); RenderTask task = taskList.GetTask( 0u ); - Viewport viewport = task.GetViewport(); - - // By default the viewport should match the stage width/height - - Vector2 stageSize = Stage::GetCurrent().GetSize(); - Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height ); - DALI_TEST_CHECK( viewport == expectedViewport ); - - // 'Setter' test - Vector2 newPosition(25.0f, 50.0f); - task.SetViewportPosition( newPosition ); - - // Update (viewport is a property) - application.SendNotification(); - application.Render(); - - DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition, Math::MACHINE_EPSILON_1, TEST_LOCATION ); - - // Set by Property test - Vector2 newPosition2(32.0f, 32.0f); - task.SetProperty( RenderTask::VIEWPORT_POSITION, newPosition2 ); - - // Update - application.SendNotification(); - application.Render(); - - DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition2, Math::MACHINE_EPSILON_1, TEST_LOCATION ); - - Vector2 newPosition3(64.0f, 0.0f); - Animation animation = Animation::New(1.0f); - animation.AnimateTo( Property( task, RenderTask::VIEWPORT_POSITION ), newPosition3, AlphaFunctions::Linear ); - animation.Play(); - - // Perform 1000ms worth of updates at which point animation should have completed. - Wait(application, 1000); - DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + FrameBufferImage newImage = FrameBufferImage::New(); + task.SetTargetFrameBuffer( newImage ); + DALI_TEST_CHECK( task.GetTargetFrameBuffer() == newImage ); END_TEST; } -int UtcDaliRenderTaskSetViewportSize(void) +int UtcDaliRenderTaskSetTargetFrameBufferN(void) { TestApplication application; - tet_infoline("Testing RenderTask::SetViewportSize()"); + tet_infoline("Testing RenderTask::SetTargetFrameBuffer()"); RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); RenderTask task = taskList.GetTask( 0u ); + FrameBufferImage newImage; // Empty handle + task.SetTargetFrameBuffer( newImage ); + DALI_TEST_EQUALS( (bool)task.GetTargetFrameBuffer(), false, TEST_LOCATION ); + END_TEST; +} - Viewport viewport = task.GetViewport(); - - // By default the viewport should match the stage width/height - - Vector2 stageSize = Stage::GetCurrent().GetSize(); - Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height ); - DALI_TEST_CHECK( viewport == expectedViewport ); - - Vector2 newSize(128.0f, 64.0f); - task.SetViewportSize( newSize ); - - // Update (viewport is a property) - application.SendNotification(); - application.Render(); - - DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize, Math::MACHINE_EPSILON_1, TEST_LOCATION ); - - // Set by Property test - Vector2 newSize2(50.0f, 50.0f); - task.SetProperty( RenderTask::VIEWPORT_SIZE, newSize2 ); - - // Update - application.SendNotification(); - application.Render(); - - DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize2, Math::MACHINE_EPSILON_1, TEST_LOCATION ); +int UtcDaliRenderTaskGetTargetFrameBufferP(void) +{ + TestApplication application; - Vector2 newSize3(10.0f, 10.0f); - Animation animation = Animation::New(1.0f); - animation.AnimateTo( Property( task, RenderTask::VIEWPORT_SIZE ), newSize3, AlphaFunctions::Linear ); - animation.Play(); + tet_infoline("Testing RenderTask::GetTargetFrameBuffer()"); - // Perform 1000ms worth of updates at which point animation should have completed. - Wait(application, 1000); - DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + RenderTask newTask = taskList.CreateTask(); + FrameBufferImage fb = FrameBufferImage::New(128, 128, Pixel::RGBA8888); + newTask.SetTargetFrameBuffer( fb ); + DALI_TEST_EQUALS( newTask.GetTargetFrameBuffer(), fb, TEST_LOCATION ); END_TEST; } -int UtcDaliRenderTaskSetClearColor(void) +int UtcDaliRenderTaskGetTargetFrameBufferN(void) { TestApplication application; - tet_infoline("Testing RenderTask::SetClearColor()"); - - Vector4 testColor( 1.0f, 2.0f, 3.0f, 4.0f ); - Vector4 testColor2( 5.0f, 6.0f, 7.0f, 8.0f ); + tet_infoline("Testing RenderTask::GetTargetFrameBuffer()"); RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); RenderTask task = taskList.GetTask( 0u ); - DALI_TEST_CHECK( task.GetClearColor() != testColor ); - - task.SetClearColor( testColor ); - // Wait a frame. - Wait(application); - - DALI_TEST_EQUALS( task.GetClearColor(), testColor, TEST_LOCATION ); - - task.SetProperty( RenderTask::CLEAR_COLOR, testColor2 ); - - // Wait a frame. - Wait(application); + // By default render-tasks do not render off-screen + FrameBufferImage image = task.GetTargetFrameBuffer(); + DALI_TEST_CHECK( !image ); - DALI_TEST_EQUALS( task.GetClearColor(), testColor2, TEST_LOCATION ); END_TEST; } -int UtcDaliRenderTaskGetClearColor(void) +int UtcDaliRenderTaskSetFrameBufferP(void) { TestApplication application; - tet_infoline("Testing RenderTask::GetClearColor()"); + tet_infoline("Testing RenderTask::SetFrameBuffer()"); RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + RenderTask task = taskList.GetTask( 0u ); - DALI_TEST_EQUALS( task.GetClearColor(), RenderTask::DEFAULT_CLEAR_COLOR, TEST_LOCATION ); + + FrameBuffer newFrameBuffer = FrameBuffer::New( 128u, 128u, FrameBuffer::Attachment::NONE ); + task.SetFrameBuffer( newFrameBuffer ); + DALI_TEST_CHECK( task.GetFrameBuffer() == newFrameBuffer ); END_TEST; } -int UtcDaliRenderTaskSetClearEnabled(void) +int UtcDaliRenderTaskSetFrameBufferN(void) { TestApplication application; - tet_infoline("Testing RenderTask::SetClearEnabled()"); + tet_infoline("Testing RenderTask::SetFrameBuffer()"); RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); RenderTask task = taskList.GetTask( 0u ); - DALI_TEST_CHECK( !task.GetClearEnabled() ); // defaults to false - - task.SetClearEnabled( true ); - DALI_TEST_EQUALS( task.GetClearEnabled(), true, TEST_LOCATION ); - - task.SetClearEnabled( false ); - DALI_TEST_EQUALS( task.GetClearEnabled(), false, TEST_LOCATION ); + FrameBuffer newFrameBuffer; // Empty handle + task.SetFrameBuffer( newFrameBuffer ); + DALI_TEST_EQUALS( (bool)task.GetFrameBuffer(), false, TEST_LOCATION ); END_TEST; } -int UtcDaliRenderTaskGetClearEnabled(void) +int UtcDaliRenderTaskGetFrameBufferP(void) { TestApplication application; - tet_infoline("Testing RenderTask::GetClearEnabled()"); + tet_infoline("Testing RenderTask::GetFrameBuffer()"); RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); RenderTask task = taskList.GetTask( 0u ); - DALI_TEST_CHECK( !task.GetClearEnabled() ); // defaults to false + + FrameBuffer newFrameBuffer = FrameBuffer::New( 1u, 1u, FrameBuffer::Attachment::NONE ); + task.SetFrameBuffer( newFrameBuffer ); + DALI_TEST_CHECK( task.GetFrameBuffer() == newFrameBuffer ); END_TEST; } -int UtcDaliRenderTaskSetRefreshRate(void) +int UtcDaliRenderTaskGetFrameBufferN(void) { TestApplication application; - tet_infoline("Testing RenderTask::SetRefreshRate()"); + tet_infoline("Testing RenderTask::GetFrameBuffer()"); RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); - // By default tasks will be processed every frame RenderTask task = taskList.GetTask( 0u ); - DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() ); - task.SetRefreshRate( 2u ); // every-other frame - DALI_TEST_CHECK( 2u == task.GetRefreshRate() ); + // A scene creates frame buffer by default + FrameBuffer frameBuffer = task.GetFrameBuffer(); + DALI_TEST_CHECK( frameBuffer ); - task.SetRefreshRate( RenderTask::REFRESH_ALWAYS ); - DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() ); END_TEST; } -int UtcDaliRenderTaskGetRefreshRate(void) +int UtcDaliRenderTaskSetScreenToFrameBufferFunctionP(void) { TestApplication application; - tet_infoline("Testing RenderTask::GetRefreshRate()"); + tet_infoline("Testing RenderTask::SetScreenToFrameBufferFunction()"); RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); - // By default tasks will be processed every frame RenderTask task = taskList.GetTask( 0u ); - DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() ); - RenderTask newTask = taskList.CreateTask(); - DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == newTask.GetRefreshRate() ); + task.SetScreenToFrameBufferFunction( TestScreenToFrameBufferFunction ); + + Vector2 coordinates( 5, 10 ); + Vector2 convertedCoordinates( 6, 12 ); // + Vector(1, 2) + + RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction(); + DALI_TEST_CHECK( func( coordinates ) ); + DALI_TEST_CHECK( coordinates == convertedCoordinates ); + + task.SetScreenToFrameBufferFunction( RenderTask::FULLSCREEN_FRAMEBUFFER_FUNCTION ); + func = task.GetScreenToFrameBufferFunction(); + DALI_TEST_CHECK( func( coordinates ) ); + + task.SetScreenToFrameBufferFunction( RenderTask::DEFAULT_SCREEN_TO_FRAMEBUFFER_FUNCTION ); + func = task.GetScreenToFrameBufferFunction(); + DALI_TEST_CHECK( ! func( coordinates ) ); END_TEST; } -int UtcDaliRenderTaskSignalFinished(void) +int UtcDaliRenderTaskSetScreenToFrameBufferFunctionN(void) { TestApplication application; - tet_infoline("Testing RenderTask::SignalFinished()"); - - application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); - TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction(); + tet_infoline("Testing RenderTask::SetScreenToFrameBufferFunction()"); - CameraActor offscreenCameraActor = CameraActor::New(); + RenderTask task; // Empty handle + try + { + task.SetScreenToFrameBufferFunction( TestScreenToFrameBufferFunction ); + } + catch (Dali::DaliException& e) + { + DALI_TEST_PRINT_ASSERT( e ); + DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION); + } + END_TEST; +} - Stage::GetCurrent().Add( offscreenCameraActor ); +int UtcDaliRenderTaskGetScreenToFrameBufferFunctionP(void) +{ + TestApplication application; - BitmapImage image = BitmapImage::New( 10, 10 ); - ImageActor rootActor = ImageActor::New( image ); - rootActor.SetSize( 10, 10 ); - Stage::GetCurrent().Add( rootActor ); + tet_infoline("Testing RenderTask::GetScreenToFrameBufferFunction()"); RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); - NativeImagePtr testNativeImagePtr = new TestNativeImage(10, 10); - FrameBufferImage frameBufferImage = FrameBufferImage::New( *testNativeImagePtr.Get() ); - // Flush all outstanding messages + RenderTask task = taskList.GetTask( 0u ); + + Vector2 originalCoordinates( 5, 10 ); + Vector2 coordinates( 5, 10 ); + + RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction(); + DALI_TEST_CHECK( !func( coordinates ) ); // conversion should fail by default + DALI_TEST_CHECK( coordinates == originalCoordinates ); // coordinates should not be modified + END_TEST; +} + +int UtcDaliRenderTaskGetScreenToFrameBufferFunctionN(void) +{ + TestApplication application; + + tet_infoline("Testing RenderTask::GetScreenToFrameBufferFunction() on empty handle"); + + RenderTask task; + try + { + RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction(); + (void) func; + } + catch (Dali::DaliException& e) + { + DALI_TEST_PRINT_ASSERT( e ); + DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION); + } + END_TEST; +} + + +int UtcDaliRenderTaskGetScreenToFrameBufferMappingActorP(void) +{ + TestApplication application; + tet_infoline("Testing RenderTask::GetScreenToFrameBufferMappingActor "); + + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + RenderTask renderTask = taskList.CreateTask(); + Actor mappingActor = Actor::New(); + renderTask.SetScreenToFrameBufferMappingActor(mappingActor); + + DALI_TEST_EQUALS( mappingActor, renderTask.GetScreenToFrameBufferMappingActor(), TEST_LOCATION ); + END_TEST; +} + + +int UtcDaliRenderTaskGetScreenToFrameBufferMappingActorN(void) +{ + TestApplication application; + tet_infoline("Testing RenderTask::GetScreenToFrameBufferMappingActor with empty task handle"); + + RenderTask task; + try + { + Actor mappingActor; + task.SetScreenToFrameBufferMappingActor(mappingActor); + } + catch (Dali::DaliException& e) + { + DALI_TEST_PRINT_ASSERT( e ); + DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION); + } + END_TEST; +} + +int UtcDaliRenderTaskGetScreenToFrameBufferMappingActor02N(void) +{ + TestApplication application; + tet_infoline("Testing RenderTask::GetScreenToFrameBufferMappingActor with empty task handle"); + + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + RenderTask renderTask = taskList.CreateTask(); + Actor actor; + renderTask.SetScreenToFrameBufferMappingActor(actor); + + DALI_TEST_EQUALS( (bool)renderTask.GetScreenToFrameBufferMappingActor(), false, TEST_LOCATION); + END_TEST; +} + +int UtcDaliRenderTaskGetViewportP01(void) +{ + TestApplication application; + + tet_infoline("Testing RenderTask::GetViewport() on default task"); + + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + RenderTask task = taskList.GetTask( 0u ); + Viewport viewport = task.GetViewport(); + + // By default the viewport should match the stage width/height + Vector2 stageSize = Stage::GetCurrent().GetSize(); + Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height ); + DALI_TEST_CHECK( viewport == expectedViewport ); + END_TEST; +} + +int UtcDaliRenderTaskGetViewportP02(void) +{ + TestApplication application; + + tet_infoline("Testing RenderTask::GetViewport() on new task"); + + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + RenderTask task = taskList.CreateTask(); + Viewport viewport = task.GetViewport(); + + // By default the viewport should match the stage width/height + Vector2 stageSize = Stage::GetCurrent().GetSize(); + Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height ); + DALI_TEST_CHECK( viewport == expectedViewport ); + END_TEST; +} + +int UtcDaliRenderTaskGetViewportN(void) +{ + TestApplication application; + + tet_infoline("Testing RenderTask::GetViewport() on empty handle"); + + RenderTask task; + try + { + Viewport viewport = task.GetViewport(); + (void) viewport; + } + catch (Dali::DaliException& e) + { + DALI_TEST_PRINT_ASSERT( e ); + DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION); + } + END_TEST; +} + + +int UtcDaliRenderTaskSetViewportP(void) +{ + TestApplication application; + + tet_infoline("Testing RenderTask::SetViewport()"); + + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + + RenderTask task = taskList.GetTask( 0u ); + Vector2 stageSize = Stage::GetCurrent().GetSize(); + Viewport newViewport( 0, 0, stageSize.width * 0.5f, stageSize.height * 0.5f ); + task.SetViewport( newViewport ); + + // Update (viewport is a property) application.SendNotification(); application.Render(); - RenderTask newTask = taskList.CreateTask(); - newTask.SetCameraActor( offscreenCameraActor ); - newTask.SetSourceActor( rootActor ); - newTask.SetInputEnabled( false ); - newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) ); - newTask.SetClearEnabled( true ); - newTask.SetExclusive( true ); - newTask.SetRefreshRate( RenderTask::REFRESH_ONCE ); - newTask.SetTargetFrameBuffer( frameBufferImage ); + DALI_TEST_CHECK( task.GetViewport() == newViewport ); + END_TEST; +} - // Framebuffer doesn't actually get created until Connected, i.e. by previous line +int UtcDaliRenderTaskSetViewportN(void) +{ + TestApplication application; - bool finished = false; - RenderTaskFinished renderTaskFinished( finished ); - newTask.FinishedSignal().Connect( &application, renderTaskFinished ); + tet_infoline("Testing RenderTask::SetViewport()"); - // Flush the queue and render. - application.SendNotification(); + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); - // 1 render to process render task, then wait for sync before finished msg is sent - // from update to the event thread. + RenderTask task; + try + { + Vector2 stageSize = Stage::GetCurrent().GetSize(); + Viewport newViewport( 0, 0, stageSize.width * 0.5f, stageSize.height * 0.5f ); + task.SetViewport( newViewport ); + } + catch (Dali::DaliException& e) + { + DALI_TEST_PRINT_ASSERT( e ); + DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION); + } - application.Render(); - application.SendNotification(); - DALI_TEST_CHECK( !finished ); + END_TEST; +} - Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject(); - DALI_TEST_CHECK( lastSyncObj != NULL ); - application.Render(); - DALI_TEST_EQUALS( (application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION ); - application.SendNotification(); - DALI_TEST_CHECK( !finished ); +int UtcDaliRenderTaskSetViewportPosition(void) +{ + TestApplication application; - application.Render(); - DALI_TEST_EQUALS( (application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION ); - application.SendNotification(); - DALI_TEST_CHECK( ! finished ); + tet_infoline("Testing RenderTask::SetViewportPosition()"); - sync.SetObjectSynced( lastSyncObj, true ); + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); - application.Render(); + RenderTask task = taskList.GetTask( 0u ); + + Viewport viewport = task.GetViewport(); + + // By default the viewport should match the stage width/height + + Vector2 stageSize = Stage::GetCurrent().GetSize(); + Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height ); + DALI_TEST_CHECK( viewport == expectedViewport ); + + // 'Setter' test + Vector2 newPosition(25.0f, 50.0f); + task.SetViewportPosition( newPosition ); + + // Update (viewport is a property) application.SendNotification(); - DALI_TEST_CHECK( !finished ); + application.Render(); + + DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + + // Set by Property test + Vector2 newPosition2(32.0f, 32.0f); + task.SetProperty( RenderTask::Property::VIEWPORT_POSITION, newPosition2 ); + DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition2, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition, TEST_LOCATION ); // still the old position + // Update + application.SendNotification(); application.Render(); + + DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition2, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition2, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition2, TEST_LOCATION ); + + Vector2 newPosition3(64.0f, 0.0f); + Animation animation = Animation::New(1.0f); + animation.AnimateTo( Property( task, RenderTask::Property::VIEWPORT_POSITION ), newPosition3, AlphaFunction::LINEAR ); + animation.Play(); + + DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition2, TEST_LOCATION ); + + // Perform 1000ms worth of updates at which point animation should have completed. + Wait(application, 1000); + DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + + // Create another animation which animates by a certain value + const Vector2 newPosition4( 75.0f, 45.0f ); + const Vector2 relativePosition( newPosition4 - newPosition3 ); + animation = Animation::New( 1.0f ); + animation.AnimateBy( Property( task, RenderTask::Property::VIEWPORT_POSITION ), relativePosition ); + animation.Play(); + + DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition4, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition3, TEST_LOCATION ); + + // Perform 1000ms worth of updates at which point animation should have completed. + Wait(application, 1000); + DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition4, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition4, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_POSITION ), newPosition4, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliRenderTaskSetViewportSize(void) +{ + TestApplication application; + + tet_infoline("Testing RenderTask::SetViewportSize()"); + + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + + RenderTask task = taskList.GetTask( 0u ); + + Viewport viewport = task.GetViewport(); + + // By default the viewport should match the stage width/height + + Vector2 stageSize = Stage::GetCurrent().GetSize(); + Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height ); + DALI_TEST_CHECK( viewport == expectedViewport ); + + Vector2 newSize(128.0f, 64.0f); + task.SetViewportSize( newSize ); + + // Update (viewport is a property) application.SendNotification(); - DALI_TEST_CHECK( finished ); - finished = false; + application.Render(); - application.Render(); // Double check no more finished signal + DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + + // Set by Property test + Vector2 newSize2(50.0f, 50.0f); + task.SetProperty( RenderTask::Property::VIEWPORT_SIZE, newSize2 ); + DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize2, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize, TEST_LOCATION ); // still the old position + + // Update application.SendNotification(); - DALI_TEST_CHECK( ! finished ); + application.Render(); + + DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize2, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize2, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize2, TEST_LOCATION ); + + Vector2 newSize3(10.0f, 10.0f); + Animation animation = Animation::New(1.0f); + animation.AnimateTo( Property( task, RenderTask::Property::VIEWPORT_SIZE ), newSize3, AlphaFunction::LINEAR ); + animation.Play(); + + DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize2, TEST_LOCATION ); + + // Perform 1000ms worth of updates at which point animation should have completed. + Wait(application, 1000); + DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + + // Create another animation which animates by a certain value + const Vector2 newSize4( 75.0f, 45.0f ); + const Vector2 relativeSize( newSize4 - newSize3 ); + animation = Animation::New( 1.0f ); + animation.AnimateBy( Property( task, RenderTask::Property::VIEWPORT_SIZE ), relativeSize ); + animation.Play(); + + DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize4, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize3, TEST_LOCATION ); + + // Perform 1000ms worth of updates at which point animation should have completed. + Wait(application, 1000); + DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize4, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetCurrentProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize4, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetProperty< Vector2 >( RenderTask::Property::VIEWPORT_SIZE ), newSize4, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + END_TEST; } - -int UtcDaliRenderTaskContinuous01(void) +int UtcDaliRenderTaskSetClearColorP(void) { TestApplication application; - tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (source actor not staged)\nPOST:continuous renders, no Finished signal"); + tet_infoline("Testing RenderTask::SetClearColor()"); - // SETUP AN OFFSCREEN RENDER TASK - application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); - TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace(); - drawTrace.Enable(true); + Vector4 testColor( 1.0f, 2.0f, 3.0f, 4.0f ); + Vector4 testColor2( 5.0f, 6.0f, 7.0f, 8.0f ); - Actor rootActor = Actor::New(); - Stage::GetCurrent().Add( rootActor ); + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); - CameraActor offscreenCameraActor = CameraActor::New(); - Stage::GetCurrent().Add( offscreenCameraActor ); + RenderTask task = taskList.GetTask( 0u ); + DALI_TEST_CHECK( task.GetClearColor() != testColor ); - ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused); - Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest(); - Integration::ResourceId imageRequestId = imageRequest->GetId(); - Integration::ResourceTypeId imageType = imageRequest->GetType()->id; + task.SetClearColor( testColor ); - RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true); - bool finished = false; - RenderTaskFinished renderTaskFinished( finished ); - newTask.FinishedSignal().Connect( &application, renderTaskFinished ); - CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete - application.SendNotification(); + // Wait a frame. + Wait(application); - // START PROCESS/RENDER Input, Expected Input, Expected, KeepUpdating - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - application.GetPlatform().ClearReadyResources(); + DALI_TEST_EQUALS( task.GetClearColor(), testColor, TEST_LOCATION ); + + task.SetProperty( RenderTask::Property::CLEAR_COLOR, testColor2 ); + DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor2, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor, TEST_LOCATION ); // still the old color + + // Wait a frame. + Wait(application); + + DALI_TEST_EQUALS( task.GetClearColor(), testColor2, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor2, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor2, TEST_LOCATION ); + + Vector4 newColor3(10.0f, 10.0f, 20.0f, 30.0f); + Animation animation = Animation::New(1.0f); + animation.AnimateTo( Property( task, RenderTask::Property::CLEAR_COLOR ), newColor3, AlphaFunction::LINEAR ); + animation.Play(); + + DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor3, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), testColor2, TEST_LOCATION ); + + // Perform 1000ms worth of updates at which point animation should have completed. + Wait(application, 1000); + DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor3, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor3, Math::MACHINE_EPSILON_1, TEST_LOCATION ); + + // Create another animation which animates by a certain value + const Vector4 newColor4( 0.45f, 0.35f, 0.25f, 0.1f ); + const Vector4 relativeColor( newColor4 - newColor3 ); + animation = Animation::New( 1.0f ); + animation.AnimateBy( Property( task, RenderTask::Property::CLEAR_COLOR ), relativeColor ); + animation.Play(); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false ) ); + DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor4, Math::MACHINE_EPSILON_10, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor3, Math::MACHINE_EPSILON_10, TEST_LOCATION ); - // ADD SOURCE ACTOR TO STAGE - expect continuous renders to start, no finished signal - Stage::GetCurrent().Add(secondRootActor); - application.SendNotification(); + // Perform 1000ms worth of updates at which point animation should have completed. + Wait(application, 1000); + DALI_TEST_EQUALS( task.GetCurrentProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor4, Math::MACHINE_EPSILON_10, TEST_LOCATION ); + DALI_TEST_EQUALS( task.GetProperty< Vector4 >( RenderTask::Property::CLEAR_COLOR ), newColor4, Math::MACHINE_EPSILON_10, TEST_LOCATION ); - // CONTINUE PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) ); END_TEST; } - -int UtcDaliRenderTaskContinuous02(void) +int UtcDaliRenderTaskSetClearColorN(void) { TestApplication application; - tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (source actor not visible)\nPOST:continuous renders, no Finished signal"); - - // SETUP AN OFFSCREEN RENDER TASK - application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); - TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace(); - drawTrace.Enable(true); + tet_infoline("Testing RenderTask::SetClearColor() on empty handle"); - Actor rootActor = Actor::New(); - Stage::GetCurrent().Add( rootActor ); + RenderTask task; + try + { + task.SetClearColor( Vector4::ZERO ); + } + catch (Dali::DaliException& e) + { + DALI_TEST_PRINT_ASSERT( e ); + DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION); + } + END_TEST; +} - CameraActor offscreenCameraActor = CameraActor::New(); - Stage::GetCurrent().Add( offscreenCameraActor ); +int UtcDaliRenderTaskGetClearColorP(void) +{ + TestApplication application; - ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused); - Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest(); - Integration::ResourceId imageRequestId = imageRequest->GetId(); - Integration::ResourceTypeId imageType = imageRequest->GetType()->id; - Stage::GetCurrent().Add(secondRootActor); - secondRootActor.SetVisible(false); + tet_infoline("Testing RenderTask::GetClearColor()"); - RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true); - bool finished = false; - RenderTaskFinished renderTaskFinished( finished ); - newTask.FinishedSignal().Connect( &application, renderTaskFinished ); - CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete - application.SendNotification(); + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + RenderTask task = taskList.GetTask( 0u ); + DALI_TEST_EQUALS( task.GetClearColor(), RenderTask::DEFAULT_CLEAR_COLOR, TEST_LOCATION ); + END_TEST; +} - // START PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - application.GetPlatform().ClearReadyResources(); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false ) ); +int UtcDaliRenderTaskGetClearColorN(void) +{ + TestApplication application; - // MAKE SOURCE ACTOR VISIBLE - expect continuous renders to start, no finished signal - secondRootActor.SetVisible(true); - application.SendNotification(); + tet_infoline("Testing RenderTask::GetClearColor()"); - // CONTINUE PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) ); + RenderTask task; + try + { + Vector4 color = task.GetClearColor(); + (void) color; + } + catch (Dali::DaliException& e) + { + DALI_TEST_PRINT_ASSERT( e ); + DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION); + } END_TEST; } -int UtcDaliRenderTaskContinuous03(void) +int UtcDaliRenderTaskSetClearEnabledP(void) { TestApplication application; - tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (camera actor not staged)\nPOST:continuous renders, no Finished signal"); + tet_infoline("Testing RenderTask::SetClearEnabled()"); - // SETUP AN OFFSCREEN RENDER TASK - application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); - TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace(); - drawTrace.Enable(true); + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); - Actor rootActor = Actor::New(); - Stage::GetCurrent().Add( rootActor ); + RenderTask task = taskList.GetTask( 0u ); + DALI_TEST_CHECK( task.GetClearEnabled() ); // defaults to true - CameraActor offscreenCameraActor = CameraActor::New(); - ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused); - Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest(); - Integration::ResourceId imageRequestId = imageRequest->GetId(); - Integration::ResourceTypeId imageType = imageRequest->GetType()->id; - Stage::GetCurrent().Add(secondRootActor); + task.SetClearEnabled( false ); + DALI_TEST_EQUALS( task.GetClearEnabled(), false, TEST_LOCATION ); - RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true); - bool finished = false; - RenderTaskFinished renderTaskFinished( finished ); - newTask.FinishedSignal().Connect( &application, renderTaskFinished ); - CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete - application.SendNotification(); + task.SetClearEnabled( true ); + DALI_TEST_EQUALS( task.GetClearEnabled(), true, TEST_LOCATION ); + END_TEST; +} - // START PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - application.GetPlatform().ClearReadyResources(); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false ) ); +int UtcDaliRenderTaskSetClearEnabledN(void) +{ + TestApplication application; - // ADD CAMERA ACTOR TO STAGE - expect continuous renders to start, no finished signal - Stage::GetCurrent().Add( offscreenCameraActor ); - application.SendNotification(); + tet_infoline("Testing RenderTask::SetClearEnabled() with empty handle"); - // CONTINUE PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) ); + RenderTask task; + try + { + task.SetClearEnabled(true); + } + catch (Dali::DaliException& e) + { + DALI_TEST_PRINT_ASSERT( e ); + DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION); + } END_TEST; } - -int UtcDaliRenderTaskContinuous04(void) +int UtcDaliRenderTaskGetClearEnabledP(void) { TestApplication application; - tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: Resource not ready\nPOST:continuous renders, no Finished signal"); + tet_infoline("Testing RenderTask::GetClearEnabled()"); - // SETUP AN OFFSCREEN RENDER TASK - application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); - TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace(); - drawTrace.Enable(true); + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); - Actor rootActor = Actor::New(); - Stage::GetCurrent().Add( rootActor ); + RenderTask task = taskList.GetTask( 0u ); + DALI_TEST_CHECK( task.GetClearEnabled() ); // defaults to true + END_TEST; +} - CameraActor offscreenCameraActor = CameraActor::New(); - Stage::GetCurrent().Add( offscreenCameraActor ); - ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused); - Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest(); - Integration::ResourceId imageRequestId = imageRequest->GetId(); - Integration::ResourceTypeId imageType = imageRequest->GetType()->id; - Stage::GetCurrent().Add(secondRootActor); - RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true); - bool finished = false; - RenderTaskFinished renderTaskFinished( finished ); - newTask.FinishedSignal().Connect( &application, renderTaskFinished ); - application.SendNotification(); +int UtcDaliRenderTaskGetClearEnabledN(void) +{ + TestApplication application; - // START PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); + tet_infoline("Testing RenderTask::GetClearEnabled() with empty handle"); - // FINISH RESOURCE LOADING - expect 'continuous' renders to start, no finished signal - CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) ); + RenderTask task; + try + { + bool x = task.GetClearEnabled(); + (void) x; + } + catch (Dali::DaliException& e) + { + DALI_TEST_PRINT_ASSERT( e ); + DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION); + } END_TEST; } - -int UtcDaliRenderTaskOnce01(void) +int UtcDaliRenderTaskSetCullModeP(void) { TestApplication application; - tet_infoline("Testing RenderTask Render Once GlSync, using loading image\nPRE: Resources not ready, Source not visible\nPOST: Finished signal sent once only"); + tet_infoline("Testing RenderTask::SetCullMode()"); - // SETUP AN OFFSCREEN RENDER TASK - application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); - TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction(); - TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace(); - drawTrace.Enable(true); + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + RenderTask task = taskList.GetTask( 0u ); + DALI_TEST_EQUALS( task.GetCullMode(), true, TEST_LOCATION ); - Actor rootActor = Actor::New(); - Stage::GetCurrent().Add( rootActor ); + task.SetCullMode( false ); - CameraActor offscreenCameraActor = CameraActor::New(); - Stage::GetCurrent().Add( offscreenCameraActor ); - ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused); - Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest(); - Integration::ResourceId imageRequestId = imageRequest->GetId(); - Integration::ResourceTypeId imageType = imageRequest->GetType()->id; + DALI_TEST_EQUALS( task.GetCullMode(), false, TEST_LOCATION ); - Stage::GetCurrent().Add(secondRootActor); - secondRootActor.SetVisible(false); + END_TEST; +} - RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, true); - bool finished = false; - RenderTaskFinished renderTaskFinished( finished ); - newTask.FinishedSignal().Connect( &application, renderTaskFinished ); - application.SendNotification(); +int UtcDaliRenderTaskSetCullModeN(void) +{ + TestApplication application; - // START PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); + tet_infoline("Testing RenderTask::SetCullMode() on empty handle"); - // MAKE SOURCE VISIBLE - secondRootActor.SetVisible(true); - application.SendNotification(); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); + RenderTask task; + try + { + task.SetCullMode( false ); + } + catch (Dali::DaliException& e) + { + DALI_TEST_PRINT_ASSERT( e ); + DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION); + } + END_TEST; +} - // FINISH RESOURCE LOADING - expect no rendering yet - CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject(); - DALI_TEST_CHECK( lastSyncObj != NULL ); +int UtcDaliRenderTaskGetCullModeP(void) +{ + TestApplication application; - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - application.GetPlatform().ClearReadyResources(); - sync.SetObjectSynced( lastSyncObj, true ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) ); + tet_infoline("Testing RenderTask::GetCullMode()"); + + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + RenderTask task = taskList.GetTask( 0u ); + DALI_TEST_EQUALS( task.GetCullMode(), true, TEST_LOCATION ); END_TEST; } -int UtcDaliRenderTaskOnce02(void) +int UtcDaliRenderTaskGetCullModeN(void) { TestApplication application; - tet_infoline("Testing RenderTask Render Once GlSync, using loading image. Switch from render always after ready to render once\n" - "PRE: Render task ready, Image not loaded\n" - "POST: Finished signal sent only once"); - - // SETUP A CONTINUOUS OFFSCREEN RENDER TASK - application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); - TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction(); - TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace(); - drawTrace.Enable(true); + tet_infoline("Testing RenderTask::GetCullMode() with empty handle"); - Actor rootActor = Actor::New(); - Stage::GetCurrent().Add( rootActor ); + RenderTask task; + try + { + bool x = task.GetCullMode(); + (void) x; + } + catch (Dali::DaliException& e) + { + DALI_TEST_PRINT_ASSERT( e ); + DALI_TEST_ASSERT(e, "RenderTask handle is empty", TEST_LOCATION); + } + END_TEST; +} - CameraActor offscreenCameraActor = CameraActor::New(); - Stage::GetCurrent().Add( offscreenCameraActor ); - ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused); - Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest(); - Integration::ResourceId imageRequestId = imageRequest->GetId(); - Integration::ResourceTypeId imageType = imageRequest->GetType()->id; - Stage::GetCurrent().Add(secondRootActor); - RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true); - bool finished = false; - RenderTaskFinished renderTaskFinished( finished ); - newTask.FinishedSignal().Connect( &application, renderTaskFinished ); - application.SendNotification(); +int UtcDaliRenderTaskSetRefreshRate(void) +{ + TestApplication application; - // START PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); + tet_infoline("Testing RenderTask::SetRefreshRate()"); - // FINISH RESOURCE LOADING - CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) ); - application.GetPlatform().ClearReadyResources(); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) ); + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); - newTask.SetRefreshRate(RenderTask::REFRESH_ONCE); - application.SendNotification(); // Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject(); - DALI_TEST_CHECK( lastSyncObj != NULL ); + // By default tasks will be processed every frame + RenderTask task = taskList.GetTask( 0u ); + DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - sync.SetObjectSynced( lastSyncObj, true ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) ); + task.SetRefreshRate( 2u ); // every-other frame + DALI_TEST_CHECK( 2u == task.GetRefreshRate() ); + task.SetRefreshRate( RenderTask::REFRESH_ALWAYS ); + DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() ); END_TEST; } +int UtcDaliRenderTaskGetRefreshRate(void) +{ + TestApplication application; -int UtcDaliRenderTaskOnce03(void) + tet_infoline("Testing RenderTask::GetRefreshRate()"); + + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + + // By default tasks will be processed every frame + RenderTask task = taskList.GetTask( 0u ); + DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() ); + + RenderTask newTask = taskList.CreateTask(); + DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == newTask.GetRefreshRate() ); + END_TEST; +} + +int UtcDaliRenderTaskSignalFinished(void) { TestApplication application; - tet_infoline("Testing RenderTask Render Once GlSync\n" - "Switch from Render always after ready to render once with resources unready\n" - "PRE: Everything ready to render\n" - "POST: Finished signal sent once"); + tet_infoline("Testing RenderTask::SignalFinished()"); - // SETUP A CONTINUOUS OFFSCREEN RENDER TASK application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction(); - TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace(); - drawTrace.Enable(true); - - Actor rootActor = Actor::New(); - Stage::GetCurrent().Add( rootActor ); CameraActor offscreenCameraActor = CameraActor::New(); + Stage::GetCurrent().Add( offscreenCameraActor ); - ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused); - Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest(); - Integration::ResourceId imageRequestId = imageRequest->GetId(); - Integration::ResourceTypeId imageType = imageRequest->GetType()->id; - Stage::GetCurrent().Add(secondRootActor); - RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true); + BufferImage image = BufferImage::New( 10, 10 ); + image.Update(); + Actor rootActor = CreateRenderableActor( image ); + rootActor.SetSize( 10, 10 ); + Stage::GetCurrent().Add( rootActor ); + + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + NativeImageInterfacePtr testNativeImagePtr = TestNativeImage::New(10, 10); + FrameBufferImage frameBufferImage = FrameBufferImage::New( *testNativeImagePtr.Get() ); + + RenderTask newTask = taskList.CreateTask(); + newTask.SetCameraActor( offscreenCameraActor ); + newTask.SetSourceActor( rootActor ); + newTask.SetInputEnabled( false ); + newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) ); + newTask.SetClearEnabled( true ); + newTask.SetExclusive( true ); + newTask.SetRefreshRate( RenderTask::REFRESH_ONCE ); + newTask.SetTargetFrameBuffer( frameBufferImage ); + newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, true ); + bool finished = false; RenderTaskFinished renderTaskFinished( finished ); newTask.FinishedSignal().Connect( &application, renderTaskFinished ); + + // Flush the queue and render. application.SendNotification(); - // START PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); + // 1 render to process render task, then wait for sync before finished msg is sent + // from update to the event thread. - // CHANGE TO RENDER ONCE - newTask.SetRefreshRate(RenderTask::REFRESH_ONCE); - application.SendNotification(); // Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); + application.Render(); + application.SendNotification(); + DALI_TEST_CHECK( !finished ); - // FINISH RESOURCE LOADING - CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject(); DALI_TEST_CHECK( lastSyncObj != NULL ); - application.GetPlatform().ClearReadyResources(); + + application.Render(); + DALI_TEST_EQUALS( (Integration::KeepUpdating::Reasons)(application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION ); + application.SendNotification(); + DALI_TEST_CHECK( !finished ); + + application.Render(); + DALI_TEST_EQUALS( (Integration::KeepUpdating::Reasons)(application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION ); + application.SendNotification(); + DALI_TEST_CHECK( ! finished ); sync.SetObjectSynced( lastSyncObj, true ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) ); + application.Render(); + application.SendNotification(); + DALI_TEST_CHECK( !finished ); + + application.Render(); + application.SendNotification(); + DALI_TEST_CHECK( finished ); + + DALI_TEST_EQUALS( application.GetUpdateStatus(), 0, TEST_LOCATION ); END_TEST; } -#if 0 -//int UtcDaliRenderTaskOnce04(void) + +int UtcDaliRenderTaskContinuous01(void) { TestApplication application; - tet_infoline("Testing RenderTask Render Once GlSync\n" - "During RenderOnce, make ready resources unready before sending first finished signal\n" - "PRE: Everything ready.\n" - "POST: Finished signal sent only once"); + tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (source actor not staged)\nPOST:continuous renders, no Finished signal"); - // SETUP A CONTINUOUS OFFSCREEN RENDER TASK + // SETUP AN OFFSCREEN RENDER TASK application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); - TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction(); TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace(); drawTrace.Enable(true); Actor rootActor = Actor::New(); Stage::GetCurrent().Add( rootActor ); - CameraActor offscreenCameraActor = CameraActor::New(); + CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) ); Stage::GetCurrent().Add( offscreenCameraActor ); - ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused); - Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest(); - Integration::ResourceId imageRequestId = imageRequest->GetId(); - Integration::ResourceTypeId imageType = imageRequest->GetType()->id; - CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete - application.Render(); - Stage::GetCurrent().Add(secondRootActor); - application.GetPlatform().ClearReadyResources(); + Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg"); RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true); bool finished = false; RenderTaskFinished renderTaskFinished( finished ); - newTask.FinishedSignal().Connect( &application, renderTaskFinished ); application.SendNotification(); - // START PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - - // CHANGE TO RENDER ONCE, RESOURCES BECOME NOT READY - newTask.SetRefreshRate(RenderTask::REFRESH_ONCE); - - // Doesn't work... - ReloadImage(application, secondRootActor.GetImage()); - application.SendNotification(); // Input, Expected Input, Expected - - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_EQUALS( secondRootActor.GetImage().GetLoadingState(), Dali::ResourceLoading, TEST_LOCATION); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - - // FINISH RESOURCE LOADING - CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); + // START PROCESS/RENDER Input, Expected Input, Expected, KeepUpdating + DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false, __LINE__ ) ); application.GetPlatform().ClearReadyResources(); - Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject(); - DALI_TEST_CHECK( lastSyncObj != NULL ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - sync.SetObjectSynced( lastSyncObj, true ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, true ) ); + // ADD SOURCE ACTOR TO STAGE - expect continuous renders to start, no finished signal + Stage::GetCurrent().Add(secondRootActor); + application.SendNotification(); - // Finished rendering - expect no more renders, no more signals: - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); + // CONTINUE PROCESS/RENDER Input, Expected Input, Expected + DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) ); END_TEST; } -#endif -int UtcDaliRenderTaskOnce05(void) + +int UtcDaliRenderTaskContinuous02(void) { TestApplication application; - tet_infoline("Testing RenderTask Render Once GLSync\n" - "Render once, Second call to SetRefreshRate(ONCE) triggers only one more finished signal\n" - "PRE: Everything ready\n" - "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)"); + tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (source actor not visible)\nPOST:continuous renders, no Finished signal"); - // SETUP A CONTINUOUS OFFSCREEN RENDER TASK + // SETUP AN OFFSCREEN RENDER TASK application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); - TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction(); TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace(); drawTrace.Enable(true); Actor rootActor = Actor::New(); Stage::GetCurrent().Add( rootActor ); - CameraActor offscreenCameraActor = CameraActor::New(); + CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) ); Stage::GetCurrent().Add( offscreenCameraActor ); - ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused); - Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest(); - Integration::ResourceId imageRequestId = imageRequest->GetId(); - Integration::ResourceTypeId imageType = imageRequest->GetType()->id; - CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete - application.Render(); - application.GetPlatform().ClearReadyResources(); + Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg"); Stage::GetCurrent().Add(secondRootActor); + secondRootActor.SetVisible(false); RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true); bool finished = false; @@ -1709,143 +2009,74 @@ int UtcDaliRenderTaskOnce05(void) newTask.FinishedSignal().Connect( &application, renderTaskFinished ); application.SendNotification(); - // START PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) ); - - // CHANGE TO RENDER ONCE, - newTask.SetRefreshRate(RenderTask::REFRESH_ONCE); - application.SendNotification(); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject(); - DALI_TEST_CHECK( lastSyncObj != NULL ); - - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - sync.SetObjectSynced( lastSyncObj, true ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) ); + // START PROCESS/RENDER Input, Expected Input, Expected, KeepUpdating + DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false, __LINE__ ) ); + application.GetPlatform().ClearReadyResources(); - newTask.SetRefreshRate(RenderTask::REFRESH_ONCE); + // MAKE SOURCE ACTOR VISIBLE - expect continuous renders to start, no finished signal + secondRootActor.SetVisible(true); application.SendNotification(); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - lastSyncObj = sync.GetLastSyncObject(); - DALI_TEST_CHECK( lastSyncObj != NULL ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - sync.SetObjectSynced( lastSyncObj, true ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) ); + // CONTINUE PROCESS/RENDER Input, Expected Input, Expected + DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) ); END_TEST; } -int UtcDaliRenderTaskOnce06(void) +int UtcDaliRenderTaskContinuous03(void) { TestApplication application; - tet_infoline("Testing RenderTask Render Once GLSync\n" - "Render once, Call to SetRefreshRate(ONCE) in Finished signal callback triggers " - "another render & another finished signal\n" - "PRE: Everything ready\n" - "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)"); - + tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (camera actor not staged)\nPOST:continuous renders, no Finished signal"); - // SETUP A CONTINUOUS OFFSCREEN RENDER TASK + // SETUP AN OFFSCREEN RENDER TASK application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); - TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction(); TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace(); drawTrace.Enable(true); Actor rootActor = Actor::New(); Stage::GetCurrent().Add( rootActor ); - CameraActor offscreenCameraActor = CameraActor::New(); - Stage::GetCurrent().Add( offscreenCameraActor ); - ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused); - Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest(); - Integration::ResourceId imageRequestId = imageRequest->GetId(); - Integration::ResourceTypeId imageType = imageRequest->GetType()->id; - CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete - application.Render(); - application.GetPlatform().ClearReadyResources(); - + CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) ); + Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg"); Stage::GetCurrent().Add(secondRootActor); RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true); bool finished = false; - - ConnectionTracker connectionTracker; - RenderTaskFinishedRenderAgain renderTaskFinishedRenderAgain( finished ); - newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinishedRenderAgain ); - + RenderTaskFinished renderTaskFinished( finished ); + newTask.FinishedSignal().Connect( &application, renderTaskFinished ); application.SendNotification(); - // Expect 2 frames to be drawn. // START PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject(); - DALI_TEST_CHECK( lastSyncObj == NULL ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) ); - - // CHANGE TO RENDER ONCE, - newTask.SetRefreshRate(RenderTask::REFRESH_ONCE); - application.SendNotification(); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - lastSyncObj = sync.GetLastSyncObject(); - DALI_TEST_CHECK( lastSyncObj != NULL ); - - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); + DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, false, __LINE__ ) ); + application.GetPlatform().ClearReadyResources(); - sync.SetObjectSynced( lastSyncObj, true ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) ); + // ADD CAMERA ACTOR TO STAGE - expect continuous renders to start, no finished signal + Stage::GetCurrent().Add( offscreenCameraActor ); application.SendNotification(); - // Expect SetRefreshRate to have been called again - // Prevent next finished signal calling refresh once again - RenderTaskFinished renderTaskFinished( finished ); - connectionTracker.DisconnectAll(); - newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinished ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - lastSyncObj = sync.GetLastSyncObject(); - DALI_TEST_CHECK( lastSyncObj != NULL ); - - sync.SetObjectSynced( lastSyncObj, true ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) ); + // CONTINUE PROCESS/RENDER Input, Expected Input, Expected + DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) ); END_TEST; } -int UtcDaliRenderTaskOnce07(void) +int UtcDaliRenderTaskContinuous04(void) { TestApplication application; - tet_infoline("Testing RenderTask Render Once GlSync\n" - "SetRefreshRate(ONCE) again before first finished signal has been sent.\n" - "PRE: resources ready\n" - "POST: Only 1 finished signal sent."); + tet_infoline("Testing RenderTask Render Continuous using loaded image"); - // SETUP A CONTINUOUS OFFSCREEN RENDER TASK + // SETUP AN OFFSCREEN RENDER TASK application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); - TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction(); TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace(); drawTrace.Enable(true); Actor rootActor = Actor::New(); Stage::GetCurrent().Add( rootActor ); - CameraActor offscreenCameraActor = CameraActor::New(); + CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) ); Stage::GetCurrent().Add( offscreenCameraActor ); - ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused); - Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest(); - Integration::ResourceId imageRequestId = imageRequest->GetId(); - Integration::ResourceTypeId imageType = imageRequest->GetType()->id; - CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete - application.Render(); - application.GetPlatform().ClearReadyResources(); - + Actor secondRootActor = CreateRenderableActorFailed(application, "aFile.jpg"); Stage::GetCurrent().Add(secondRootActor); RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true); @@ -1855,43 +2086,17 @@ int UtcDaliRenderTaskOnce07(void) application.SendNotification(); // START PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) ); - - // CHANGE TO RENDER ONCE, - newTask.SetRefreshRate(RenderTask::REFRESH_ONCE); - application.SendNotification(); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - - newTask.SetRefreshRate(RenderTask::REFRESH_ONCE); - application.SendNotification(); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject(); - DALI_TEST_CHECK( lastSyncObj != NULL ); - - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - sync.SetObjectSynced( lastSyncObj, true ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) ); - + DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) ); END_TEST; } - - -int UtcDaliRenderTaskOnce08(void) +int UtcDaliRenderTaskOnce01(void) { TestApplication application; - tet_infoline("Testing RenderTask Render Once GlSync\n" - "SetRefreshRate(ONCE), resource load failed completes render task.\n" - "PRE: resources not ready\n" - "POST: Only 1 finished signal sent."); + tet_infoline("Testing RenderTask Render Once GlSync, using loaded image"); - // SETUP A CONTINUOUS OFFSCREEN RENDER TASK + // SETUP AN OFFSCREEN RENDER TASK application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction(); TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace(); @@ -1900,203 +2105,182 @@ int UtcDaliRenderTaskOnce08(void) Actor rootActor = Actor::New(); Stage::GetCurrent().Add( rootActor ); - CameraActor offscreenCameraActor = CameraActor::New(); + CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) ); Stage::GetCurrent().Add( offscreenCameraActor ); - ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused); - Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest(); - Integration::ResourceId imageRequestId = imageRequest->GetId(); + Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg"); + Stage::GetCurrent().Add(secondRootActor); - RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true); + RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, true); bool finished = false; RenderTaskFinished renderTaskFinished( finished ); newTask.FinishedSignal().Connect( &application, renderTaskFinished ); application.SendNotification(); - // START PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - - // CHANGE TO RENDER ONCE, - newTask.SetRefreshRate(RenderTask::REFRESH_ONCE); - application.SendNotification(); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - - tet_printf(" FailImageLoad\n"); - - FailImageLoad(application, imageRequestId); // Need to run Update again for this to complete - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); // nothing to draw - application.SendNotification(); + DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) ); - // Drawing empty framebuffer, so will still get a GL sync Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject(); DALI_TEST_CHECK( lastSyncObj != NULL ); + sync.SetObjectSynced( lastSyncObj, true ); - // Expect finished signal, as all resources are complete - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, true, false ) ); - + DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true, __LINE__ ) ); + DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) ); END_TEST; } - - -int UtcDaliRenderTaskOnceNoSync01(void) +int UtcDaliRenderTaskOnce02(void) { TestApplication application; - tet_infoline("Testing RenderTask Render Once, using loading image\nPRE: Resources not ready, Source not visible\nPOST: Finished signal sent once only"); + tet_infoline("Testing RenderTask Render Once GlSync, using Mesh which accesses texture through sampler with loaded image.\n"); // SETUP AN OFFSCREEN RENDER TASK application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); + TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction(); TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace(); drawTrace.Enable(true); Actor rootActor = Actor::New(); Stage::GetCurrent().Add( rootActor ); - CameraActor offscreenCameraActor = CameraActor::New(); + CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) ); Stage::GetCurrent().Add( offscreenCameraActor ); - ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused); - Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest(); - Integration::ResourceId imageRequestId = imageRequest->GetId(); - Integration::ResourceTypeId imageType = imageRequest->GetType()->id; + Shader shader = CreateShader(); + Image image = CreateResourceImage(application, "aFile.jpg"); + TextureSet textureSet = CreateTextureSet( image ); + + Geometry geometry = CreateQuadGeometry(); + Renderer renderer = Renderer::New(geometry, shader); + renderer.SetTextures( textureSet ); + Actor secondRootActor = Actor::New(); + secondRootActor.AddRenderer(renderer); + secondRootActor.SetSize(100, 100); Stage::GetCurrent().Add(secondRootActor); - secondRootActor.SetVisible(false); - RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, false); + RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, true); bool finished = false; RenderTaskFinished renderTaskFinished( finished ); newTask.FinishedSignal().Connect( &application, renderTaskFinished ); application.SendNotification(); - // START PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); + DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) ); - // MAKE SOURCE VISIBLE - secondRootActor.SetVisible(true); - application.SendNotification(); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); + Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject(); + DALI_TEST_CHECK( lastSyncObj != NULL ); + sync.SetObjectSynced( lastSyncObj, true ); - // FINISH RESOURCE LOADING - expect immediate rendering yet - CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - application.GetPlatform().ClearReadyResources(); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) ); - END_TEST; + DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true, __LINE__ ) ); + DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) ); + + END_TEST; } -int UtcDaliRenderTaskOnceNoSync02(void) +int UtcDaliRenderTaskOnce03(void) { TestApplication application; - tet_infoline("Testing RenderTask Render Once, using loading image. Switch from render always after ready to render once\n" - "PRE: Render task ready, Image not loaded\n" - "POST: Finished signal sent only once"); + tet_infoline("Testing RenderTask Render Once GlSync, using loaded image. Switch from render always after ready to render once\n"); // SETUP A CONTINUOUS OFFSCREEN RENDER TASK application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); + TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction(); TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace(); drawTrace.Enable(true); Actor rootActor = Actor::New(); Stage::GetCurrent().Add( rootActor ); - CameraActor offscreenCameraActor = CameraActor::New(); + CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) ); Stage::GetCurrent().Add( offscreenCameraActor ); - ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused); - Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest(); - Integration::ResourceId imageRequestId = imageRequest->GetId(); - Integration::ResourceTypeId imageType = imageRequest->GetType()->id; + Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg"); Stage::GetCurrent().Add(secondRootActor); - RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false); + RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true); bool finished = false; RenderTaskFinished renderTaskFinished( finished ); newTask.FinishedSignal().Connect( &application, renderTaskFinished ); application.SendNotification(); - // START PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - - // FINISH RESOURCE LOADING - CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) ); - application.GetPlatform().ClearReadyResources(); + DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) ); newTask.SetRefreshRate(RenderTask::REFRESH_ONCE); - application.SendNotification(); // Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) ); + application.SendNotification(); + + DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) ); + + Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject(); + DALI_TEST_CHECK( lastSyncObj != NULL ); + sync.SetObjectSynced( lastSyncObj, true ); + + DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true, __LINE__ ) ); + DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) ); + END_TEST; } -int UtcDaliRenderTaskOnceNoSync03(void) +int UtcDaliRenderTaskOnce04(void) { TestApplication application; + tet_infoline("Testing RenderTask Render Once GlSync, using Mesh which accesses texture through sampler with loaded image.\n" + "Switch from render always after ready to render once\n" + ); - tet_infoline("Testing RenderTask Render Once\n" - "Switch from Render always after ready to render once with resources unready\n" - "PRE: Everything ready to render\n" - "POST: Finished signal sent once"); - - // SETUP A CONTINUOUS OFFSCREEN RENDER TASK + // SETUP AN OFFSCREEN RENDER TASK application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); + TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction(); TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace(); drawTrace.Enable(true); Actor rootActor = Actor::New(); Stage::GetCurrent().Add( rootActor ); - CameraActor offscreenCameraActor = CameraActor::New(); + CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) ); Stage::GetCurrent().Add( offscreenCameraActor ); - ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused); - Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest(); - Integration::ResourceId imageRequestId = imageRequest->GetId(); - Integration::ResourceTypeId imageType = imageRequest->GetType()->id; + + Shader shader = CreateShader(); + Image image = CreateResourceImage(application, "aFile.jpg"); + TextureSet textureSet = CreateTextureSet( image ); + + Geometry geometry = CreateQuadGeometry(); + Renderer renderer = Renderer::New(geometry, shader); + renderer.SetTextures( textureSet ); + Actor secondRootActor = Actor::New(); + secondRootActor.AddRenderer(renderer); + secondRootActor.SetSize(100, 100); Stage::GetCurrent().Add(secondRootActor); - RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false); + RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true); bool finished = false; RenderTaskFinished renderTaskFinished( finished ); newTask.FinishedSignal().Connect( &application, renderTaskFinished ); application.SendNotification(); - // START PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); + DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) ); - // CHANGE TO RENDER ONCE newTask.SetRefreshRate(RenderTask::REFRESH_ONCE); - application.SendNotification(); // Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); + application.SendNotification(); + + DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) ); + + Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject(); + DALI_TEST_CHECK( lastSyncObj != NULL ); + sync.SetObjectSynced( lastSyncObj, true ); + + DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true, __LINE__ ) ); + DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) ); - // FINISH RESOURCE LOADING - CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - application.GetPlatform().ClearReadyResources(); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) ); END_TEST; } -#if 0 -//int UtcDaliRenderTaskOnceNoSync04(void) +int UtcDaliRenderTaskOnceNoSync01(void) { TestApplication application; - tet_infoline("Testing RenderTask Render Once\n" - "During RenderOnce, make ready resources unready before sending first finished signal\n" - "PRE: Everything ready.\n" - "POST: Finished signal sent only once"); + tet_infoline("Testing RenderTask Render Once, \nPRE: Resources ready\nPOST: Finished signal sent once only"); - // SETUP A CONTINUOUS OFFSCREEN RENDER TASK + // SETUP AN OFFSCREEN RENDER TASK application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace(); drawTrace.Enable(true); @@ -2104,61 +2288,29 @@ int UtcDaliRenderTaskOnceNoSync03(void) Actor rootActor = Actor::New(); Stage::GetCurrent().Add( rootActor ); - CameraActor offscreenCameraActor = CameraActor::New(); + CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) ); Stage::GetCurrent().Add( offscreenCameraActor ); - ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused); - Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest(); - Integration::ResourceId imageRequestId = imageRequest->GetId(); - Integration::ResourceTypeId imageType = imageRequest->GetType()->id; - CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete - application.Render(); - application.GetPlatform().ClearReadyResources(); - + Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg"); Stage::GetCurrent().Add(secondRootActor); - RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false); + RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, false); bool finished = false; RenderTaskFinished renderTaskFinished( finished ); newTask.FinishedSignal().Connect( &application, renderTaskFinished ); application.SendNotification(); - // START PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) ); - - // CHANGE TO RENDER ONCE, RESOURCES BECOME NOT READY - newTask.SetRefreshRate(RenderTask::REFRESH_ONCE); - - // Doesn't work... - ReloadImage(application, secondRootActor.GetImage()); - application.SendNotification(); // Input, Expected Input, Expected - - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_EQUALS( secondRootActor.GetImage().GetLoadingState(), Dali::ResourceLoading, TEST_LOCATION); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - - // FINISH RESOURCE LOADING - CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, true, true ) ); - application.GetPlatform().ClearReadyResources(); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); + DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) ); + DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) ); END_TEST; } -#endif -int UtcDaliRenderTaskOnceNoSync05(void) +int UtcDaliRenderTaskOnceNoSync02(void) { TestApplication application; - tet_infoline("Testing RenderTask Render Once\n" - "Render once, Second call to SetRefreshRate(ONCE) triggers only one more finished signal\n" - "PRE: Everything ready\n" - "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)"); - - // SETUP A CONTINUOUS OFFSCREEN RENDER TASK + tet_infoline("Testing RenderTask Render Once, using Mesh which accesses texture through sampler with loaded image.\n" + "PRE: Resources ready\nPOST: Finished signal sent once only"); + // SETUP AN OFFSCREEN RENDER TASK application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace(); drawTrace.Enable(true); @@ -2166,111 +2318,78 @@ int UtcDaliRenderTaskOnceNoSync05(void) Actor rootActor = Actor::New(); Stage::GetCurrent().Add( rootActor ); - CameraActor offscreenCameraActor = CameraActor::New(); + CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) ); Stage::GetCurrent().Add( offscreenCameraActor ); - ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused); - Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest(); - Integration::ResourceId imageRequestId = imageRequest->GetId(); - Integration::ResourceTypeId imageType = imageRequest->GetType()->id; - CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete - application.Render(); - application.GetPlatform().ClearReadyResources(); + Shader shader = CreateShader(); + Image image = CreateResourceImage(application, "aFile.jpg"); + TextureSet textureSet = CreateTextureSet( image ); + + Geometry geometry = CreateQuadGeometry(); + Renderer renderer = Renderer::New(geometry, shader); + renderer.SetTextures( textureSet ); + Actor secondRootActor = Actor::New(); + secondRootActor.AddRenderer(renderer); + secondRootActor.SetSize(100, 100); Stage::GetCurrent().Add(secondRootActor); - RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false); + RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, false); bool finished = false; RenderTaskFinished renderTaskFinished( finished ); newTask.FinishedSignal().Connect( &application, renderTaskFinished ); application.SendNotification(); - // START PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) ); - - // CHANGE TO RENDER ONCE, - newTask.SetRefreshRate(RenderTask::REFRESH_ONCE); - application.SendNotification(); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) ); + DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) ); + application.GetPlatform().ClearReadyResources(); + DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) ); - newTask.SetRefreshRate(RenderTask::REFRESH_ONCE); - application.SendNotification(); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) ); END_TEST; } -int UtcDaliRenderTaskOnceNoSync06(void) +int UtcDaliRenderTaskOnceNoSync03(void) { TestApplication application; - tet_infoline("Testing RenderTask Render Once\n" - "Render once, Call to SetRefreshRate(ONCE) in Finished signal callback triggers\n" - "another render & another finished signal\n" - "PRE: Everything ready\n" - "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)"); - + tet_infoline("Testing RenderTask Render Once, using loaded image. Switch from render always after ready to render once\n" + "PRE: Render task ready, Image loaded\n" + "POST: Finished signal sent only once"); // SETUP A CONTINUOUS OFFSCREEN RENDER TASK application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace(); drawTrace.Enable(true); - Actor rootActor = Actor::New(); - Stage::GetCurrent().Add( rootActor ); - - CameraActor offscreenCameraActor = CameraActor::New(); - Stage::GetCurrent().Add( offscreenCameraActor ); - ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused); - Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest(); - Integration::ResourceId imageRequestId = imageRequest->GetId(); - Integration::ResourceTypeId imageType = imageRequest->GetType()->id; - CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete - application.Render(); - application.GetPlatform().ClearReadyResources(); + Actor rootActor = Actor::New(); + Stage::GetCurrent().Add( rootActor ); + CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) ); + Stage::GetCurrent().Add( offscreenCameraActor ); + Actor secondRootActor = CreateRenderableActorSuccess(application, "aFile.jpg"); Stage::GetCurrent().Add(secondRootActor); RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false); bool finished = false; - - ConnectionTracker connectionTracker; - RenderTaskFinishedRenderAgain renderTaskFinishedRenderAgain( finished ); - newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinishedRenderAgain ); - + RenderTaskFinished renderTaskFinished( finished ); + newTask.FinishedSignal().Connect( &application, renderTaskFinished ); application.SendNotification(); - // START PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) ); + DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) ); - // CHANGE TO RENDER ONCE, newTask.SetRefreshRate(RenderTask::REFRESH_ONCE); - application.SendNotification(); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) ); - - // Expect SetRefreshRate to have been called again - // Prevent next finished signal calling refresh once again - RenderTaskFinished renderTaskFinished( finished ); - connectionTracker.DisconnectAll(); - newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinished ); - - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) ); + application.SendNotification(); // Input, Expected Input, Expected + DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) ); + DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) ); END_TEST; } - -int UtcDaliRenderTaskOnceNoSync07(void) +int UtcDaliRenderTaskOnceNoSync04(void) { TestApplication application; - tet_infoline("Testing RenderTask Render Once\n" - "SetRefreshRate(ONCE) again before first finished signal has been sent.\n" - "PRE: resources ready\n" - "POST: Only 1 finished signal sent."); + tet_infoline("Testing RenderTask Render Once, using Mesh which accesses texture through sampler with loading image.\n" + "Switch from render always after ready to render once\n" + "PRE: Render task ready, Image not loaded\n" + "POST: Finished signal sent only once"); // SETUP A CONTINUOUS OFFSCREEN RENDER TASK application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); @@ -2280,49 +2399,52 @@ int UtcDaliRenderTaskOnceNoSync07(void) Actor rootActor = Actor::New(); Stage::GetCurrent().Add( rootActor ); - CameraActor offscreenCameraActor = CameraActor::New(); + CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) ); Stage::GetCurrent().Add( offscreenCameraActor ); - ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused); - Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest(); - Integration::ResourceId imageRequestId = imageRequest->GetId(); - Integration::ResourceTypeId imageType = imageRequest->GetType()->id; - CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete - application.Render(); - application.GetPlatform().ClearReadyResources(); + Shader shader = CreateShader(); + Image image = CreateResourceImage(application, "aFile.jpg"); + TextureSet textureSet = CreateTextureSet( image ); + + Geometry geometry = CreateQuadGeometry(); + Renderer renderer = Renderer::New(geometry, shader); + renderer.SetTextures( textureSet ); + Actor secondRootActor = Actor::New(); + secondRootActor.AddRenderer(renderer); + secondRootActor.SetSize(100, 100); Stage::GetCurrent().Add(secondRootActor); + RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false); bool finished = false; RenderTaskFinished renderTaskFinished( finished ); newTask.FinishedSignal().Connect( &application, renderTaskFinished ); application.SendNotification(); - // START PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false ) ); + DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) ); + TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction(); + Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject(); + DALI_TEST_CHECK( lastSyncObj == NULL ); - // CHANGE TO RENDER ONCE, newTask.SetRefreshRate(RenderTask::REFRESH_ONCE); - application.SendNotification(); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) ); + application.SendNotification(); // Input, Expected Input, Expected + DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true, __LINE__ ) ); + DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false, __LINE__ ) ); + + lastSyncObj = sync.GetLastSyncObject(); + DALI_TEST_CHECK( lastSyncObj == NULL ); - newTask.SetRefreshRate(RenderTask::REFRESH_ONCE); - application.SendNotification(); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) ); END_TEST; } -int UtcDaliRenderTaskOnceNoSync08(void) +int UtcDaliRenderTaskOnceNoSync05(void) { TestApplication application; tet_infoline("Testing RenderTask Render Once\n" "SetRefreshRate(ONCE), resource load failed, completes render task.\n" - "PRE: resources not ready\n" - "POST: Only 1 finished signal sent."); + "PRE: resources failed to load\n" + "POST: No finished signal sent."); // SETUP A CONTINUOUS OFFSCREEN RENDER TASK application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); @@ -2332,11 +2454,9 @@ int UtcDaliRenderTaskOnceNoSync08(void) Actor rootActor = Actor::New(); Stage::GetCurrent().Add( rootActor ); - CameraActor offscreenCameraActor = CameraActor::New(); + CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) ); Stage::GetCurrent().Add( offscreenCameraActor ); - ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused); - Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest(); - Integration::ResourceId imageRequestId = imageRequest->GetId(); + Actor secondRootActor = CreateRenderableActorFailed(application, "aFile.jpg"); Stage::GetCurrent().Add(secondRootActor); RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false); @@ -2346,19 +2466,11 @@ int UtcDaliRenderTaskOnceNoSync08(void) application.SendNotification(); // START PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); + DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) ); // CHANGE TO RENDER ONCE, newTask.SetRefreshRate(RenderTask::REFRESH_ONCE); - application.SendNotification(); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); - - FailImageLoad(application, imageRequestId); // Need to run Update again for this to complete - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false, true ) ); // nothing to draw - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true, false ) ); + DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false, false, __LINE__ ) ); END_TEST; } @@ -2371,7 +2483,7 @@ int UtcDaliRenderTaskOnceChain01(void) tet_infoline("Testing RenderTask Render Once Chained render tasks\n" "SetRefreshRate(ONCE), resource load completes, both render tasks render.\n" - "PRE: resources not ready\n" + "PRE: resources ready\n" "POST: 2 finished signals sent."); // SETUP A CONTINUOUS OFFSCREEN RENDER TASK @@ -2382,12 +2494,9 @@ int UtcDaliRenderTaskOnceChain01(void) Actor defaultRootActor = Actor::New(); // Root for default RT Stage::GetCurrent().Add( defaultRootActor ); - CameraActor offscreenCameraActor = CameraActor::New(); + CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) ); Stage::GetCurrent().Add( offscreenCameraActor ); - ImageActor firstRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused); - Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest(); - Integration::ResourceId imageRequestId = imageRequest->GetId(); - Integration::ResourceTypeId imageType = imageRequest->GetType()->id; + Actor firstRootActor = CreateRenderableActorSuccess(application, "aFile.jpg"); Stage::GetCurrent().Add(firstRootActor); // first render task @@ -2398,7 +2507,7 @@ int UtcDaliRenderTaskOnceChain01(void) // Second render task FrameBufferImage fbo = firstTask.GetTargetFrameBuffer(); - ImageActor secondRootActor = ImageActor::New( fbo ); + Actor secondRootActor = CreateRenderableActor( fbo ); Stage::GetCurrent().Add(secondRootActor); RenderTask secondTask = CreateRenderTask(application, offscreenCameraActor, defaultRootActor, secondRootActor, RenderTask::REFRESH_ONCE, false); bool secondFinished = false; @@ -2407,18 +2516,14 @@ int UtcDaliRenderTaskOnceChain01(void) application.SendNotification(); - // START PROCESS/RENDER Input, Expected Input, Expected - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false, true ) ); - DALI_TEST_CHECK( secondFinished == false ); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false, true ) ); - DALI_TEST_CHECK( secondFinished == false ); - - CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete - DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false, true ) ); + //Both render tasks are executed. + DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false, true, __LINE__ ) ); + DALI_TEST_CHECK( firstFinished == false ); DALI_TEST_CHECK( secondFinished == false ); - application.GetPlatform().ClearReadyResources(); - DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, firstFinished, true, false ) ); + //Nothing else to render and both render task should have finished now + DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, firstFinished, true, false, __LINE__ ) ); + DALI_TEST_CHECK( firstFinished == true ); DALI_TEST_CHECK( secondFinished == true ); END_TEST; @@ -2432,79 +2537,336 @@ int UtcDaliRenderTaskProperties(void) Property::IndexContainer indices; task.GetPropertyIndices( indices ); - DALI_TEST_CHECK( ! indices.empty() ); - DALI_TEST_EQUALS( indices.size(), task.GetPropertyCount(), TEST_LOCATION ); + DALI_TEST_CHECK( indices.Size() ); + DALI_TEST_EQUALS( indices.Size(), task.GetPropertyCount(), TEST_LOCATION ); END_TEST; } -int UtcDaliRenderTaskSetScreenToFrameBufferMappingActor(void) +int UtcDaliRenderTaskFinishInvisibleSourceActor(void) { TestApplication application; - tet_infoline("Testing RenderTask::SetScreenToFrameBufferMappingActor "); - Stage stage = Stage::GetCurrent(); - Size stageSize = stage.GetSize(); - Actor mappingActor = Actor::New(); - Vector2 scale( 0.6f, 0.75f); - Vector2 offset( stageSize.x*0.1f, stageSize.y*0.15f); - mappingActor.SetSize( stageSize * scale ); - mappingActor.SetAnchorPoint( AnchorPoint::TOP_LEFT ); - mappingActor.SetPosition( offset.x, offset.y ); - stage.Add( mappingActor ); - - Actor offscreenActor = Actor::New(); - offscreenActor.SetSize( stageSize ); - offscreenActor.SetAnchorPoint( AnchorPoint::TOP_LEFT ); - stage.Add( offscreenActor ); + tet_infoline("Testing RenderTask::FinishInvisibleSourceActor()"); - RenderTaskList taskList = stage.GetRenderTaskList(); - RenderTask renderTask = taskList.CreateTask(); - FrameBufferImage frameBufferImage = FrameBufferImage::New(stageSize.width*scale.x, stageSize.height*scale.y, Pixel::A8, Image::Never); - renderTask.SetSourceActor( offscreenActor ); - renderTask.SetExclusive( true ); - renderTask.SetInputEnabled( true ); - renderTask.SetTargetFrameBuffer( frameBufferImage ); - renderTask.SetRefreshRate( RenderTask::REFRESH_ONCE ); - renderTask.SetScreenToFrameBufferMappingActor( mappingActor ); application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); + TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction(); + + CameraActor offscreenCameraActor = CameraActor::New(); + + Stage::GetCurrent().Add( offscreenCameraActor ); + + BufferImage image = BufferImage::New( 10, 10 ); + Actor rootActor = CreateRenderableActor( image ); + rootActor.SetSize( 10, 10 ); + rootActor.SetVisible(false); + Stage::GetCurrent().Add( rootActor ); + + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + NativeImageInterfacePtr testNativeImagePtr = TestNativeImage::New(10, 10); + FrameBufferImage frameBufferImage = FrameBufferImage::New( *testNativeImagePtr.Get() ); + + // Flush all outstanding messages + application.SendNotification(); + application.Render(); + + RenderTask newTask = taskList.CreateTask(); + newTask.SetCameraActor( offscreenCameraActor ); + newTask.SetSourceActor( rootActor ); + newTask.SetInputEnabled( false ); + newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) ); + newTask.SetClearEnabled( true ); + newTask.SetExclusive( true ); + newTask.SetRefreshRate( RenderTask::REFRESH_ONCE ); + newTask.SetTargetFrameBuffer( frameBufferImage ); + newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, true ); + + // Framebuffer doesn't actually get created until Connected, i.e. by previous line + + bool finished = false; + RenderTaskFinished renderTaskFinished( finished ); + newTask.FinishedSignal().Connect( &application, renderTaskFinished ); + + // Flush the queue and render. + application.SendNotification(); + + // 1 render to process render task, then wait for sync before finished msg is sent + // from update to the event thread. + + application.Render(); + application.SendNotification(); + DALI_TEST_CHECK( !finished ); + + Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject(); + DALI_TEST_CHECK( lastSyncObj != NULL ); + + application.Render(); + DALI_TEST_EQUALS( (Integration::KeepUpdating::Reasons)(application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION ); + application.SendNotification(); + DALI_TEST_CHECK( !finished ); + + application.Render(); + DALI_TEST_EQUALS( (Integration::KeepUpdating::Reasons)(application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION ); + application.SendNotification(); + DALI_TEST_CHECK( ! finished ); + + sync.SetObjectSynced( lastSyncObj, true ); + + application.Render(); + application.SendNotification(); + DALI_TEST_CHECK( !finished ); + + application.Render(); + application.SendNotification(); + DALI_TEST_CHECK( finished ); + finished = false; + + application.Render(); // Double check no more finished signal + application.SendNotification(); + DALI_TEST_CHECK( ! finished ); + + END_TEST; +} + +int UtcDaliRenderTaskFinishMissingImage(void) +{ + TestApplication application; + + // Previously we had bugs where not having a resource ID would cause render-tasks to wait forever + tet_infoline("Testing RenderTask::SignalFinished() when an Actor has no Image set"); + + Stage stage = Stage::GetCurrent(); + + BufferImage image = BufferImage::New( 10, 10 ); + Actor rootActor = CreateRenderableActor( image ); + rootActor.SetSize( 10, 10 ); + stage.Add( rootActor ); + + Actor actorWithMissingImage = CreateRenderableActor( Image() ); + actorWithMissingImage.SetSize( 10, 10 ); + stage.Add( actorWithMissingImage ); + + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + RenderTask newTask = taskList.CreateTask(); + newTask.SetInputEnabled( false ); + newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) ); + newTask.SetClearEnabled( true ); + newTask.SetExclusive( true ); + newTask.SetRefreshRate( RenderTask::REFRESH_ONCE ); + + bool finished = false; + RenderTaskFinished renderTaskFinished( finished ); + newTask.FinishedSignal().Connect( &application, renderTaskFinished ); + + // 1 render to process render task, then 1 before finished msg is sent from update to the event thread. + application.SendNotification(); + application.Render(); + application.Render(); + + application.SendNotification(); + DALI_TEST_CHECK( finished ); + + END_TEST; +} + +int UtcDaliRenderTaskWorldToViewport(void) +{ + TestApplication application( 400u, 400u ); // square surface + + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + + Actor actor = Actor::New(); + actor.SetSize(100.0f, 100.0f); + actor.SetPosition( Vector3(0.0, 0.0, 0.0) ); + + actor.SetParentOrigin( Vector3(0.5, 0.5, 0.5) ); + actor.SetAnchorPoint( Vector3(0.5, 0.5, 0.5) ); + + Stage::GetCurrent().Add(actor); + + application.SendNotification(); + application.Render(); + application.SendNotification(); + + RenderTask task = taskList.GetTask( 0u ); + + CameraActor camera = task.GetCameraActor(); + + Vector2 screenSize = task.GetCurrentViewportSize(); + + float screenX = 0.0; + float screenY = 0.0; + + bool ok = task.WorldToViewport(actor.GetCurrentWorldPosition(), screenX, screenY); + DALI_TEST_CHECK(ok == true); + + DALI_TEST_EQUALS(screenX, screenSize.x/2, Math::MACHINE_EPSILON_10000, TEST_LOCATION); + DALI_TEST_EQUALS(screenY, screenSize.y/2, Math::MACHINE_EPSILON_10000, TEST_LOCATION); + + Actor actor2 = Actor::New(); + float actor2Size = 100.f; + actor2.SetSize( actor2Size, actor2Size ); + actor2.SetPosition( Vector3(0.0, 0.0, 0.0) ); + actor2.SetParentOrigin( Vector3(0.5, 0.5, 0.0) ); + actor2.SetAnchorPoint( Vector3(0.5, 0.5, 0.0) ); + Stage::GetCurrent().Add( actor2 ); + actor2.Add(actor); + actor.SetParentOrigin( Vector3(0,0,0) ); + + application.SendNotification(); + application.Render(); + application.SendNotification(); + + ok = task.WorldToViewport(actor.GetCurrentWorldPosition(), screenX, screenY); + DALI_TEST_CHECK(ok == true); + + DALI_TEST_EQUALS(screenX, screenSize.x/2 - actor2Size/2, Math::MACHINE_EPSILON_10000, TEST_LOCATION); + DALI_TEST_EQUALS(screenY, screenSize.y/2 - actor2Size/2, Math::MACHINE_EPSILON_10000, TEST_LOCATION); + + END_TEST; +} + + +int UtcDaliRenderTaskViewportToLocal(void) +{ + TestApplication application; + Actor actor = Actor::New(); + actor.SetAnchorPoint(AnchorPoint::TOP_LEFT); + actor.SetSize(100.0f, 100.0f); + actor.SetPosition(10.0f, 10.0f); + Stage::GetCurrent().Add(actor); + + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + RenderTask task = taskList.GetTask( 0u ); + + // flush the queue and render once + application.SendNotification(); + application.Render(); + application.SendNotification(); + application.Render(); - // Render and notify + float localX; + float localY; + + float rtLocalX; + float rtLocalY; + + float screenX = 50.0f; + float screenY = 50.0f; + + DALI_TEST_CHECK( actor.ScreenToLocal(localX, localY, screenX, screenY) ); + + DALI_TEST_CHECK( task.ViewportToLocal(actor, screenX, screenY, rtLocalX, rtLocalY ) ); + + DALI_TEST_EQUALS(localX, rtLocalX, 0.01f, TEST_LOCATION); + DALI_TEST_EQUALS(localY, rtLocalY, 0.01f, TEST_LOCATION); + + END_TEST; + +} + +int UtcDaliRenderTaskOffscreenViewportToLocal(void) +{ + TestApplication application; + Actor actor = Actor::New(); + actor.SetAnchorPoint( AnchorPoint::TOP_LEFT ); + actor.SetSize( 100.0f, 100.0f ); + actor.SetPosition( 10.0f, 10.0f ); + Stage::GetCurrent().Add( actor ); + + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + RenderTask task = taskList.CreateTask(); + + FrameBufferImage newFrameBuffer = FrameBufferImage::New( 10, 10 ); + task.SetTargetFrameBuffer( newFrameBuffer ); + task.SetSourceActor( actor ); + task.SetScreenToFrameBufferMappingActor( actor ); + + CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) ); + Stage::GetCurrent().Add( offscreenCameraActor ); + task.SetCameraActor( offscreenCameraActor ); + + // flush the queue and render once + application.SendNotification(); + application.Render(); application.SendNotification(); application.Render(); + + float localX; + float localY; + + float rtLocalX; + float rtLocalY; + + float screenX = 50.0f; + float screenY = 50.0f; + + DALI_TEST_CHECK( actor.ScreenToLocal(localX, localY, screenX, screenY) ); + + DALI_TEST_CHECK( task.ViewportToLocal(actor, screenX, screenY, rtLocalX, rtLocalY ) ); + + DALI_TEST_EQUALS(localX, rtLocalX, 0.01f, TEST_LOCATION); + DALI_TEST_EQUALS(localY, rtLocalY, 0.01f, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliRenderTaskRequiresSync(void) +{ + TestApplication application; + RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList(); + + RenderTask newTask = taskList.CreateTask(); + newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, false ); + + DALI_TEST_EQUALS( newTask.GetProperty< bool >( RenderTask::Property::REQUIRES_SYNC ), false, TEST_LOCATION ); + DALI_TEST_EQUALS( newTask.GetCurrentProperty< bool >( RenderTask::Property::REQUIRES_SYNC ), false, TEST_LOCATION ); + + newTask.SetProperty( RenderTask::Property::REQUIRES_SYNC, true ); + + DALI_TEST_EQUALS( newTask.GetProperty< bool >( RenderTask::Property::REQUIRES_SYNC ), true, TEST_LOCATION ); + DALI_TEST_EQUALS( newTask.GetCurrentProperty< bool >( RenderTask::Property::REQUIRES_SYNC ), true, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliRenderTaskSetClearEnabled(void) +{ + TestApplication application; + + tet_infoline("UtcDaliRenderTaskSetClearEnabled"); + + application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); + TestGlAbstraction& gl = application.GetGlAbstraction(); + + Actor renderableActor = CreateRenderableActorSuccess( application, "aFile.jpg" ); + Stage::GetCurrent().Add( renderableActor ); + + Actor rootActor = Actor::New(); + Stage::GetCurrent().Add( rootActor ); + + CameraActor offscreenCameraActor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) ); + Stage::GetCurrent().Add( offscreenCameraActor ); + + Actor sourceActor = CreateRenderableActorSuccess( application, "aFile.jpg" ); + Stage::GetCurrent().Add( sourceActor ); + + RenderTask newTask = CreateRenderTask( application, offscreenCameraActor, rootActor, sourceActor, RenderTask::REFRESH_ALWAYS, false ); + + DALI_TEST_EQUALS( gl.GetClearCountCalled(), 0, TEST_LOCATION ); + + application.SendNotification(); application.Render(); + + // glClear should be called twice - default task and the new task. + DALI_TEST_EQUALS( gl.GetClearCountCalled(), 2, TEST_LOCATION ); + + newTask.SetClearEnabled( false ); + application.SendNotification(); + application.Render(); + + // The count should increase by 1 - default task only. + DALI_TEST_EQUALS( gl.GetClearCountCalled(), 3, TEST_LOCATION ); - Vector2 screenCoordinates( stageSize.x * 0.05f, stageSize.y * 0.05f ); - Dali::HitTestAlgorithm::Results results; - DALI_TEST_CHECK( !results.actor ); - DALI_TEST_EQUALS( Vector2::ZERO, results.actorCoordinates, 0.1f, TEST_LOCATION ); - // miss expected, results not changed - DALI_TEST_CHECK( false == Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction ) ); - DALI_TEST_CHECK( !results.actor ); - DALI_TEST_EQUALS( Vector2::ZERO, results.actorCoordinates, 0.1f, TEST_LOCATION ); - - screenCoordinates.x = stageSize.x * 0.265f; - screenCoordinates.y = stageSize.y * 0.33f; - results.actor = Actor(); - results.actorCoordinates = Vector2::ZERO; - // hit expected, results changed - DALI_TEST_CHECK( true == Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction ) ); - DALI_TEST_CHECK( results.actor == offscreenActor ); - DALI_TEST_EQUALS( (screenCoordinates-offset)/scale , results.actorCoordinates, 0.1f, TEST_LOCATION ); - - screenCoordinates.x = stageSize.x * 0.435f; - screenCoordinates.y = stageSize.y * 0.52f; - // hit expected, results changed - DALI_TEST_CHECK( true == Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction ) ); - DALI_TEST_CHECK( results.actor == offscreenActor ); - const Vector2 expectedCoordinates = (screenCoordinates-offset)/scale; - DALI_TEST_EQUALS( expectedCoordinates , results.actorCoordinates, 0.1f, TEST_LOCATION ); - - screenCoordinates.x = stageSize.x * 0.65f; - screenCoordinates.y = stageSize.y * 0.95f; - // miss expected, results not changed - DALI_TEST_CHECK( false == Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction ) ); - DALI_TEST_CHECK( results.actor == offscreenActor ); - DALI_TEST_EQUALS( expectedCoordinates , results.actorCoordinates, 0.1f, TEST_LOCATION ); END_TEST; }