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

Commit 39f510fb authored by Nergi Rahardi's avatar Nergi Rahardi
Browse files

Pass dequeue timestamp along with buffer data

Avoids performance penalties associated with metadata.

Bug: 342174822
Test: atest libsurfaceflinger_unittest
Test: Manually verified dequeueTime sent without triggering
metadata change

Change-Id: Ifed747818ea252b2551780ffcefd3309eb41edbe
parent fe0aa3b5
Loading
Loading
Loading
Loading
+12 −12
Original line number Diff line number Diff line
@@ -613,8 +613,19 @@ status_t BLASTBufferQueue::acquireNextBufferLocked(
            std::bind(releaseBufferCallbackThunk, wp<BLASTBufferQueue>(this) /* callbackContext */,
                      std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
    sp<Fence> fence = bufferItem.mFence ? new Fence(bufferItem.mFence->dup()) : Fence::NO_FENCE;

    nsecs_t dequeueTime = -1;
    {
        std::lock_guard _lock{mTimestampMutex};
        auto dequeueTimeIt = mDequeueTimestamps.find(buffer->getId());
        if (dequeueTimeIt != mDequeueTimestamps.end()) {
            dequeueTime = dequeueTimeIt->second;
            mDequeueTimestamps.erase(dequeueTimeIt);
        }
    }

    t->setBuffer(mSurfaceControl, buffer, fence, bufferItem.mFrameNumber, mProducerId,
                 releaseBufferCallback);
                 releaseBufferCallback, dequeueTime);
    t->setDataspace(mSurfaceControl, static_cast<ui::Dataspace>(bufferItem.mDataSpace));
    t->setHdrMetadata(mSurfaceControl, bufferItem.mHdrMetadata);
    t->setSurfaceDamageRegion(mSurfaceControl, bufferItem.mSurfaceDamage);
@@ -658,17 +669,6 @@ status_t BLASTBufferQueue::acquireNextBufferLocked(
        mPendingFrameTimelines.pop();
    }

    {
        std::lock_guard _lock{mTimestampMutex};
        auto dequeueTime = mDequeueTimestamps.find(buffer->getId());
        if (dequeueTime != mDequeueTimestamps.end()) {
            Parcel p;
            p.writeInt64(dequeueTime->second);
            t->setMetadata(mSurfaceControl, gui::METADATA_DEQUEUE_TIME, p);
            mDequeueTimestamps.erase(dequeueTime);
        }
    }

    mergePendingTransactions(t, bufferItem.mFrameNumber);
    if (applyTransaction) {
        // All transactions on our apply token are one-way. See comment on mAppliedLastTransaction
+2 −0
Original line number Diff line number Diff line
@@ -985,6 +985,7 @@ status_t BufferData::writeToParcel(Parcel* output) const {
    SAFE_PARCEL(output->writeBool, hasBarrier);
    SAFE_PARCEL(output->writeUint64, barrierFrameNumber);
    SAFE_PARCEL(output->writeUint32, producerId);
    SAFE_PARCEL(output->writeInt64, dequeueTime);

    return NO_ERROR;
}
@@ -1024,6 +1025,7 @@ status_t BufferData::readFromParcel(const Parcel* input) {
    SAFE_PARCEL(input->readBool, &hasBarrier);
    SAFE_PARCEL(input->readUint64, &barrierFrameNumber);
    SAFE_PARCEL(input->readUint32, &producerId);
    SAFE_PARCEL(input->readInt64, &dequeueTime);

    return NO_ERROR;
}
+2 −1
Original line number Diff line number Diff line
@@ -1702,7 +1702,7 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBuffe
SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBuffer(
        const sp<SurfaceControl>& sc, const sp<GraphicBuffer>& buffer,
        const std::optional<sp<Fence>>& fence, const std::optional<uint64_t>& optFrameNumber,
        uint32_t producerId, ReleaseBufferCallback callback) {
        uint32_t producerId, ReleaseBufferCallback callback, nsecs_t dequeueTime) {
    layer_state_t* s = getLayerState(sc);
    if (!s) {
        mStatus = BAD_INDEX;
@@ -1718,6 +1718,7 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBuffe
        bufferData->frameNumber = frameNumber;
        bufferData->producerId = producerId;
        bufferData->flags |= BufferData::BufferDataChange::frameNumberChanged;
        bufferData->dequeueTime = dequeueTime;
        if (fence) {
            bufferData->acquireFence = *fence;
            bufferData->flags |= BufferData::BufferDataChange::fenceChanged;
+2 −0
Original line number Diff line number Diff line
@@ -128,6 +128,8 @@ public:

    client_cache_t cachedBuffer;

    nsecs_t dequeueTime;

    // Generates the release callback id based on the buffer id and frame number.
    // This is used as an identifier when release callbacks are invoked.
    ReleaseCallbackId generateReleaseCallbackId() const;
+2 −1
Original line number Diff line number Diff line
@@ -568,7 +568,8 @@ public:
        Transaction& setBuffer(const sp<SurfaceControl>& sc, const sp<GraphicBuffer>& buffer,
                               const std::optional<sp<Fence>>& fence = std::nullopt,
                               const std::optional<uint64_t>& frameNumber = std::nullopt,
                               uint32_t producerId = 0, ReleaseBufferCallback callback = nullptr);
                               uint32_t producerId = 0, ReleaseBufferCallback callback = nullptr,
                               nsecs_t dequeueTime = -1);
        Transaction& unsetBuffer(const sp<SurfaceControl>& sc);
        std::shared_ptr<BufferData> getAndClearBuffer(const sp<SurfaceControl>& sc);

Loading