From 18280ecbc4acc01995758c47e3985902cdfe4f39 Mon Sep 17 00:00:00 2001 From: Heeyong Song Date: Tue, 12 Oct 2021 23:46:29 +0900 Subject: [PATCH] (Partial update) Change calculation of damaged rects Separate the empty damaged rect case and the full damaged rect case Change-Id: I6f515504f95b32c0d1a01b3851ecbc2044020a05 --- .../dali-test-suite-utils/test-application.cpp | 4 +- .../dali-test-suite-utils/test-application.h | 2 + .../window-system/common/window-render-surface.cpp | 55 ++++++++++++---------- 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/automated-tests/src/dali-adaptor/dali-test-suite-utils/test-application.cpp b/automated-tests/src/dali-adaptor/dali-test-suite-utils/test-application.cpp index 5e69c95..440270a 100644 --- a/automated-tests/src/dali-adaptor/dali-test-suite-utils/test-application.cpp +++ b/automated-tests/src/dali-adaptor/dali-test-suite-utils/test-application.cpp @@ -19,6 +19,8 @@ namespace Dali { +const Rect TestApplication::DEFAULT_SURFACE_RECT = Rect(0, 0, TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT); + bool TestApplication::mLoggingEnabled = true; TestApplication::TestApplication(uint32_t surfaceWidth, @@ -225,7 +227,7 @@ bool TestApplication::PreRenderWithPartialUpdate(uint32_t intervalMilliseconds, bool TestApplication::RenderWithPartialUpdate(std::vector>& damagedRects, Rect& clippingRect) { - mCore->RenderScene(mRenderStatus, mScene, true /*render the off-screen buffers*/, clippingRect); + mCore->RenderScene(mRenderStatus, mScene, true /*render the off-screen buffers*/); mCore->RenderScene(mRenderStatus, mScene, false /*render the surface*/, clippingRect); mCore->PostRender(false /*do not skip rendering*/); diff --git a/automated-tests/src/dali-adaptor/dali-test-suite-utils/test-application.h b/automated-tests/src/dali-adaptor/dali-test-suite-utils/test-application.h index 4f32cd8..02143a7 100644 --- a/automated-tests/src/dali-adaptor/dali-test-suite-utils/test-application.h +++ b/automated-tests/src/dali-adaptor/dali-test-suite-utils/test-application.h @@ -38,6 +38,8 @@ public: static const uint32_t DEFAULT_SURFACE_WIDTH = 480; static const uint32_t DEFAULT_SURFACE_HEIGHT = 800; + static const Rect DEFAULT_SURFACE_RECT; + static constexpr uint32_t DEFAULT_HORIZONTAL_DPI = 220; static constexpr uint32_t DEFAULT_VERTICAL_DPI = 217; diff --git a/dali/internal/window-system/common/window-render-surface.cpp b/dali/internal/window-system/common/window-render-surface.cpp index 23ffcd9..4a44951 100644 --- a/dali/internal/window-system/common/window-render-surface.cpp +++ b/dali/internal/window-system/common/window-render-surface.cpp @@ -554,9 +554,16 @@ bool WindowRenderSurface::PreRender(bool resizingSurface, const std::vector surfaceRect(0, 0, mPositionSize.width, mPositionSize.height); + if(clippingRect == surfaceRect) { - mDamagedRects.clear(); + mDamagedRects.assign(1, surfaceRect); + } + else if(mDamagedRects.empty() && !clippingRect.IsEmpty()) + { + // We will render clippingRect area but mDamagedRects is empty. + // So make mDamagedRects same with clippingRect to swap buffers. + mDamagedRects.assign(1, clippingRect); } // This is now done when the render pass for the render surface begins @@ -749,18 +756,13 @@ void WindowRenderSurface::SetBufferDamagedRects(const std::vector>& da auto eglGraphics = static_cast(mGraphics); if(eglGraphics) { - Internal::Adaptor::EglImplementation& eglImpl = eglGraphics->GetEglImplementation(); - if(!eglImpl.IsPartialUpdateRequired()) - { - return; - } - Rect surfaceRect(0, 0, mPositionSize.width, mPositionSize.height); - if(mFullSwapNextFrame) + Internal::Adaptor::EglImplementation& eglImpl = eglGraphics->GetEglImplementation(); + if(!eglImpl.IsPartialUpdateRequired() || mFullSwapNextFrame) { InsertRects(mBufferDamagedRects, std::vector>(1, surfaceRect)); - clippingRect = Rect(); + clippingRect = surfaceRect; return; } @@ -769,10 +771,10 @@ void WindowRenderSurface::SetBufferDamagedRects(const std::vector>& da EGLint bufferAge = eglImpl.GetBufferAge(mEGLSurface); // Buffer age 0 means the back buffer in invalid and requires full swap - if(!damagedRects.size() || bufferAge == 0) + if(bufferAge == 0) { InsertRects(mBufferDamagedRects, std::vector>(1, surfaceRect)); - clippingRect = Rect(); + clippingRect = surfaceRect; return; } @@ -790,22 +792,25 @@ void WindowRenderSurface::SetBufferDamagedRects(const std::vector>& da if(!clippingRect.Intersect(surfaceRect) || clippingRect.Area() > surfaceRect.Area() * FULL_UPDATE_RATIO) { // clipping area too big or doesn't intersect surface rect - clippingRect = Rect(); + clippingRect = surfaceRect; return; } - std::vector> damagedRegion; - Dali::Integration::Scene scene = mScene.GetHandle(); - if(scene) + if(!clippingRect.IsEmpty()) { - damagedRegion.push_back(RecalculateRect[std::min(scene.GetCurrentSurfaceOrientation() / 90, 3)](clippingRect, scene.GetCurrentSurfaceRect())); - } - else - { - damagedRegion.push_back(clippingRect); - } + std::vector> damagedRegion; + Dali::Integration::Scene scene = mScene.GetHandle(); + if(scene) + { + damagedRegion.push_back(RecalculateRect[std::min(scene.GetCurrentSurfaceOrientation() / 90, 3)](clippingRect, scene.GetCurrentSurfaceRect())); + } + else + { + damagedRegion.push_back(clippingRect); + } - eglImpl.SetDamageRegion(mEGLSurface, damagedRegion); + eglImpl.SetDamageRegion(mEGLSurface, damagedRegion); + } } } @@ -826,7 +831,7 @@ void WindowRenderSurface::SwapBuffers(const std::vector>& damagedRects Internal::Adaptor::EglImplementation& eglImpl = eglGraphics->GetEglImplementation(); - if(!eglImpl.IsPartialUpdateRequired() || mFullSwapNextFrame || !damagedRects.size() || (damagedRects[0].Area() > surfaceRect.Area() * FULL_UPDATE_RATIO)) + if(!eglImpl.IsPartialUpdateRequired() || mFullSwapNextFrame || (damagedRects.size() != 0 && damagedRects[0].Area() > surfaceRect.Area() * FULL_UPDATE_RATIO)) { mFullSwapNextFrame = false; eglImpl.SwapBuffers(mEGLSurface); @@ -879,6 +884,8 @@ void WindowRenderSurface::SwapBuffers(const std::vector>& damagedRects if(!mergedRects.size() || (mergedRects[0].Area() > surfaceRect.Area() * FULL_UPDATE_RATIO)) { + // In normal cases, WindowRenderSurface::SwapBuffers() will not be called if mergedRects.size() is 0. + // For exceptional cases, swap full area. eglImpl.SwapBuffers(mEGLSurface); } else -- 2.7.4