From dd8d191705a2945b95ed1454a358d51bc10678a0 Mon Sep 17 00:00:00 2001 From: "Eunki, Hong" Date: Thu, 8 Sep 2022 11:23:26 +0900 Subject: [PATCH] [Tizen] Fix partial update window rotation works well. Currently, mDamagedRects should be "rotated" rects, and others (clippingRect, mDamagedBufferRects) are not be rotated. But current clippingRect merged by 'rotated' rects. This patch make clippingRect calculate well. And also, if clippingRect become empty, mDamagedRects not be changed. so, It can make something annoying actions. Change-Id: Ia8f35d32411e4ab3786f3a10c97d818a967a0afc Signed-off-by: Eunki, Hong --- .../window-system/common/window-render-surface.cpp | 44 +++++++++------------- 1 file changed, 17 insertions(+), 27 deletions(-) diff --git a/dali/internal/window-system/common/window-render-surface.cpp b/dali/internal/window-system/common/window-render-surface.cpp index 8dd26e9..2eb946a 100644 --- a/dali/internal/window-system/common/window-render-surface.cpp +++ b/dali/internal/window-system/common/window-render-surface.cpp @@ -49,27 +49,6 @@ const float FULL_UPDATE_RATIO(0.8f); ///< Force full update when the dirty a Debug::Filter* gWindowRenderSurfaceLogFilter = Debug::Filter::New(Debug::Verbose, false, "LOG_WINDOW_RENDER_SURFACE"); #endif -void MergeRects(Rect& mergingRect, const std::vector>& rects) -{ - uint32_t i = 0; - if(mergingRect.IsEmpty()) - { - for(; i < rects.size(); i++) - { - if(!rects[i].IsEmpty()) - { - mergingRect = rects[i]; - break; - } - } - } - - for(; i < rects.size(); i++) - { - mergingRect.Merge(rects[i]); - } -} - void InsertRects(WindowRenderSurface::DamagedRectsContainer& damagedRectsList, const Rect& damagedRects) { damagedRectsList.insert(damagedRectsList.begin(), damagedRects); @@ -118,7 +97,7 @@ using RecalculateRectFunction = Rect (*)(Rect&, const Rect>& damagedRects, int orientation, const Rect& surfaceRect) +void MergeIntersectingRectsAndRotate(Rect& mergingRect, std::vector>& damagedRects, int orientation, const Rect& surfaceRect) { const int n = damagedRects.size(); for(int i = 0; i < n - 1; i++) @@ -149,6 +128,16 @@ void MergeIntersectingRects(std::vector>& damagedRects, int orientatio { if(!damagedRects[i].IsEmpty()) { + // Merge rects before rotate + if(mergingRect.IsEmpty()) + { + mergingRect = damagedRects[i]; + } + else + { + mergingRect.Merge(damagedRects[i]); + } + damagedRects[j++] = RecalculateRect[orientation](damagedRects[i], surfaceRect); } } @@ -878,6 +867,7 @@ void WindowRenderSurface::SetBufferDamagedRects(const std::vector>& da { InsertRects(mBufferDamagedRects, surfaceRect); clippingRect = surfaceRect; + mDamagedRects.assign(1, RecalculateRect[orientation](surfaceRect, surfaceRect)); return; } @@ -885,6 +875,7 @@ void WindowRenderSurface::SetBufferDamagedRects(const std::vector>& da { // Empty damaged rect. We don't need rendering clippingRect = Rect(); + mDamagedRects.clear(); return; } @@ -897,6 +888,7 @@ void WindowRenderSurface::SetBufferDamagedRects(const std::vector>& da { InsertRects(mBufferDamagedRects, surfaceRect); clippingRect = surfaceRect; + mDamagedRects.assign(1, RecalculateRect[orientation](surfaceRect, surfaceRect)); return; } @@ -904,10 +896,8 @@ void WindowRenderSurface::SetBufferDamagedRects(const std::vector>& da // Merge intersecting rects, form an array of non intersecting rects to help driver a bit // Could be optional and can be removed, needs to be checked with and without on platform - MergeIntersectingRects(mDamagedRects, orientation, surfaceRect); - - // Make one clipping rect - MergeRects(clippingRect, mDamagedRects); + // And then, Make one clipping rect, and rotate rects by orientation. + MergeIntersectingRectsAndRotate(clippingRect, mDamagedRects, orientation, surfaceRect); // We push current frame damaged rects here, zero index for current frame InsertRects(mBufferDamagedRects, clippingRect); @@ -940,7 +930,7 @@ void WindowRenderSurface::SetBufferDamagedRects(const std::vector>& da std::vector> damagedRegion; if(scene) { - damagedRegion.push_back(RecalculateRect[std::min(scene.GetCurrentSurfaceOrientation() / 90, 3)](clippingRect, scene.GetCurrentSurfaceRect())); + damagedRegion.push_back(RecalculateRect[orientation](clippingRect, surfaceRect)); } else { -- 2.7.4