Skip to content

Commit

Permalink
Revert 266884@main
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=260566
rdar://114295072

Unreviewed.

It broke drawing with site isolation enabled, and broke several site isolation tests.

* Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.mm:
(WebKit::RemoteLayerTreeDrawingAreaProxy::commitLayerTree):
(WebKit::RemoteLayerTreeDrawingAreaProxy::commitLayerTreeTransaction):
* Source/WebKit/WebProcess/WebPage/DrawingArea.h:
(WebKit::DrawingArea::scheduleRenderingUpdate):
* Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h:
(WebKit::RemoteLayerTreeDrawingArea::displayDidRefreshIsPending const):
* Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm:
(WebKit::RemoteLayerTreeDrawingArea::setRootCompositingLayer):
(WebKit::RemoteLayerTreeDrawingArea::updateGeometry):
(WebKit::RemoteLayerTreeDrawingArea::setLayerTreeStateIsFrozen):
(WebKit::RemoteLayerTreeDrawingArea::forceRepaint):
(WebKit::RemoteLayerTreeDrawingArea::setExposedContentRect):
(WebKit::RemoteLayerTreeDrawingArea::startRenderingUpdateTimer):
(WebKit::RemoteLayerTreeDrawingArea::triggerRenderingUpdate):
(WebKit::RemoteLayerTreeDrawingArea::updateRendering):
(WebKit::RemoteLayerTreeDrawingArea::displayDidRefresh):
(WebKit::RemoteLayerTreeDrawingArea::activityStateDidChange):
(WebKit::RemoteLayerTreeDrawingArea::dispatchAfterEnsuringDrawing):
(WebKit::RemoteLayerTreeDrawingArea::scheduleRenderingUpdateTimerFired):
(WebKit::RemoteLayerTreeDrawingArea::scheduleRenderingUpdate):
* Source/WebKit/WebProcess/WebPage/mac/RemoteLayerTreeDrawingAreaMac.mm:
(WebKit::RemoteLayerTreeDrawingAreaMac::applyTransientZoomToPage):

Canonical link: https://commits.webkit.org/267173@main
  • Loading branch information
achristensen07 committed Aug 23, 2023
1 parent 7f2ea8f commit 8b08522
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 89 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -163,11 +163,6 @@
{
for (auto& transaction : transactions)
commitLayerTreeTransaction(connection, transaction.first, transaction.second);

if (std::exchange(m_commitLayerTreeMessageState, NeedsDisplayDidRefresh) == MissedCommit)
didRefreshDisplay();

scheduleDisplayRefreshCallbacks();
}

void RemoteLayerTreeDrawingAreaProxy::commitLayerTreeTransaction(IPC::Connection& connection, const RemoteLayerTreeTransaction& layerTreeTransaction, const RemoteScrollingCoordinatorTransaction& scrollingTreeTransaction)
Expand Down Expand Up @@ -251,6 +246,13 @@

m_webPageProxy.layerTreeCommitComplete();

if (!layerTreeTransaction.isMainFrameProcessTransaction())
connection.send(Messages::DrawingArea::DisplayDidRefresh(), m_identifier);
else if (std::exchange(m_commitLayerTreeMessageState, NeedsDisplayDidRefresh) == MissedCommit)
didRefreshDisplay();

scheduleDisplayRefreshCallbacks();

if (didUpdateEditorState)
m_webPageProxy.dispatchDidUpdateEditorState();

Expand Down
5 changes: 0 additions & 5 deletions Source/WebKit/WebProcess/WebPage/DrawingArea.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,13 +125,8 @@ class DrawingArea : public IPC::MessageReceiver, public WebCore::DisplayRefreshM
virtual void setRootCompositingLayer(WebCore::Frame&, WebCore::GraphicsLayer*) = 0;
virtual void addRootFrame(WebCore::FrameIdentifier) { }
// FIXME: Add a corresponding removeRootFrame.

// Cause a rendering update to happen as soon as possible.
virtual void triggerRenderingUpdate() = 0;
// Cause a rendering update to happen at the next suitable time,
// as determined by the drawing area.
virtual bool scheduleRenderingUpdate() { return false; }

virtual void renderingUpdateFramesPerSecondChanged() { }

