Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 2c03fdfa8727a08843af973b6b7ddb5382ae0488
https://github.com/WebKit/WebKit/commit/2c03fdfa8727a08843af973b6b7ddb5382ae0488
Author: Simon Fraser <[email protected]>
Date: 2026-01-12 (Mon, 12 Jan 2026)
Changed paths:
M Source/WebCore/page/LocalFrameView.cpp
M Source/WebCore/page/LocalFrameView.h
M Source/WebCore/page/Page.cpp
M Source/WebCore/page/Page.h
M Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm
M Source/WebKit/WebProcess/WebPage/DrawingArea.h
M Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeContext.h
M Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeContext.mm
M
Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h
M
Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm
M Source/WebKit/WebProcess/WebPage/WebPage.cpp
Log Message:
-----------
Lots of CPU time under `traverseForPaintInvalidation`
https://bugs.webkit.org/show_bug.cgi?id=305246
rdar://165376215
Reviewed by Cameron McCormack.
The `traverseForPaintInvalidation()` call in question is the one called from
`LocalFrameView::invalidateImagesWithAsyncDecodes()`. Some debugging shows that
there's a sequence of
events that can result in this getting called on every rendering update:
1. Either `RemoteLayerTreeDrawingArea::activityStateDidChange()` or
`RemoteLayerTreeDrawingArea::dispatchAfterEnsuringDrawing()`
are called; one way for this to happen is going into fullscreen, or tab
switching.
2. They call `setNextRenderingUpdateRequiresSynchronousImageDecoding()` which
sets state on the
`RemoteLayerTreeContext`.
3. `Page::finalizeRenderingUpdateForRootFrame()` sees this bit and calls
`invalidateImagesWithAsyncDecodes()`
which does the `traverseForPaintInvalidation()`.
The problem is that the `m_nextRenderingUpdateRequiresSynchronousImageDecoding`
flag on `RemoteLayerTreeContext`
remains true until some backing store paints, so if, after a tab switch, the
page triggers lots of
rendering updates that don't involve painting, then we call
`traverseForPaintInvalidation()` on each one for
no reason. This happens, for example, on a page with embedded YouTube videos.
This entire mechanism was added in 262585@main to avoid image decode flashing
when we started to discard
image data in background tabs. However, 265328@main added logic to never async
decode images which are visible
in the viewport, which made all of this logic redundant, so this PR simply
removes it.
* Source/WebCore/page/LocalFrameView.cpp:
(WebCore::LocalFrameView::invalidateImagesWithAsyncDecodes): Deleted.
* Source/WebCore/page/LocalFrameView.h:
* Source/WebCore/page/Page.cpp:
(WebCore::Page::finalizeRenderingUpdateForRootFrame):
* Source/WebCore/page/Page.h:
* Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm:
(WebKit::RemoteLayerBackingStore::drawInContext):
* Source/WebKit/WebProcess/WebPage/DrawingArea.h:
(WebKit::DrawingArea::setNextRenderingUpdateRequiresSynchronousImageDecoding):
Deleted.
* Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeContext.h:
(WebKit::RemoteLayerTreeContext::backingStoreCollection):
(WebKit::RemoteLayerTreeContext::setNextRenderingUpdateRequiresSynchronousImageDecoding):
Deleted.
(WebKit::RemoteLayerTreeContext::nextRenderingUpdateRequiresSynchronousImageDecoding
const): Deleted.
* Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeContext.mm:
(WebKit::RemoteLayerTreeContext::buildTransaction):
* Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h:
*
Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm:
(WebKit::RemoteLayerTreeDrawingArea::updateRendering):
(WebKit::RemoteLayerTreeDrawingArea::activityStateDidChange):
(WebKit::RemoteLayerTreeDrawingArea::dispatchAfterEnsuringDrawing):
(WebKit::RemoteLayerTreeDrawingArea::setNextRenderingUpdateRequiresSynchronousImageDecoding):
Deleted.
* Source/WebKit/WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::willDestroyDecodedDataForAllImages):
Canonical link: https://commits.webkit.org/305476@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications