Skip to content

Commit

Permalink
Cherry-pick fa67a26. rdar://problem/110174274
Browse files Browse the repository at this point in the history
    Schedule rendering via RemoteLayerTreeDrawingArea directly, rather than using a 'fake' DisplayRefreshMonitor.
    https://bugs.webkit.org/show_bug.cgi?id=257290
    <rdar://problem/109953504>

    Reviewed by Simon Fraser.

    RemoteLayerTreeDisplayRefreshMonitor is mostly just a wrapper around asking the RemoteLayerTreeDrawingArea to schedule when it wants to display next.
    This is specific to that drawing area, and can be throttled if the drawing area is failing to commit layer trees as fast as expected.

    DisplayRefreshMonitorManager caches DisplayRefreshMonitors, and shares them between all WebCore::Page/RenderingUpdateSchedulers on the same Display.
    This means if we have multiple RemoteLayerTreeDrawingAreas on the same display (and in the same process), we'll be sharing a single RemoteLayerTreeDisplayRefreshMonitor, driven at the effective rate of one of the drawing areas.

    If the first drawing area is trying to hit full frame rate, but rendering takes too long, it'll run at the fastest rate it can manage. Any other drawing areas that are using the shared display refresh
    monitor will then be throttled to that same rate, even if they could otherwise run at full speed.

    DrawingAreaCoordinatedGraphics is currently working around this by synthesizing a DisplayID for each drawing area, to prevent DisplayRefreshMonitor sharing.

    This change makes WebChromeClient pass the scheduleRenderingUpdate request onto RemoteLayerTreeDrawingArea directly, so we can avoid falling back to the RenderingUpdateScheduler/DisplayRefreshMonitor implementation.

    RemoteLayerTreeDisplayRefreshMonitor is removed, since it should never be used.

    * Source/WebCore/page/ChromeClient.h:
    (WebCore::ChromeClient::renderingUpdateFrequencyChanged):
    * Source/WebCore/page/Page.cpp:
    (WebCore::Page::windowScreenDidChange):
    (WebCore::Page::triggerRenderingUpdateForTesting):
    (WebCore::Page::timelineControllerMaximumAnimationFrameRateDidChange):
    (WebCore::Page::setIsVisuallyIdleInternal):
    (WebCore::Page::handleLowModePowerChange):
    * Source/WebCore/page/Page.h:
    * Source/WebCore/page/RenderingUpdateScheduler.cpp:
    (WebCore::RenderingUpdateScheduler::triggerRenderingUpdateForTesting): Deleted.
    * Source/WebCore/page/RenderingUpdateScheduler.h:
    * Source/WebKit/SourcesCocoa.txt:
    * Source/WebKit/WebKit.xcodeproj/project.pbxproj:
    * Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp:
    (WebKit::WebChromeClient::scheduleRenderingUpdate):
    (WebKit::WebChromeClient::renderingUpdateFrequencyChanged):
    * Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.h:
    * Source/WebKit/WebProcess/WebPage/DrawingArea.h:
    (WebKit::DrawingArea::scheduleRenderingUpdate):
    (WebKit::DrawingArea::renderingUpdateFrequencyChanged):
    * Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDisplayRefreshMonitor.h: Removed.
    * Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDisplayRefreshMonitor.mm: Removed.
    * Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h:
    * Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm:
    (WebKit::RemoteLayerTreeDrawingArea::RemoteLayerTreeDrawingArea):
    (WebKit::RemoteLayerTreeDrawingArea::createDisplayRefreshMonitor):
    (WebKit::RemoteLayerTreeDrawingArea::displayDidRefresh):
    (WebKit::RemoteLayerTreeDrawingArea::scheduleRenderingUpdate):
    (WebKit::RemoteLayerTreeDrawingArea::renderingUpdateFrequencyChanged):
    (WebKit::RemoteLayerTreeDrawingArea::willDestroyDisplayRefreshMonitor): Deleted.
    (WebKit::RemoteLayerTreeDrawingArea::adoptDisplayRefreshMonitorsFromDrawingArea): Deleted.

    Canonical link: https://commits.webkit.org/264920@main

Identifier: 263322.1543@safari-7616.1.17-branch
  • Loading branch information
