renderer: send one more frame on new_renderer

send one more frame to clients on new_renderer when we arent rendering
at frame.
This commit is contained in:
Tom Englund 2025-10-12 18:32:31 +02:00
parent 1146490857
commit 21bf47b7b3
3 changed files with 7 additions and 3 deletions

View file

@ -31,6 +31,10 @@ void CMonitorFrameScheduler::onSyncFired() {
Debug::log(TRACE, "CMonitorFrameScheduler: {} -> onSyncFired, missed.", m_monitor->m_name);
// let clients know its a good time to render yet another frame
if (!m_monitor->isMirror())
g_pHyprRenderer->sendFrameEventsToMonitor(m_monitor.lock(), Time::steadyNow());
// we are out. The frame is taking too long to render. Begin rendering immediately, but don't commit yet.
m_pendingThird = true;
m_renderAtFrame = false; // block frame rendering, we already scheduled
@ -51,7 +55,7 @@ void CMonitorFrameScheduler::onSyncFired() {
void CMonitorFrameScheduler::onPresented(const Time::steady_tp& when) {
if (!m_monitor->isMirror())
g_pHyprRenderer->sendFrameEventsMonitor(m_monitor.lock(), when);
g_pHyprRenderer->sendFrameEventsToMonitor(m_monitor.lock(), when);
if (!newSchedulingEnabled())
return;

View file

@ -1631,7 +1631,7 @@ void CHyprRenderer::renderWorkspace(PHLMONITOR pMonitor, PHLWORKSPACE pWorkspace
renderAllClientsForWorkspace(pMonitor, pWorkspace, now, translate, scale);
}
void CHyprRenderer::sendFrameEventsMonitor(PHLMONITOR pMonitor, const Time::steady_tp& when) {
void CHyprRenderer::sendFrameEventsToMonitor(PHLMONITOR pMonitor, const Time::steady_tp& when) {
auto sendFrame = [](const auto& w, const auto& when) {
w->m_wlSurface->resource()->breadthfirst([when](SP<CWLSurfaceResource> r, const Vector2D& offset, void* d) { r->frame(when); }, nullptr);

View file

@ -127,7 +127,7 @@ class CHyprRenderer {
void renderSessionLockSurface(WP<SSessionLockSurface>, PHLMONITOR, const Time::steady_tp&);
void renderDragIcon(PHLMONITOR, const Time::steady_tp&);
void renderIMEPopup(CInputPopup*, PHLMONITOR, const Time::steady_tp&);
void sendFrameEventsMonitor(PHLMONITOR pMonitor, const Time::steady_tp& now); // sends frame displayed events but doesn't actually render anything
void sendFrameEventsToMonitor(PHLMONITOR pMonitor, const Time::steady_tp& now); // sends frame displayed events but doesn't actually render anything
void renderSessionLockPrimer(PHLMONITOR pMonitor);
void renderSessionLockMissing(PHLMONITOR pMonitor);
void renderBackground(PHLMONITOR pMonitor);