Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2a52ca62 authored by Vishnu Nair's avatar Vishnu Nair
Browse files

BlastBufferQueue: Fix acquire counts when holding buffers

Update the acquire count when ever we release a buffer otherwise
when going from 120hz to 60hz we may release multiple buffers
and only decrement the acquire count once. This will prevent the
adapter from acquiring all the possible buffers.

Also make sure we process the shadow queue every time we release
a buffer.

Bug: 188553729
Test: Run backpressure based game on 60Hz and 90hz and collect traces
Change-Id: I23517ee0fe840a9215f368bd85713ba19dbeb2a3
parent 504a4d8f
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -151,7 +151,7 @@ BLASTBufferQueue::BLASTBufferQueue(const std::string& name, const sp<SurfaceCont
                                                      1, false);
    static int32_t id = 0;
    auto consumerName = mName + "(BLAST Consumer)" + std::to_string(id);
    mPendingBufferTrace = "PendingBuffer - " + mName + "BLAST#" + std::to_string(id);
    mQueuedBufferTrace = "QueuedBuffer - " + mName + "BLAST#" + std::to_string(id);
    id++;
    mBufferItemConsumer->setName(String8(consumerName.c_str()));
    mBufferItemConsumer->setFrameAvailableListener(this);
@@ -361,16 +361,15 @@ void BLASTBufferQueue::releaseBufferCallback(uint64_t graphicBufferId,
                     graphicBufferId);
            return;
        }

        mNumAcquired--;
        mBufferItemConsumer->releaseBuffer(it->second, releaseBuffer.releaseFence);
        mSubmitted.erase(it);
        processNextBufferLocked(false /* useNextTransaction */);
    }

    ATRACE_INT("PendingRelease", mPendingRelease.size());

    mNumAcquired--;
    ATRACE_INT(mPendingBufferTrace.c_str(), mNumFrameAvailable + mNumAcquired);
    processNextBufferLocked(false /* useNextTransaction */);
    ATRACE_INT(mQueuedBufferTrace.c_str(),
               mNumFrameAvailable + mNumAcquired - mPendingRelease.size());
    mCallbackCV.notify_all();
}

@@ -538,7 +537,8 @@ void BLASTBufferQueue::onFrameAvailable(const BufferItem& item) {
    }
    // add to shadow queue
    mNumFrameAvailable++;
    ATRACE_INT(mPendingBufferTrace.c_str(), mNumFrameAvailable + mNumAcquired);
    ATRACE_INT(mQueuedBufferTrace.c_str(),
               mNumFrameAvailable + mNumAcquired - mPendingRelease.size());

    BQA_LOGV("onFrameAvailable framenumber=%" PRIu64 " nextTransactionSet=%s", item.mFrameNumber,
             toString(nextTransactionSet));
+5 −1
Original line number Diff line number Diff line
@@ -125,7 +125,11 @@ private:
    static PixelFormat convertBufferFormat(PixelFormat& format);

    std::string mName;
    std::string mPendingBufferTrace;
    // Represents the queued buffer count from buffer queue,
    // pre-BLAST. This is mNumFrameAvailable (buffers that queued to blast) +
    // mNumAcquired (buffers that queued to SF)  mPendingRelease.size() (buffers that are held by
    // blast). This counter is read by android studio profiler.
    std::string mQueuedBufferTrace;
    sp<SurfaceControl> mSurfaceControl;

    std::mutex mMutex;