From 2097fc22810616f365474bff8b52ec4a84445d40 Mon Sep 17 00:00:00 2001 From: Heeyong Song Date: Wed, 24 May 2023 10:08:49 +0900 Subject: [PATCH] (Partial Update) Set updated when rendering behavior is continously Change-Id: I3e7f8dc68b1eb27498662f0898dba31b4cf29dda --- automated-tests/src/dali/utc-Dali-Renderer.cpp | 78 +++++++++++++++++++++- .../update/rendering/scene-graph-renderer.cpp | 8 ++- 2 files changed, 82 insertions(+), 4 deletions(-) diff --git a/automated-tests/src/dali/utc-Dali-Renderer.cpp b/automated-tests/src/dali/utc-Dali-Renderer.cpp index b99feb0..6d4abd7 100644 --- a/automated-tests/src/dali/utc-Dali-Renderer.cpp +++ b/automated-tests/src/dali/utc-Dali-Renderer.cpp @@ -4256,6 +4256,82 @@ int utcDaliRendererPartialUpdateAddRemoveRenderer(void) END_TEST; } +int utcDaliRendererPartialUpdateRenderingBehavior(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 rect with changing rendering behavior"); + + const TestGlAbstraction::ScissorParams& glScissorParams(application.GetGlAbstraction().GetScissorParams()); + + Shader shader = Shader::New("VertexSource", "FragmentSource"); + Geometry geometry = CreateQuadGeometry(); + Renderer renderer = Renderer::New(geometry, shader); + + Actor actor = Actor::New(); + actor.AddRenderer(renderer); + 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); + Stage::GetCurrent().Add(actor); + + application.SendNotification(); + + std::vector> damagedRects; + Rect clippingRect; + + // Actor added, damaged rect is added size of actor + damagedRects.clear(); + application.PreRenderWithPartialUpdate(TestApplication::RENDER_FRAME_INTERVAL, nullptr, damagedRects); + DALI_TEST_EQUALS(damagedRects.size(), 1, TEST_LOCATION); + + // Aligned by 16 + clippingRect = Rect(16, 768, 32, 32); // in screen coordinates + 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); + + damagedRects.clear(); + application.PreRenderWithPartialUpdate(TestApplication::RENDER_FRAME_INTERVAL, nullptr, damagedRects); + application.RenderWithPartialUpdate(damagedRects, clippingRect); + + // Ensure the damaged rect is empty + DALI_TEST_EQUALS(damagedRects.size(), 0, TEST_LOCATION); + + // Change rendering behavior to CONTINUOUSLY + renderer[DevelRenderer::Property::RENDERING_BEHAVIOR] = DevelRenderer::Rendering::CONTINUOUSLY; + + application.SendNotification(); + + damagedRects.clear(); + application.PreRenderWithPartialUpdate(TestApplication::RENDER_FRAME_INTERVAL, nullptr, damagedRects); + application.RenderWithPartialUpdate(damagedRects, clippingRect); + + // The damaged rect should not be empty + DALI_TEST_EQUALS(damagedRects.size(), 1, TEST_LOCATION); + DALI_TEST_EQUALS>(clippingRect, damagedRects[0], TEST_LOCATION); + + damagedRects.clear(); + application.PreRenderWithPartialUpdate(TestApplication::RENDER_FRAME_INTERVAL, nullptr, damagedRects); + application.RenderWithPartialUpdate(damagedRects, clippingRect); + + // The damaged rect should not be empty again! + DALI_TEST_EQUALS(damagedRects.size(), 1, TEST_LOCATION); + DALI_TEST_EQUALS>(clippingRect, damagedRects[0], TEST_LOCATION); + + END_TEST; +} + int utcDaliRendererDoNotSkipRenderIfTextureSetChanged(void) { TestApplication application; @@ -4307,4 +4383,4 @@ int utcDaliRendererDoNotSkipRenderIfTextureSetChanged(void) DALI_TEST_GREATER(drawTrace.CountMethod("DrawElements"), 0, TEST_LOCATION); END_TEST; -} \ No newline at end of file +} diff --git a/dali/internal/update/rendering/scene-graph-renderer.cpp b/dali/internal/update/rendering/scene-graph-renderer.cpp index 5d9ad5f..3d4faab 100644 --- a/dali/internal/update/rendering/scene-graph-renderer.cpp +++ b/dali/internal/update/rendering/scene-graph-renderer.cpp @@ -170,6 +170,11 @@ bool Renderer::PrepareRender(BufferIndex updateBufferIndex) mUpdateDecay = static_cast(static_cast(mUpdateDecay) - 1); } + if(mDirtyFlag || mResendFlag || mRenderingBehavior == DevelRenderer::Rendering::CONTINUOUSLY) // We don't check mUpdateDecay + { + SetUpdated(true); + } + if(mResendFlag != 0) { Render::Renderer* rendererPtr = mRenderer.Get(); @@ -319,9 +324,6 @@ bool Renderer::PrepareRender(BufferIndex updateBufferIndex) uint32_t* slot = mSceneController->GetRenderQueue().ReserveMessageSlot(updateBufferIndex, sizeof(DerivedType)); new(slot) DerivedType(rendererPtr, &Render::Renderer::SetRenderCallback, mRenderCallback); } - - SetUpdated(true); - mResendFlag = 0; } -- 2.7.4