mattwoodrow authored and MyahCobbs committed Jun 8, 2023
1 parent 357fffd commit 918db9d
Show file tree
Hide file tree
Showing 14 changed files with 100 additions and 245 deletions.
1 change: 1 addition & 0 deletions Source/WebCore/page/ChromeClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,7 @@ class ChromeClient {
virtual void triggerRenderingUpdate() = 0;
// Schedule a rendering update that coordinates with display refresh. Returns true if scheduled. (This is only used by SVGImageChromeClient.)
virtual bool scheduleRenderingUpdate() { return false; }
virtual void renderingUpdateFramesPerSecondChanged() { }

virtual unsigned remoteImagesCountForTesting() const { return 0; }

Expand Down
23 changes: 18 additions & 5 deletions Source/WebCore/page/Page.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1411,7 +1411,9 @@ void Page::windowScreenDidChange(PlatformDisplayID displayID, std::optional<Fram
if (m_scrollingCoordinator)
m_scrollingCoordinator->windowScreenDidChange(displayID, m_displayNominalFramesPerSecond);

renderingUpdateScheduler().windowScreenDidChange(displayID);
if (auto *scheduler = existingRenderingUpdateScheduler())
scheduler->windowScreenDidChange(displayID);
chrome().client().renderingUpdateFramesPerSecondChanged();

setNeedsRecalcStyleInAllFrames();
}
Expand Down Expand Up @@ -1694,7 +1696,7 @@ void Page::computeUnfulfilledRenderingSteps(OptionSet<RenderingUpdateStep> reque
void Page::triggerRenderingUpdateForTesting()
{
LOG_WITH_STREAM(EventLoop, stream << "Page " << this << " triggerRenderingUpdateForTesting()");
renderingUpdateScheduler().triggerRenderingUpdateForTesting();
chrome().client().triggerRenderingUpdate();
}

void Page::startTrackingRenderingUpdates()
Expand Down Expand Up @@ -2160,7 +2162,9 @@ void Page::resumeScriptedAnimations()

void Page::timelineControllerMaximumAnimationFrameRateDidChange(DocumentTimelinesController&)
{
renderingUpdateScheduler().adjustRenderingUpdateFrequency();
if (auto *scheduler = existingRenderingUpdateScheduler())
scheduler->adjustRenderingUpdateFrequency();
chrome().client().renderingUpdateFramesPerSecondChanged();
}

std::optional<FramesPerSecond> Page::preferredRenderingUpdateFramesPerSecond(OptionSet<PreferredRenderingUpdateOption> flags) const
Expand Down Expand Up @@ -2207,7 +2211,9 @@ void Page::setIsVisuallyIdleInternal(bool isVisuallyIdle)
return;

m_throttlingReasons.set(ThrottlingReason::VisuallyIdle, isVisuallyIdle);
renderingUpdateScheduler().adjustRenderingUpdateFrequency();
if (auto *scheduler = existingRenderingUpdateScheduler())
scheduler->adjustRenderingUpdateFrequency();
chrome().client().renderingUpdateFramesPerSecondChanged();
}

void Page::handleLowModePowerChange(bool isLowPowerModeEnabled)
Expand All @@ -2219,7 +2225,9 @@ void Page::handleLowModePowerChange(bool isLowPowerModeEnabled)
return;

m_throttlingReasons.set(ThrottlingReason::LowPowerMode, isLowPowerModeEnabled);
renderingUpdateScheduler().adjustRenderingUpdateFrequency();
if (auto *scheduler = existingRenderingUpdateScheduler())
scheduler->adjustRenderingUpdateFrequency();
chrome().client().renderingUpdateFramesPerSecondChanged();

updateDOMTimerAlignmentInterval();
}
Expand Down Expand Up @@ -3753,6 +3761,11 @@ RenderingUpdateScheduler& Page::renderingUpdateScheduler()
return *m_renderingUpdateScheduler;
}

RenderingUpdateScheduler* Page::existingRenderingUpdateScheduler()
{
return m_renderingUpdateScheduler.get();
}

void Page::forEachDocumentFromMainFrame(const LocalFrame& mainFrame, const Function<void(Document&)>& functor)
{
Vector<Ref<Document>> documents;
Expand Down
5 changes: 3 additions & 2 deletions Source/WebCore/page/Page.h
Original file line number Diff line number Diff line change
Expand Up @@ -510,8 +510,8 @@ class Page : public Supplementable<Page>, public CanMakeWeakPtr<Page> {
IncludeAnimationsFrameRate = 1 << 1
};
static constexpr OptionSet<PreferredRenderingUpdateOption> allPreferredRenderingUpdateOptions = { PreferredRenderingUpdateOption::IncludeThrottlingReasons, PreferredRenderingUpdateOption::IncludeAnimationsFrameRate };
std::optional<FramesPerSecond> preferredRenderingUpdateFramesPerSecond(OptionSet<PreferredRenderingUpdateOption> = allPreferredRenderingUpdateOptions) const;
Seconds preferredRenderingUpdateInterval() const;
WEBCORE_EXPORT std::optional<FramesPerSecond> preferredRenderingUpdateFramesPerSecond(OptionSet<PreferredRenderingUpdateOption> = allPreferredRenderingUpdateOptions) const;
WEBCORE_EXPORT Seconds preferredRenderingUpdateInterval() const;

float topContentInset() const { return m_topContentInset; }
WEBCORE_EXPORT void setTopContentInset(float);
Expand Down Expand Up @@ -1098,6 +1098,7 @@ class Page : public Supplementable<Page>, public CanMakeWeakPtr<Page> {
void prioritizeVisibleResources();

RenderingUpdateScheduler& renderingUpdateScheduler();
RenderingUpdateScheduler* existingRenderingUpdateScheduler();

WheelEventTestMonitor& ensureWheelEventTestMonitor();

Expand Down
5 changes: 0 additions & 5 deletions Source/WebCore/page/RenderingUpdateScheduler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -138,11 +138,6 @@ void RenderingUpdateScheduler::displayRefreshFired()
}
}

