From c56b10b194fbc0310631c1ca637b3682bee71683 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Thu, 6 Aug 2026 12:13:02 +1000 Subject: [PATCH] [idd] scheduler: detect high-rate cadence breaks Keep the client schedule floor at 2 ms while accepting shorter guest frame intervals for cadence tracking. This lets sources above 500 Hz trigger immediate final-frame delivery when their cadence breaks. --- idd/LGIdd/CFrameScheduler.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/idd/LGIdd/CFrameScheduler.cpp b/idd/LGIdd/CFrameScheduler.cpp index 45a2126e..e5c9fb66 100644 --- a/idd/LGIdd/CFrameScheduler.cpp +++ b/idd/LGIdd/CFrameScheduler.cpp @@ -22,13 +22,14 @@ #include "CDebug.h" -static const uint64_t MIN_PERIOD_NS = 2000000ULL; -static const uint64_t MAX_PERIOD_NS = 1000000000ULL; -static const uint32_t MIN_LEASE_MS = 100; -static const uint32_t MAX_LEASE_MS = 5000; -static const uint64_t MIN_SAFETY_NS = 250000ULL; -static const uint64_t LOG_INTERVAL_NS = 5000000000ULL; -static const uint64_t CADENCE_BREAK = 4; +static const uint64_t MIN_SOURCE_PERIOD_NS = 100000ULL; +static const uint64_t MIN_SCHEDULE_PERIOD_NS = 2000000ULL; +static const uint64_t MAX_PERIOD_NS = 1000000000ULL; +static const uint32_t MIN_LEASE_MS = 100; +static const uint32_t MAX_LEASE_MS = 5000; +static const uint64_t MIN_SAFETY_NS = 250000ULL; +static const uint64_t LOG_INTERVAL_NS = 5000000000ULL; +static const uint64_t CADENCE_BREAK = 4; CFrameScheduler::CFrameScheduler() { @@ -310,7 +311,7 @@ bool CFrameScheduler::UpdateSchedule(uint32_t sourceClientID, } if (!(schedule.flags & KVMFR_FRAME_SCHEDULE_ACTIVE) || - schedule.period < MIN_PERIOD_NS || + schedule.period < MIN_SCHEDULE_PERIOD_NS || schedule.period > MAX_PERIOD_NS || schedule.targetSlack >= schedule.period || schedule.phaseError > static_cast(schedule.period) || @@ -456,7 +457,8 @@ void CFrameScheduler::ObserveFrame(uint64_t now) m_guestPeriod = 0; m_forceNext = true; } - else if (interval >= MIN_PERIOD_NS && interval <= MAX_PERIOD_NS) + else if (interval >= MIN_SOURCE_PERIOD_NS && + interval <= MAX_PERIOD_NS) { if (!m_guestPeriod) m_guestPeriod = interval;