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