virtual void willStartRenderingUpdateDisplay();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,23 +56,12 @@ class RemoteLayerTreeDrawingArea : public DrawingArea, public WebCore::GraphicsL
TransactionID nextTransactionID() const { return m_currentTransactionID.next(); }
TransactionID lastCommittedTransactionID() const { return m_currentTransactionID; }

bool displayDidRefreshIsPending() const { return m_waitingForBackingStoreSwap; }

protected:
enum class ScheduleRenderingUrgency {
// FIXME: There are many consumers of this (and triggerRenderingUpdate), do they all actually need the ASAP behaviour?
AsSoonAsPossible,
NextSuitableTime,
};
void scheduleRenderingUpdate(ScheduleRenderingUrgency);
void updateRendering();

private:
enum class State {
Idle,
WaitingForDisplayDidRefresh,
WaitingForUpdateRenderingTimer,
WaitingForCallOnMainRunLoop,
WaitingForScheduleRenderingTimer,
};

// DrawingArea
void setNeedsDisplay() override;
void setNeedsDisplayInRect(const WebCore::IntRect&) override;
Expand All @@ -82,11 +71,8 @@ class RemoteLayerTreeDrawingArea : public DrawingArea, public WebCore::GraphicsL
WebCore::GraphicsLayerFactory* graphicsLayerFactory() override;
void setRootCompositingLayer(WebCore::Frame&, WebCore::GraphicsLayer*) override;
void addRootFrame(WebCore::FrameIdentifier) final;
void triggerRenderingUpdate() final;
void triggerRenderingUpdate() override;
bool scheduleRenderingUpdate() final;

void updateRendering();

void renderingUpdateFramesPerSecondChanged() final;
void attachViewOverlayGraphicsLayer(WebCore::FrameIdentifier, WebCore::GraphicsLayer*) override;

Expand Down Expand Up @@ -176,13 +162,14 @@ class RemoteLayerTreeDrawingArea : public DrawingArea, public WebCore::GraphicsL

std::optional<WebCore::FloatRect> m_viewExposedRect;

State m_state { State::Idle };

WebCore::Timer m_updateRenderingTimer;
bool m_isRenderingSuspended { false };
bool m_hasDeferredRenderingUpdate { false };
bool m_inUpdateRendering { false };

bool m_waitingForBackingStoreSwap { false };
bool m_deferredRenderingUpdateWhileWaitingForBackingStoreSwap { false };

OSObjectPtr<dispatch_queue_t> m_commitQueue;
RefPtr<BackingStoreFlusher> m_pendingBackingStoreFlusher;

Expand All @@ -195,8 +182,7 @@ class RemoteLayerTreeDrawingArea : public DrawingArea, public WebCore::GraphicsL
WebCore::Timer m_scheduleRenderingTimer;
std::optional<WebCore::FramesPerSecond> m_preferredFramesPerSecond;
Seconds m_preferredRenderingUpdateInterval;

bool m_updateRenderingIsPending { false };
bool m_isScheduled { false };
};

inline bool RemoteLayerTreeDrawingArea::addMilestonesToDispatch(OptionSet<WebCore::LayoutMilestone> paintMilestones)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@
rootLayer.contentLayer = rootGraphicsLayer;
}
updateRootLayers();
scheduleRenderingUpdate(ScheduleRenderingUrgency::AsSoonAsPossible);
triggerRenderingUpdate();
}

void RemoteLayerTreeDrawingArea::updateGeometry(const IntSize& viewSize, bool flushSynchronously, const WTF::MachSendRight&, CompletionHandler<void()>&& completionHandler)
Expand All @@ -170,7 +170,7 @@
size = contentSize;
}

scheduleRenderingUpdate(ScheduleRenderingUrgency::AsSoonAsPossible);
triggerRenderingUpdate();
completionHandler();
}

Expand Down Expand Up @@ -224,7 +224,7 @@

if (!m_isRenderingSuspended && m_hasDeferredRenderingUpdate) {
m_hasDeferredRenderingUpdate = false;
scheduleRenderingUpdate(ScheduleRenderingUrgency::AsSoonAsPossible);
startRenderingUpdateTimer();
}
}

Expand All @@ -234,7 +234,7 @@
return;

