Clock updates

This commit is contained in:
Aiden
2026-05-12 21:44:26 +10:00
parent 5c66cfdc64
commit 3a83d9617f
9 changed files with 131 additions and 12 deletions

View File

@@ -60,6 +60,27 @@ void TestLatePollRecordsSkippedFrames()
Expect(cadence.SkippedFrameCount() == 3, "late poll accumulates skipped frames");
}
void TestLatePollSkipsMissedIntervalsInsteadOfCatchingUp()
{
using Clock = RenderCadenceClock::Clock;
RenderCadenceClock cadence(10.0);
const auto start = Clock::now();
cadence.Reset(start);
const auto late = start + std::chrono::milliseconds(35);
const auto tick = cadence.Poll(late);
Expect(tick.due, "late skipped-interval poll is due");
Expect(tick.skippedFrames == 3, "late skipped-interval poll counts missed frames");
cadence.MarkRendered(late);
Expect(cadence.NextRenderTime() > late, "late render schedules the next tick in the future");
Expect(cadence.NextRenderTime() - late <= std::chrono::milliseconds(6), "late render does not leave catch-up frames due immediately");
const auto immediateFollowup = cadence.Poll(late);
Expect(!immediateFollowup.due, "cadence does not allow an immediate catch-up render after a late frame");
Expect(immediateFollowup.sleepFor > RenderCadenceClock::Duration::zero(), "cadence reports wait time after skipping missed intervals");
}
void TestMarkRenderedRebasesAfterLargeStall()
{
using Clock = RenderCadenceClock::Clock;
@@ -81,6 +102,7 @@ int main()
TestEarlyPollWaitsWithoutAdvancing();
TestDuePollRendersWithoutSkipping();
TestLatePollRecordsSkippedFrames();
TestLatePollSkipsMissedIntervalsInsteadOfCatchingUp();
TestMarkRenderedRebasesAfterLargeStall();
if (gFailures != 0)

View File

@@ -29,6 +29,13 @@ InputFrameMailboxConfig MakeConfig(std::size_t capacity = 2)
return config;
}
InputFrameMailboxConfig MakeBufferedConfig(std::size_t capacity = 4, std::size_t maxReadyFrames = 2)
{
InputFrameMailboxConfig config = MakeConfig(capacity);
config.maxReadyFrames = maxReadyFrames;
return config;
}
std::vector<unsigned char> MakeFrame(unsigned char value)
{
return std::vector<unsigned char>(16, value);
@@ -90,6 +97,48 @@ void TestReadingFrameIsProtected()
Expect(mailbox.Release(acquired), "protected frame releases");
Expect(mailbox.SubmitFrame(frame2.data(), 8, 2), "producer can submit after release");
}
void TestAcquireOldestConsumesFifoWithoutDroppingReadyFrames()
{
InputFrameMailbox mailbox(MakeConfig(3));
const std::vector<unsigned char> frame1 = MakeFrame(1);
const std::vector<unsigned char> frame2 = MakeFrame(2);
Expect(mailbox.SubmitFrame(frame1.data(), 8, 1), "fifo first frame submits");
Expect(mailbox.SubmitFrame(frame2.data(), 8, 2), "fifo second frame submits");
InputFrame acquired;
Expect(mailbox.TryAcquireOldest(acquired), "fifo oldest frame acquired");
Expect(acquired.frameIndex == 1, "fifo acquire returns oldest frame");
Expect(mailbox.Release(acquired), "fifo acquired frame releases");
const InputFrameMailboxMetrics metrics = mailbox.Metrics();
Expect(metrics.readyCount == 1, "fifo acquire leaves newer frame ready");
Expect(metrics.droppedReadyFrames == 0, "fifo acquire does not drop newer ready frame");
}
void TestMaxReadyFramesKeepsConfiguredInputBuffer()
{
InputFrameMailbox mailbox(MakeBufferedConfig(4, 3));
const std::vector<unsigned char> frame1 = MakeFrame(1);
const std::vector<unsigned char> frame2 = MakeFrame(2);
const std::vector<unsigned char> frame3 = MakeFrame(3);
const std::vector<unsigned char> frame4 = MakeFrame(4);
Expect(mailbox.SubmitFrame(frame1.data(), 8, 1), "bounded first frame submits");
Expect(mailbox.SubmitFrame(frame2.data(), 8, 2), "bounded second frame submits");
Expect(mailbox.SubmitFrame(frame3.data(), 8, 3), "bounded third frame submits");
Expect(mailbox.SubmitFrame(frame4.data(), 8, 4), "bounded fourth frame submits");
InputFrame acquired;
Expect(mailbox.TryAcquireOldest(acquired), "bounded oldest available frame acquired");
Expect(acquired.frameIndex == 2, "bounded buffer trims oldest beyond configured ready frame limit");
Expect(mailbox.Release(acquired), "bounded acquired frame releases");
const InputFrameMailboxMetrics metrics = mailbox.Metrics();
Expect(metrics.readyCount == 2, "bounded acquire leaves remaining configured ready frames");
Expect(metrics.droppedReadyFrames == 1, "bounded buffer records trimmed frame");
}
}
int main()
@@ -97,6 +146,8 @@ int main()
TestAcquireLatestDropsOlderReadyFrames();
TestSubmitDropsOldestWhenFull();
TestReadingFrameIsProtected();
TestAcquireOldestConsumesFifoWithoutDroppingReadyFrames();
TestMaxReadyFramesKeepsConfiguredInputBuffer();
if (gFailures != 0)
{