From 6cf9d3ce752b9fba5bf55c0e684988d401c90739 Mon Sep 17 00:00:00 2001 From: xbzk Date: Sun, 15 Mar 2026 07:26:16 -0300 Subject: [PATCH] [nvmflinger] prefer newest queued frames to reduce input latency --- .../hle/service/nvnflinger/buffer_queue_consumer.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/core/hle/service/nvnflinger/buffer_queue_consumer.cpp b/src/core/hle/service/nvnflinger/buffer_queue_consumer.cpp index 1052dfa0ef..fe0b91713b 100644 --- a/src/core/hle/service/nvnflinger/buffer_queue_consumer.cpp +++ b/src/core/hle/service/nvnflinger/buffer_queue_consumer.cpp @@ -45,6 +45,18 @@ Status BufferQueueConsumer::AcquireBuffer(BufferItem* out_buffer, auto front(core->queue.begin()); + // Bound queue latency (if no present deadline is requested) while preserving one-frame + // backpressure so game pacing does not run ahead. + if (expected_present.count() == 0 && core->queue.size() > 2) { + while (core->queue.size() > 2) { + const auto stale = core->queue.begin(); + if (core->StillTracking(*stale)) slots[stale->slot].buffer_state = BufferState::Free; + core->queue.erase(stale); + } + core->SignalDequeueCondition(); + front = core->queue.begin(); + } + // If expected_present is specified, we may not want to return a buffer yet. if (expected_present.count() != 0) { constexpr auto MAX_REASONABLE_NSEC = 1000000000LL; // 1 second