m_webPage.corePage()->forceRepaintAllFrames();
scheduleRenderingUpdate(ScheduleRenderingUrgency::AsSoonAsPossible);
updateRendering();
}

void RemoteLayerTreeDrawingArea::acceleratedAnimationDidStart(WebCore::PlatformLayerIdentifier layerID, const String& key, MonotonicTime startTime)
Expand Down Expand Up @@ -273,23 +273,24 @@
return;

frameView->setExposedContentRect(exposedContentRect);
scheduleRenderingUpdate(ScheduleRenderingUrgency::AsSoonAsPossible);
triggerRenderingUpdate();
}

void RemoteLayerTreeDrawingArea::startRenderingUpdateTimer()
{
RELEASE_ASSERT(m_state != State::WaitingForDisplayDidRefresh);
if (m_updateRenderingTimer.isActive()) {
RELEASE_ASSERT(m_state == State::WaitingForUpdateRenderingTimer);
if (m_updateRenderingTimer.isActive())
return;
}
m_state = State::WaitingForUpdateRenderingTimer;
m_updateRenderingTimer.startOneShot(0_s);
}

void RemoteLayerTreeDrawingArea::triggerRenderingUpdate()
{
scheduleRenderingUpdate(ScheduleRenderingUrgency::AsSoonAsPossible);
if (m_isRenderingSuspended) {
m_hasDeferredRenderingUpdate = true;
return;
}

startRenderingUpdateTimer();
}

void RemoteLayerTreeDrawingArea::setNextRenderingUpdateRequiresSynchronousImageDecoding()
Expand All @@ -299,24 +300,23 @@

void RemoteLayerTreeDrawingArea::updateRendering()
{
RELEASE_ASSERT(m_updateRenderingIsPending);
RELEASE_ASSERT(m_state == State::WaitingForUpdateRenderingTimer);
m_updateRenderingIsPending = false;

if (m_isRenderingSuspended) {
m_hasDeferredRenderingUpdate = true;
return;
}

if (m_waitingForBackingStoreSwap) {
m_deferredRenderingUpdateWhileWaitingForBackingStoreSwap = true;
return;
}

// This function is not reentrant, e.g. a rAF callback may force repaint.
RELEASE_ASSERT(!m_inUpdateRendering);
if (m_inUpdateRendering)
return;

if (auto* page = m_webPage.corePage(); page && !page->rootFrames().computeSize())
return;

RELEASE_ASSERT(!m_updateRenderingTimer.isActive());
m_state = State::WaitingForDisplayDidRefresh;

scaleViewToFitDocumentIfNeeded();

SetForScope change(m_inUpdateRendering, true);
Expand Down Expand Up @@ -371,6 +371,8 @@

willCommitLayerTree(layerTransaction);

m_waitingForBackingStoreSwap = true;

send(Messages::RemoteLayerTreeDrawingAreaProxy::WillCommitLayerTree(layerTransaction.transactionID()));

RemoteScrollingCoordinatorTransaction scrollingTransaction;
Expand Down Expand Up @@ -421,18 +423,20 @@
// FIXME: This should use a counted replacement for setLayerTreeStateIsFrozen, but
// the callers of that function are not strictly paired.

RELEASE_ASSERT(m_state == State::WaitingForDisplayDidRefresh);
auto wasWaitingForBackingStoreSwap = std::exchange(m_waitingForBackingStoreSwap, false);

if (!WebProcess::singleton().shouldUseRemoteRenderingFor(WebCore::RenderingPurpose::DOM)) {
// This empty transaction serves to trigger CA's garbage collection of IOSurfaces. See <rdar://problem/16110687>
[CATransaction begin];
[CATransaction commit];
}

m_state = State::Idle;
RELEASE_ASSERT(!m_updateRenderingTimer.isActive());
if (m_updateRenderingIsPending && !m_scheduleRenderingTimer.isActive())
startRenderingUpdateTimer();
if (m_deferredRenderingUpdateWhileWaitingForBackingStoreSwap || (m_isScheduled && !m_scheduleRenderingTimer.isActive())) {
triggerRenderingUpdate();
m_deferredRenderingUpdateWhileWaitingForBackingStoreSwap = false;
m_isScheduled = false;
} else if (wasWaitingForBackingStoreSwap && m_updateRenderingTimer.isActive())
m_deferredRenderingUpdateWhileWaitingForBackingStoreSwap = true;
else
send(Messages::RemoteLayerTreeDrawingAreaProxy::CommitLayerTreeNotTriggered(nextTransactionID()));
}
Expand Down Expand Up @@ -494,7 +498,7 @@
if (activityStateChangeID != ActivityStateChangeAsynchronous) {
m_remoteLayerTreeContext->setNextRenderingUpdateRequiresSynchronousImageDecoding();
m_activityStateChangeID = activityStateChangeID;
scheduleRenderingUpdate(ScheduleRenderingUrgency::AsSoonAsPossible);
startRenderingUpdateTimer();
}

