From 80da2ab73cf56a93bd3eaf5d118bcdf965ee9baa Mon Sep 17 00:00:00 2001 From: Simon Fraser Date: Mon, 10 Apr 2023 19:23:52 -0700 Subject: [PATCH] [UI-side compositing] Scrolling is not as smooth as it should be on 120Hz displays https://bugs.webkit.org/show_bug.cgi?id=255254 Reviewed by Tim Horton and Matt Woodrow. On 120Hz displays, the scrolling thread would get displayDidRefresh() at 120Hz, but frameDuration() was the default 1/60s, causing RemoteLayerTreeEventDispatcher::waitForRenderingUpdateCompletionOrTimeout() to block for up to 8ms (half the frame duration). No-one called ScrollingTree::windowScreenDidChange(), so fix that by calling it from RemoteLayerTreeEventDispatcher. * Source/WebCore/page/scrolling/ScrollingTree.h: * Source/WebKit/UIProcess/RemoteLayerTree/mac/RemoteLayerTreeEventDispatcher.cpp: (WebKit::RemoteLayerTreeEventDispatcher::windowScreenDidChange): Canonical link: https://commits.webkit.org/262801@main --- Source/WebCore/page/scrolling/ScrollingTree.h | 2 +- .../RemoteLayerTree/mac/RemoteLayerTreeEventDispatcher.cpp | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Source/WebCore/page/scrolling/ScrollingTree.h b/Source/WebCore/page/scrolling/ScrollingTree.h index 7d11ff6d42ff..81b63343f062 100644 --- a/Source/WebCore/page/scrolling/ScrollingTree.h +++ b/Source/WebCore/page/scrolling/ScrollingTree.h @@ -209,7 +209,7 @@ class ScrollingTree : public ThreadSafeRefCounted { Lock& treeLock() WTF_RETURNS_LOCK(m_treeLock) { return m_treeLock; } - void windowScreenDidChange(PlatformDisplayID, std::optional nominalFramesPerSecond); + WEBCORE_EXPORT void windowScreenDidChange(PlatformDisplayID, std::optional nominalFramesPerSecond); PlatformDisplayID displayID(); WEBCORE_EXPORT virtual void displayDidRefresh(PlatformDisplayID) { } diff --git a/Source/WebKit/UIProcess/RemoteLayerTree/mac/RemoteLayerTreeEventDispatcher.cpp b/Source/WebKit/UIProcess/RemoteLayerTree/mac/RemoteLayerTreeEventDispatcher.cpp index 689bdca6f13a..dd71588878c9 100644 --- a/Source/WebKit/UIProcess/RemoteLayerTree/mac/RemoteLayerTreeEventDispatcher.cpp +++ b/Source/WebKit/UIProcess/RemoteLayerTree/mac/RemoteLayerTreeEventDispatcher.cpp @@ -497,6 +497,9 @@ void RemoteLayerTreeEventDispatcher::windowScreenDidChange(PlatformDisplayID dis UNUSED_PARAM(displayID); UNUSED_PARAM(nominalFramesPerSecond); #endif + if (auto scrollingTree = this->scrollingTree()) + scrollingTree->windowScreenDidChange(displayID, nominalFramesPerSecond); + // FIXME: Restart the displayLink if necessary. }