X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali%2Futc-Dali-RenderTask.cpp;h=af93507a5946d9bf70184b36ce424421fa24d9e8;hb=5de727a5d6b9ef995c93eff4d4e47a086784a332;hp=9b5e9de633facf1debb7418d99a188aaf57c1cf6;hpb=14dc21f060cc6ec28838d3c38cf3aa335cb8e28e;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 9b5e9de..af93507 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) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 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. @@ -3524,4 +3524,295 @@ int UtcDaliRenderTaskUploadOnly(void) DALI_TEST_CHECK(!finished); END_TEST; -} \ No newline at end of file +} + +int UtcDaliRenderTaskSetGetViewportGuideActor(void) +{ + TestApplication application; + tet_infoline("Testing RenderTask with Set/Get ViewportGuideActor"); + + Stage stage = Stage::GetCurrent(); + Vector2 stageSize(stage.GetSize()); + + Actor blue = Actor::New(); + blue[Dali::Actor::Property::NAME] = "Blue"; + blue[Dali::Actor::Property::ANCHOR_POINT] = AnchorPoint::CENTER; + blue[Dali::Actor::Property::PARENT_ORIGIN] = ParentOrigin::CENTER; + blue[Dali::Actor::Property::SIZE] = Vector2(300, 300); + blue[Dali::Actor::Property::POSITION] = Vector2(0, 0); + + stage.Add(blue); + + RenderTaskList renderTaskList = stage.GetRenderTaskList(); + RenderTask renderTask = renderTaskList.CreateTask(); + + renderTask.SetViewportGuideActor(blue); + + Actor actor = renderTask.GetViewportGuideActor(); + DALI_TEST_EQUALS(actor, blue, TEST_LOCATION); + + renderTask.ResetViewportGuideActor(); + actor = renderTask.GetViewportGuideActor(); + + DALI_TEST_CHECK(!actor); + + END_TEST; +} + +int UtcDaliRenderTaskViewportGuideActor(void) +{ + TestApplication application; + tet_infoline("Testing RenderTask with ViewportGuideActor"); + + Stage stage = Stage::GetCurrent(); + Vector2 stageSize(stage.GetSize()); + + Actor blue = Actor::New(); + blue[Dali::Actor::Property::NAME] = "Blue"; + blue[Dali::Actor::Property::ANCHOR_POINT] = AnchorPoint::CENTER; + blue[Dali::Actor::Property::PARENT_ORIGIN] = ParentOrigin::CENTER; + blue[Dali::Actor::Property::SIZE] = Vector2(300, 300); + blue[Dali::Actor::Property::POSITION] = Vector2(0, 0); + + Geometry geometry = Geometry::New(); + Shader shader = Shader::New("vertexSrc", "fragmentSrc"); + Renderer renderer = Renderer::New(geometry, shader); + blue.AddRenderer(renderer); + + stage.Add(blue); + + RenderTaskList renderTaskList = stage.GetRenderTaskList(); + RenderTask renderTask = renderTaskList.CreateTask(); + + Dali::CameraActor cameraActor = Dali::CameraActor::New(stageSize); + cameraActor[Dali::Actor::Property::ANCHOR_POINT] = AnchorPoint::CENTER; + cameraActor[Dali::Actor::Property::PARENT_ORIGIN] = ParentOrigin::CENTER; + stage.Add(cameraActor); + + renderTask.SetExclusive(true); + renderTask.SetInputEnabled(true); + renderTask.SetCameraActor(cameraActor); + renderTask.SetSourceActor(blue); + renderTask.SetViewportGuideActor(blue); + + // Render and notify + application.SendNotification(); + application.Render(16); + + Vector2 viewportPosition = renderTask.GetCurrentViewportPosition(); + Vector2 viewportSize = renderTask.GetCurrentViewportSize(); + + DALI_TEST_EQUALS(viewportSize, Vector2(300, 300), TEST_LOCATION); + DALI_TEST_EQUALS(viewportPosition, Vector2(90, 250), TEST_LOCATION); + + END_TEST; +} + +int UtcDaliRenderTaskViewportGuideActor02(void) +{ + TestApplication application( + TestApplication::DEFAULT_SURFACE_WIDTH, + TestApplication::DEFAULT_SURFACE_HEIGHT, + TestApplication::DEFAULT_HORIZONTAL_DPI, + TestApplication::DEFAULT_VERTICAL_DPI, + true, + true); + TestGlAbstraction& glAbstraction = application.GetGlAbstraction(); + TraceCallStack& callStack = glAbstraction.GetViewportTrace(); + glAbstraction.EnableViewportCallTrace(true); + tet_infoline("Testing RenderTask with ViewportGuideActor02"); + + Stage stage = Stage::GetCurrent(); + Vector2 stageSize(stage.GetSize()); + + // Render and notify + application.SendNotification(); + application.Render(16); + glAbstraction.ResetViewportCallStack(); + + Geometry geometry = Geometry::New(); + Shader shader = Shader::New("vertexSrc", "fragmentSrc"); + Renderer renderer = Renderer::New(geometry, shader); + + Actor blue = Actor::New(); + blue[Dali::Actor::Property::NAME] = "Blue"; + blue[Dali::Actor::Property::ANCHOR_POINT] = AnchorPoint::TOP_LEFT; + blue[Dali::Actor::Property::PARENT_ORIGIN] = ParentOrigin::TOP_LEFT; + blue[Dali::Actor::Property::SIZE] = Vector2(400, 300); + blue[Dali::Actor::Property::POSITION] = Vector2(100, 50); + blue.AddRenderer(renderer); + stage.Add(blue); + + Actor green = Actor::New(); + green[Dali::Actor::Property::NAME] = "Green"; + green[Dali::Actor::Property::ANCHOR_POINT] = AnchorPoint::TOP_LEFT; + green[Dali::Actor::Property::PARENT_ORIGIN] = ParentOrigin::TOP_LEFT; + green[Dali::Actor::Property::SIZE] = Vector2(400, 300); + green[Dali::Actor::Property::POSITION] = Vector2(100, 50); + green.AddRenderer(renderer); + stage.Add(green); + + RenderTaskList renderTaskList = stage.GetRenderTaskList(); + RenderTask renderTask = renderTaskList.CreateTask(); + + Dali::CameraActor cameraActor = Dali::CameraActor::New(stageSize); + cameraActor[Dali::Actor::Property::ANCHOR_POINT] = AnchorPoint::CENTER; + cameraActor[Dali::Actor::Property::PARENT_ORIGIN] = ParentOrigin::CENTER; + stage.Add(cameraActor); + + renderTask.SetExclusive(true); + renderTask.SetInputEnabled(true); + renderTask.SetCameraActor(cameraActor); + renderTask.SetSourceActor(blue); + renderTask.SetViewportGuideActor(blue); + + application.GetScene().SurfaceRotated(static_cast(TestApplication::DEFAULT_SURFACE_HEIGHT), + static_cast(TestApplication::DEFAULT_SURFACE_WIDTH), + 90, + 0); + + // Render and notify + application.SendNotification(); + application.Render(16); + + std::string viewportParams1("50, 100, 300, 400"); // to match newSize + std::string viewportParams2("0, 0, 480, 800"); // to match newSize + + // Check that the viewport is handled properly + DALI_TEST_CHECK(callStack.FindIndexFromMethodAndParams("Viewport", viewportParams1) >= 0); + DALI_TEST_CHECK(callStack.FindIndexFromMethodAndParams("Viewport", viewportParams2) >= 0); + + END_TEST; +} + +int UtcDaliRenderTaskSetPartialUpdate(void) +{ + TestApplication application( + TestApplication::DEFAULT_SURFACE_WIDTH, + TestApplication::DEFAULT_SURFACE_HEIGHT, + TestApplication::DEFAULT_HORIZONTAL_DPI, + TestApplication::DEFAULT_VERTICAL_DPI, + true, + true); + + tet_infoline("Check the damaged rects with render task"); + + const TestGlAbstraction::ScissorParams& glScissorParams(application.GetGlAbstraction().GetScissorParams()); + + Actor actor = CreateRenderableActor(); + actor.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT); + actor.SetProperty(Actor::Property::POSITION, Vector3(16.0f, 16.0f, 0.0f)); + actor.SetProperty(Actor::Property::SIZE, Vector3(16.0f, 16.0f, 0.0f)); + actor.SetResizePolicy(ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS); + application.GetScene().Add(actor); + + Actor rootActor = CreateRenderableActor(); + rootActor.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT); + rootActor.SetProperty(Actor::Property::POSITION, Vector3(16.0f, 16.0f, 0.0f)); + rootActor.SetProperty(Actor::Property::SIZE, Vector3(16.0f, 16.0f, 0.0f)); + rootActor.SetResizePolicy(ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS); + application.GetScene().Add(rootActor); + + CameraActor cameraActor = CameraActor::New(Size(TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT)); + cameraActor.SetProperty(Dali::Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER); + cameraActor.SetProperty(Dali::Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER); + application.GetScene().Add(cameraActor); + + Texture frameBufferTexture = Texture::New(TextureType::TEXTURE_2D, Pixel::RGB888, 16, 16); + FrameBuffer frameBuffer = FrameBuffer::New(frameBufferTexture.GetWidth(), frameBufferTexture.GetHeight()); + frameBuffer.AttachColorTexture(frameBufferTexture); + + // Create a RenderTask and set a framebuffer + RenderTaskList taskList = application.GetScene().GetRenderTaskList(); + RenderTask newTask = taskList.CreateTask(); + newTask.SetCameraActor(cameraActor); + 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_ALWAYS); + newTask.SetFrameBuffer(frameBuffer); + + application.SendNotification(); + + std::vector> damagedRects; + Rect clippingRect; + + application.PreRenderWithPartialUpdate(TestApplication::RENDER_FRAME_INTERVAL, nullptr, damagedRects); + + // Full update if there is off-screen rendering + clippingRect = Rect(0, 0, TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT); + DALI_TEST_EQUALS(damagedRects.size(), 1, TEST_LOCATION); + DALI_TEST_EQUALS>(clippingRect, damagedRects[0], TEST_LOCATION); + + application.RenderWithPartialUpdate(damagedRects, clippingRect); + DALI_TEST_EQUALS(clippingRect.x, glScissorParams.x, TEST_LOCATION); + DALI_TEST_EQUALS(clippingRect.y, glScissorParams.y, TEST_LOCATION); + DALI_TEST_EQUALS(clippingRect.width, glScissorParams.width, TEST_LOCATION); + DALI_TEST_EQUALS(clippingRect.height, glScissorParams.height, TEST_LOCATION); + + // Remove framebuffer + newTask.SetFrameBuffer(FrameBuffer()); + + application.SendNotification(); + + damagedRects.clear(); + application.PreRenderWithPartialUpdate(TestApplication::RENDER_FRAME_INTERVAL, nullptr, damagedRects); + + // Full update + clippingRect = Rect(0, 0, TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT); + DALI_TEST_EQUALS(damagedRects.size(), 1, TEST_LOCATION); + DALI_TEST_EQUALS>(clippingRect, damagedRects[0], TEST_LOCATION); + + application.RenderWithPartialUpdate(damagedRects, clippingRect); + + // Set invalid viewport of the render task + newTask.SetViewportSize(Vector2(-100.0f, -100.0f)); + + application.SendNotification(); + + damagedRects.clear(); + application.PreRenderWithPartialUpdate(TestApplication::RENDER_FRAME_INTERVAL, nullptr, damagedRects); + + // Full update because the camera orientation is changed + clippingRect = Rect(0, 0, TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT); + DALI_TEST_EQUALS(damagedRects.size(), 1, TEST_LOCATION); + DALI_TEST_EQUALS>(clippingRect, damagedRects[0], TEST_LOCATION); + + application.RenderWithPartialUpdate(damagedRects, clippingRect); + + newTask.SetViewportSize(Vector2(0.0f, 0.0f)); + + // Change orientation of offscreen camera + cameraActor.SetProperty(Actor::Property::ORIENTATION, Quaternion(Degree(90.0f), Vector3::XAXIS)); + + application.SendNotification(); + + damagedRects.clear(); + application.PreRenderWithPartialUpdate(TestApplication::RENDER_FRAME_INTERVAL, nullptr, damagedRects); + + // Full update because the camera orientation is changed + clippingRect = Rect(0, 0, TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT); + DALI_TEST_EQUALS(damagedRects.size(), 1, TEST_LOCATION); + DALI_TEST_EQUALS>(clippingRect, damagedRects[0], TEST_LOCATION); + + application.RenderWithPartialUpdate(damagedRects, clippingRect); + + // Change camera target + cameraActor.SetTargetPosition(Vector3(10.0f, 10.0f, 0.0f)); + + application.SendNotification(); + + damagedRects.clear(); + application.PreRenderWithPartialUpdate(TestApplication::RENDER_FRAME_INTERVAL, nullptr, damagedRects); + + // Full update because the camera is moved + clippingRect = Rect(0, 0, TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT); + DALI_TEST_EQUALS(damagedRects.size(), 1, TEST_LOCATION); + DALI_TEST_EQUALS>(clippingRect, damagedRects[0], TEST_LOCATION); + + application.RenderWithPartialUpdate(damagedRects, clippingRect); + + END_TEST; +}