// FIXME: We may want to match behavior in TiledCoreAnimationDrawingArea by firing these callbacks after the next compositing flush, rather than immediately after
Expand All @@ -509,7 +513,7 @@
m_remoteLayerTreeContext->setNextRenderingUpdateRequiresSynchronousImageDecoding();

m_pendingCallbackIDs.append(callbackID);
scheduleRenderingUpdate(ScheduleRenderingUrgency::AsSoonAsPossible);
triggerRenderingUpdate();
}

void RemoteLayerTreeDrawingArea::adoptLayersFromDrawingArea(DrawingArea& oldDrawingArea)
Expand All @@ -523,45 +527,32 @@

void RemoteLayerTreeDrawingArea::scheduleRenderingUpdateTimerFired()
{
if (m_state == State::WaitingForScheduleRenderingTimer)
startRenderingUpdateTimer();
triggerRenderingUpdate();
m_isScheduled = false;
}

void RemoteLayerTreeDrawingArea::scheduleRenderingUpdate(ScheduleRenderingUrgency urgency)
bool RemoteLayerTreeDrawingArea::scheduleRenderingUpdate()
{
if (m_updateRenderingIsPending && urgency != ScheduleRenderingUrgency::AsSoonAsPossible)
return;
if (m_isScheduled)
return true;

tracePoint(RemoteLayerTreeScheduleRenderingUpdate, m_state == State::WaitingForDisplayDidRefresh);
tracePoint(RemoteLayerTreeScheduleRenderingUpdate, m_waitingForBackingStoreSwap);

m_updateRenderingIsPending = true;
m_isScheduled = true;

if (m_preferredFramesPerSecond) {
if (m_state == State::WaitingForDisplayDidRefresh)
return;

if (urgency == ScheduleRenderingUrgency::AsSoonAsPossible)
startRenderingUpdateTimer();
else {
m_state = State::WaitingForCallOnMainRunLoop;
callOnMainRunLoop([self = WeakPtr { this }] () {
// It's possible that an ASAP request got ahead of this
// and started a rendering update already and we're no
// longer waiting for this callback.
if (self && self->m_state == State::WaitingForCallOnMainRunLoop)
self->startRenderingUpdateTimer();
});
}
} else if (m_state == State::Idle || m_state == State::WaitingForDisplayDidRefresh) {
ASSERT(!m_scheduleRenderingTimer.isActive());
m_state = State::WaitingForScheduleRenderingTimer;
if (displayDidRefreshIsPending())
return true;

callOnMainRunLoop([self = WeakPtr { this }] () {
if (self) {
self->m_isScheduled = false;
self->triggerRenderingUpdate();
}
});
} else
m_scheduleRenderingTimer.startOneShot(m_preferredRenderingUpdateInterval);
}
}

bool RemoteLayerTreeDrawingArea::scheduleRenderingUpdate()
{
scheduleRenderingUpdate(ScheduleRenderingUrgency::NextSuitableTime);
return true;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@
FloatRect unobscuredContentRect = frameView->unobscuredContentRectIncludingScrollbars();
unscrolledOrigin.moveBy(-unobscuredContentRect.location());
m_webPage.scalePage(scale / m_webPage.viewScaleFactor(), roundedIntPoint(-unscrolledOrigin));
scheduleRenderingUpdate(ScheduleRenderingUrgency::AsSoonAsPossible);
updateRendering();
}

void RemoteLayerTreeDrawingAreaMac::adjustTransientZoom(double scale, WebCore::FloatPoint origin)
Expand Down

0 comments on commit 8b08522

Please sign in to comment.