Skip to content

Commit

Permalink
[GTK][WPE] Main thread can't start rendering the next frame until the…
Browse files Browse the repository at this point in the history
… previous one is composited

https://bugs.webkit.org/show_bug.cgi?id=273317

Reviewed by Carlos Garcia Campos.

All the content rendered by the main thread is sent to the compositor thread
using commitSceneState, which adds a requestID parameter. The compositor will
send in the didRenderFrame call the last requestID it processed. This way
the LayerTreeHost can check whether each request was composed to allow
rendering new frames.

* Source/WebKit/Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.cpp:
(WebKit::ThreadedCompositor::renderLayerTree):
(WebKit::ThreadedCompositor::updateSceneState):
* Source/WebKit/Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.h:
* Source/WebKit/WebProcess/WebPage/CoordinatedGraphics/CompositingCoordinator.cpp:
(WebKit::CompositingCoordinator::flushPendingLayerChanges):
* Source/WebKit/WebProcess/WebPage/CoordinatedGraphics/LayerTreeHost.cpp:
(WebKit::LayerTreeHost::commitSceneState):
(WebKit::LayerTreeHost::didRenderFrame):
(WebKit::LayerTreeHost::didRenderFrameTimerFired):
* Source/WebKit/WebProcess/WebPage/CoordinatedGraphics/LayerTreeHost.h:

Canonical link: https://commits.webkit.org/278399@main
  • Loading branch information
magomez committed May 6, 2024
1 parent cb597b1 commit 9191148
Show file tree
Hide file tree
Showing 5 changed files with 20 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,7 @@ void ThreadedCompositor::renderLayerTree()
WebCore::IntPoint scrollPosition;
float scaleFactor;
bool needsResize;
uint32_t compositionRequestID;

Vector<RefPtr<Nicosia::Scene>> states;

Expand All @@ -241,6 +242,7 @@ void ThreadedCompositor::renderLayerTree()
scrollPosition = m_attributes.scrollPosition;
scaleFactor = m_attributes.scaleFactor;
needsResize = m_attributes.needsResize;
compositionRequestID = m_attributes.compositionRequestID;

states = WTFMove(m_attributes.states);

Expand Down Expand Up @@ -278,7 +280,7 @@ void ThreadedCompositor::renderLayerTree()
m_context->swapBuffers();

if (m_scene->isActive())
m_client.didRenderFrame();
m_client.didRenderFrame(compositionRequestID);
}

void ThreadedCompositor::sceneUpdateFinished()
Expand Down Expand Up @@ -310,10 +312,12 @@ void ThreadedCompositor::sceneUpdateFinished()
m_compositingRunLoop->updateCompleted(stateLocker);
}

void ThreadedCompositor::updateSceneState(const RefPtr<Nicosia::Scene>& state)
void ThreadedCompositor::updateSceneState(const RefPtr<Nicosia::Scene>& state, uint32_t compositionRequestID)
{
Locker locker { m_attributes.lock };
m_attributes.states.append(state);
if (state)
m_attributes.states.append(state);
m_attributes.compositionRequestID = compositionRequestID;
m_compositingRunLoop->scheduleUpdate();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ class ThreadedCompositor : public CoordinatedGraphicsSceneClient, public ThreadS
virtual void resize(const WebCore::IntSize&) = 0;
virtual void willRenderFrame() = 0;
virtual void clearIfNeeded() = 0;
virtual void didRenderFrame() = 0;
virtual void didRenderFrame(uint32_t) = 0;
virtual void displayDidRefresh(WebCore::PlatformDisplayID) = 0;
};

Expand All @@ -71,7 +71,7 @@ class ThreadedCompositor : public CoordinatedGraphicsSceneClient, public ThreadS
void setScrollPosition(const WebCore::IntPoint&, float scale);
void setViewportSize(const WebCore::IntSize&, float scale);

void updateSceneState(const RefPtr<Nicosia::Scene>&);
void updateSceneState(const RefPtr<Nicosia::Scene>&, uint32_t);
void updateScene();
void updateSceneWithoutRendering();

Expand Down Expand Up @@ -128,6 +128,7 @@ class ThreadedCompositor : public CoordinatedGraphicsSceneClient, public ThreadS
Vector<RefPtr<Nicosia::Scene>> states;

bool clientRendersNextFrame { false };
uint32_t compositionRequestID { 0 };
} m_attributes;

#if !HAVE(DISPLAY_LINK)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ bool CompositingCoordinator::flushPendingLayerChanges(OptionSet<FinalizeRenderin
}
#if HAVE(DISPLAY_LINK)
else
m_client.updateScene();
m_client.commitSceneState(nullptr);
#endif

m_page.didUpdateRendering();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -355,7 +355,7 @@ void LayerTreeHost::didFlushRootLayer(const FloatRect& visibleContentRect)
void LayerTreeHost::commitSceneState(const RefPtr<Nicosia::Scene>& state)
{
m_isWaitingForRenderer = true;
m_compositor->updateSceneState(state);
m_compositor->updateSceneState(state, ++m_compositionRequestID);
}

void LayerTreeHost::updateScene()
Expand Down Expand Up @@ -408,10 +408,11 @@ void LayerTreeHost::clearIfNeeded()
m_surface->clearIfNeeded();
}

void LayerTreeHost::didRenderFrame()
void LayerTreeHost::didRenderFrame(uint32_t compositionResponseID)
{
m_surface->didRenderFrame();
#if HAVE(DISPLAY_LINK)
m_compositionResponseID = compositionResponseID;
if (!m_didRenderFrameTimer.isActive())
m_didRenderFrameTimer.startOneShot(0_s);
#endif
Expand All @@ -424,7 +425,8 @@ void LayerTreeHost::didRenderFrame()
#if HAVE(DISPLAY_LINK)
void LayerTreeHost::didRenderFrameTimerFired()
{
renderNextFrame(false);
if (!m_isWaitingForRenderer || (m_isWaitingForRenderer && m_compositionRequestID == m_compositionResponseID))
renderNextFrame(false);
}
#endif

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ class LayerTreeHost
void resize(const WebCore::IntSize&) override;
void willRenderFrame() override;
void clearIfNeeded() override;
void didRenderFrame() override;
void didRenderFrame(uint32_t) override;
void displayDidRefresh(WebCore::PlatformDisplayID) override;

#if !HAVE(DISPLAY_LINK)
Expand Down Expand Up @@ -189,6 +189,9 @@ class LayerTreeHost
double m_transientZoomScale { 1 };
WebCore::FloatPoint m_transientZoomOrigin;
#endif

uint32_t m_compositionRequestID { 0 };
uint32_t m_compositionResponseID { 0 };
};

#if !USE(COORDINATED_GRAPHICS)
Expand Down

0 comments on commit 9191148

Please sign in to comment.