void RenderingUpdateScheduler::triggerRenderingUpdateForTesting()
{
triggerRenderingUpdate();
}

void RenderingUpdateScheduler::triggerRenderingUpdate()
{
m_page.chrome().client().triggerRenderingUpdate();
Expand Down
2 changes: 0 additions & 2 deletions Source/WebCore/page/RenderingUpdateScheduler.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,6 @@ class RenderingUpdateScheduler final : public DisplayRefreshMonitorClient {
void adjustRenderingUpdateFrequency();
void scheduleRenderingUpdate();

void triggerRenderingUpdateForTesting();

void windowScreenDidChange(PlatformDisplayID);

private:
Expand Down
1 change: 0 additions & 1 deletion Source/WebKit/SourcesCocoa.txt
Original file line number Diff line number Diff line change
Expand Up @@ -712,7 +712,6 @@ WebProcess/WebPage/RemoteLayerTree/PlatformCALayerRemoteHost.mm
WebProcess/WebPage/RemoteLayerTree/PlatformCALayerRemoteModelHosting.mm
WebProcess/WebPage/RemoteLayerTree/PlatformCALayerRemoteTiledBacking.cpp
WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeContext.mm
WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDisplayRefreshMonitor.mm
WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm @no-unify
WebProcess/WebPage/RemoteLayerTree/RemoteScrollbarsController.mm
WebProcess/WebPage/RemoteLayerTree/RemoteScrollingCoordinator.mm
Expand Down
6 changes: 0 additions & 6 deletions Source/WebKit/WebKit.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -657,7 +657,6 @@
2D1E8223216FFF5100A15265 /* WKWebEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D1E8221216FFF5000A15265 /* WKWebEvent.h */; };
2D279E1926955768004B3EEB /* PrototypeToolsSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D279E1826955768004B3EEB /* PrototypeToolsSPI.h */; };
2D28A4971AF965A100F190C9 /* WKViewLayoutStrategy.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D28A4951AF965A100F190C9 /* WKViewLayoutStrategy.h */; };
2D29ECD0192F2C2E00984B78 /* RemoteLayerTreeDisplayRefreshMonitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D29ECCE192F2C2E00984B78 /* RemoteLayerTreeDisplayRefreshMonitor.h */; };
2D3A65DB1A7C3A1F00CAC637 /* WKNavigationActionRef.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D3A65D91A7C3A1F00CAC637 /* WKNavigationActionRef.h */; settings = {ATTRIBUTES = (Private, ); }; };
2D3A65DF1A7C3A7D00CAC637 /* WKNavigationResponseRef.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D3A65DD1A7C3A7D00CAC637 /* WKNavigationResponseRef.h */; settings = {ATTRIBUTES = (Private, ); }; };
2D3A65E31A7C3A9300CAC637 /* WKNavigationRef.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D3A65E11A7C3A9300CAC637 /* WKNavigationRef.h */; settings = {ATTRIBUTES = (Private, ); }; };
Expand Down Expand Up @@ -3907,8 +3906,6 @@
2D28F3E01885CCC1004B9EAE /* WebChromeClientIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = WebChromeClientIOS.mm; path = ios/WebChromeClientIOS.mm; sourceTree = "<group>"; };
2D28F3E21885CCC1004B9EAE /* WebEditorClientIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = WebEditorClientIOS.mm; path = ios/WebEditorClientIOS.mm; sourceTree = "<group>"; };
2D28F3E31885CCC1004B9EAE /* WebLocalFrameLoaderClientIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = WebLocalFrameLoaderClientIOS.mm; path = ios/WebLocalFrameLoaderClientIOS.mm; sourceTree = "<group>"; };
2D29ECCE192F2C2E00984B78 /* RemoteLayerTreeDisplayRefreshMonitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemoteLayerTreeDisplayRefreshMonitor.h; sourceTree = "<group>"; };
2D29ECCF192F2C2E00984B78 /* RemoteLayerTreeDisplayRefreshMonitor.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RemoteLayerTreeDisplayRefreshMonitor.mm; sourceTree = "<group>"; };
2D2ADF021636243500197E47 /* PDFPluginAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PDFPluginAnnotation.h; path = PDF/PDFPluginAnnotation.h; sourceTree = "<group>"; };
2D2ADF031636243500197E47 /* PDFPluginAnnotation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = PDFPluginAnnotation.mm; path = PDF/PDFPluginAnnotation.mm; sourceTree = "<group>"; };
2D2ADF0516362DC700197E47 /* PDFPluginTextAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PDFPluginTextAnnotation.h; path = PDF/PDFPluginTextAnnotation.h; sourceTree = "<group>"; };
Expand Down Expand Up @@ -9097,8 +9094,6 @@
2D8949EF182044F600E898AA /* PlatformCALayerRemoteTiledBacking.h */,
1AB16AE8164B3A8800290D62 /* RemoteLayerTreeContext.h */,
1AB16AE7164B3A8800290D62 /* RemoteLayerTreeContext.mm */,
2D29ECCE192F2C2E00984B78 /* RemoteLayerTreeDisplayRefreshMonitor.h */,
2D29ECCF192F2C2E00984B78 /* RemoteLayerTreeDisplayRefreshMonitor.mm */,
1AB16ADC1648598400290D62 /* RemoteLayerTreeDrawingArea.h */,
1AB16ADB1648598400290D62 /* RemoteLayerTreeDrawingArea.mm */,
1AC009E229E0E28B00E696C4 /* RemoteScrollbarsController.h */,
Expand Down Expand Up @@ -14606,7 +14601,6 @@
2D47B56D1810714E003A3AEE /* RemoteLayerBackingStore.h in Headers */,
2DDF731518E95060004F5A66 /* RemoteLayerBackingStoreCollection.h in Headers */,
1AB16AEA164B3A8800290D62 /* RemoteLayerTreeContext.h in Headers */,
2D29ECD0192F2C2E00984B78 /* RemoteLayerTreeDisplayRefreshMonitor.h in Headers */,
1AB16ADE1648598400290D62 /* RemoteLayerTreeDrawingArea.h in Headers */,
1AB16AE21648656D00290D62 /* RemoteLayerTreeDrawingAreaProxy.h in Headers */,
0FF24A2E1879E4BC003ABF0C /* RemoteLayerTreeDrawingAreaProxyMessages.h in Headers */,
Expand Down
13 changes: 13 additions & 0 deletions Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1063,6 +1063,19 @@ void WebChromeClient::triggerRenderingUpdate()
m_page.drawingArea()->triggerRenderingUpdate();
}

