From eee4c9cb38776ccc09a2fc2ab95454a53c5c2eaf Mon Sep 17 00:00:00 2001 From: Melody Hsu Date: Thu, 16 Jan 2025 16:11:14 +0000 Subject: Time duration blocked on dequeueBuffer for stuffing recovery Start buffer stuffing recovery only when severely buffer stuffed. Determined based on how long BBQ waits on buffer release. Waits shorter than this may simply be false positives for buffer stuffing recovery due to timing and should be ignored. Bug: b/294922229 Test: Manually check perfetto traces, presubmit, SysUi performance tests Flag: android.view.flags.buffer_stuffing_recovery Change-Id: Ic8c01edaebd599724fc7a9a67630069c05b567c1 --- libs/gui/BLASTBufferQueue.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'libs/gui/BLASTBufferQueue.cpp') diff --git a/libs/gui/BLASTBufferQueue.cpp b/libs/gui/BLASTBufferQueue.cpp index 24d858ca15..0848fac293 100644 --- a/libs/gui/BLASTBufferQueue.cpp +++ b/libs/gui/BLASTBufferQueue.cpp @@ -1221,16 +1221,12 @@ public: #if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(BUFFER_RELEASE_CHANNEL) status_t waitForBufferRelease(std::unique_lock& bufferQueueLock, nsecs_t timeout) const override { + const auto startTime = std::chrono::steady_clock::now(); sp bbq = mBLASTBufferQueue.promote(); if (!bbq) { return OK; } - // Provide a callback for Choreographer to start buffer stuffing recovery when blocked - // on buffer release. - std::function callbackCopy = bbq->getWaitForBufferReleaseCallback(); - if (callbackCopy) callbackCopy(); - // BufferQueue has already checked if we have a free buffer. If there's an unread interrupt, // we want to ignore it. This must be done before unlocking the BufferQueue lock to ensure // we don't miss an interrupt. @@ -1252,6 +1248,14 @@ public: } bbq->releaseBufferCallback(id, fence, maxAcquiredBufferCount); + const nsecs_t durationNanos = std::chrono::duration_cast( + std::chrono::steady_clock::now() - startTime) + .count(); + // Provide a callback for Choreographer to start buffer stuffing recovery when blocked + // on buffer release. + std::function callbackCopy = bbq->getWaitForBufferReleaseCallback(); + if (callbackCopy) callbackCopy(durationNanos); + return OK; } #endif @@ -1343,12 +1347,13 @@ void BLASTBufferQueue::setApplyToken(sp applyToken) { mApplyToken = std::move(applyToken); } -void BLASTBufferQueue::setWaitForBufferReleaseCallback(std::function callback) { +void BLASTBufferQueue::setWaitForBufferReleaseCallback( + std::function callback) { std::lock_guard _lock{mWaitForBufferReleaseMutex}; mWaitForBufferReleaseCallback = std::move(callback); } -std::function BLASTBufferQueue::getWaitForBufferReleaseCallback() const { +std::function BLASTBufferQueue::getWaitForBufferReleaseCallback() const { std::lock_guard _lock{mWaitForBufferReleaseMutex}; return mWaitForBufferReleaseCallback; } -- cgit v1.2.3-59-g8ed1b