From 96e3c8dc7a5df088db4511558ec1c5ec2f4524ab 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 | 11 +++++++++++ 1 file changed, 11 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..e434debf0f 100644 --- a/src/core/hle/service/nvnflinger/buffer_queue_consumer.cpp +++ b/src/core/hle/service/nvnflinger/buffer_queue_consumer.cpp @@ -45,6 +45,17 @@ Status BufferQueueConsumer::AcquireBuffer(BufferItem* out_buffer, auto front(core->queue.begin()); + // prefer newest queued frame for lower input latency (if no present deadline is requested). + if (expected_present.count() == 0 && core->queue.size() > 1) { + while (core->queue.size() > 1) { + 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