Stage 1 rewrite

This commit is contained in:
Aiden
2026-05-12 00:52:33 +10:00
parent bf23cd880a
commit ac729dc2b9
20 changed files with 1047 additions and 25 deletions

View File

@@ -48,10 +48,50 @@ void TestAcquireHonorsCapacityAndFrameShape()
SystemOutputFramePoolMetrics metrics = pool.GetMetrics();
Expect(metrics.freeCount == 0, "all slots are in use");
Expect(metrics.renderingCount == 2, "rendering slots are counted");
Expect(metrics.acquiredCount == 2, "acquired slots are counted");
Expect(metrics.acquireMissCount == 1, "capacity miss is counted");
}
void TestPhase77StateContract()
{
SystemOutputFramePool pool(MakeConfig(1));
SystemOutputFramePoolMetrics metrics = pool.GetMetrics();
Expect(metrics.freeCount == 1, "new pool starts with one free slot");
Expect(metrics.renderingCount == 0, "new pool starts with no rendering slots");
Expect(metrics.completedCount == 0, "new pool starts with no completed slots");
Expect(metrics.scheduledCount == 0, "new pool starts with no scheduled slots");
OutputFrameSlot slot;
Expect(pool.AcquireRenderingSlot(slot), "free slot moves to rendering");
metrics = pool.GetMetrics();
Expect(metrics.freeCount == 0, "rendering slot leaves free pool");
Expect(metrics.renderingCount == 1, "rendering slot is counted");
Expect(pool.PublishCompletedSlot(slot), "rendering slot moves to completed");
metrics = pool.GetMetrics();
Expect(metrics.renderingCount == 0, "completed slot leaves rendering");
Expect(metrics.completedCount == 1, "completed slot is counted");
Expect(metrics.readyCount == 1, "completed slot is available to scheduler");
OutputFrameSlot completed;
Expect(pool.ConsumeCompletedSlot(completed), "completed slot can be dequeued for scheduling");
metrics = pool.GetMetrics();
Expect(metrics.completedCount == 1, "dequeued completed slot remains completed until scheduled");
Expect(metrics.readyCount == 0, "dequeued completed slot leaves ready queue");
Expect(pool.MarkScheduled(completed), "completed slot moves to scheduled");
metrics = pool.GetMetrics();
Expect(metrics.completedCount == 0, "scheduled slot leaves completed state");
Expect(metrics.scheduledCount == 1, "scheduled slot is counted");
Expect(pool.ReleaseScheduledSlot(completed), "scheduled slot returns to free");
metrics = pool.GetMetrics();
Expect(metrics.freeCount == 1, "released scheduled slot returns to free");
Expect(metrics.scheduledCount == 0, "released scheduled slot leaves scheduled state");
}
void TestReadySlotsAreConsumedFifo()
{
SystemOutputFramePool pool(MakeConfig(2));
@@ -78,6 +118,25 @@ void TestReadySlotsAreConsumedFifo()
Expect(metrics.readyCount == 0, "ready queue is empty after consumption");
}
void TestCompletedSlotCannotBeAcquiredUntilReleased()
{
SystemOutputFramePool pool(MakeConfig(1));
OutputFrameSlot slot;
OutputFrameSlot extra;
Expect(pool.AcquireRenderingSlot(slot), "single slot can be acquired for rendering");
Expect(pool.PublishCompletedSlot(slot), "single slot can be published completed");
Expect(!pool.AcquireRenderingSlot(extra), "completed slot is not available for rendering");
OutputFrameSlot completed;
Expect(pool.ConsumeCompletedSlot(completed), "completed slot can be dequeued");
Expect(!pool.AcquireRenderingSlot(extra), "dequeued completed slot is still not free");
Expect(pool.MarkScheduled(completed), "dequeued completed slot can be scheduled");
Expect(!pool.AcquireRenderingSlot(extra), "scheduled slot is still not free");
Expect(pool.ReleaseScheduledSlot(completed), "scheduled slot can be released");
Expect(pool.AcquireRenderingSlot(extra), "released slot can be acquired again");
}
void TestReadySlotCanBeScheduledByBuffer()
{
SystemOutputFramePool pool(MakeConfig(1));
@@ -153,7 +212,9 @@ void TestEmptyReadyQueueUnderrunIsCounted()
int main()
{
TestAcquireHonorsCapacityAndFrameShape();
TestPhase77StateContract();
TestReadySlotsAreConsumedFifo();
TestCompletedSlotCannotBeAcquiredUntilReleased();
TestReadySlotCanBeScheduledByBuffer();
TestInvalidTransitionsAreRejected();
TestPixelFormatAwareSizing();