From: Taehyub Kim Date: Wed, 14 Sep 2022 02:42:13 +0000 (+0900) Subject: [Tizen] Fix partial update window rotation works well. X-Git-Tag: accepted/tizen/unified/20220914.164050~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=30fefd588419cc4d890c77de877d9314c9f2dd64;hp=63959b70121e6f3470c900593229031786a1f25d;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git [Tizen] Fix partial update window rotation works well. This reverts commit 5250aa678e5e5898b412c240402599858c6b2d28. --- 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 {