From 61bba1b9dd4602771479bc17417ac4f1905f8d38 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 16 Jan 2019 20:16:50 +0100 Subject: [PATCH] WindowServer: Skip blitting windows into the back buffer if possible. Windows that don't intersect any of the dirty rects don't need to be copied into the back buffer since they won't be affected by the subsequent flushes. --- WindowServer/WSWindowManager.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/WindowServer/WSWindowManager.cpp b/WindowServer/WSWindowManager.cpp index d9467facd8..43ae59535a 100644 --- a/WindowServer/WSWindowManager.cpp +++ b/WindowServer/WSWindowManager.cpp @@ -284,6 +284,15 @@ void WSWindowManager::compose() return false; }; + auto any_dirty_rect_intersects_window = [&invalidated_rects] (const WSWindow& window) { + auto window_rect = outerRectForWindow(window.rect()); + for (auto& dirty_rect : invalidated_rects) { + if (dirty_rect.intersects(window_rect)) + return true; + } + return false; + }; + for (auto& r : invalidated_rects) { if (any_window_contains_rect(r)) continue; @@ -293,6 +302,8 @@ void WSWindowManager::compose() for (auto* window = m_windows_in_order.head(); window; window = window->next()) { if (!window->backing()) continue; + if (!any_dirty_rect_intersects_window(*window)) + continue; paintWindowFrame(*window); m_back_painter->blit(window->position(), *window->backing()); }