bool WebChromeClient::scheduleRenderingUpdate()
{
if (m_page.drawingArea())
return m_page.drawingArea()->scheduleRenderingUpdate();
return false;
}

void WebChromeClient::renderingUpdateFramesPerSecondChanged()
{
if (m_page.drawingArea())
m_page.drawingArea()->renderingUpdateFramesPerSecondChanged();
}

unsigned WebChromeClient::remoteImagesCountForTesting() const
{
return m_page.remoteImagesCountForTesting();
Expand Down
2 changes: 2 additions & 0 deletions Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,8 @@ class WebChromeClient final : public WebCore::ChromeClient {
void setNeedsOneShotDrawingSynchronization() final;
bool shouldTriggerRenderingUpdate(unsigned rescheduledRenderingUpdateCount) const final;
void triggerRenderingUpdate() final;
bool scheduleRenderingUpdate() final;
void renderingUpdateFramesPerSecondChanged() final;
unsigned remoteImagesCountForTesting() const final;

void contentRuleListNotification(const URL&, const WebCore::ContentRuleListResults&) final;
Expand Down
2 changes: 2 additions & 0 deletions Source/WebKit/WebProcess/WebPage/DrawingArea.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,8 @@ class DrawingArea : public IPC::MessageReceiver, public WebCore::DisplayRefreshM
virtual void addRootFrame(WebCore::FrameIdentifier) { }
// FIXME: Add a corresponding removeRootFrame.
virtual void triggerRenderingUpdate() = 0;
virtual bool scheduleRenderingUpdate() { return false; }
virtual void renderingUpdateFramesPerSecondChanged() { }

virtual void willStartRenderingUpdateDisplay();
virtual void didCompleteRenderingUpdateDisplay();
Expand Down

This file was deleted.

This file was deleted.

Loading

0 comments on commit 918db9d

Please sign in to comment.