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

Commit bf78464d authored by Valerie Hau's avatar Valerie Hau
Browse files

Adding frame event history updates to BLAST

Bug: 141939081
Test: build, boot, SurfaceFlinger_test
Change-Id: Ic8e815177389150aac34042026b7bac30141ba9e
parent 2068b3fc
Loading
Loading
Loading
Loading
+34 −4
Original line number Diff line number Diff line
@@ -98,6 +98,8 @@ void BufferStateLayer::onLayerDisplayed(const sp<Fence>& releaseFence) {
        }
    }

    mPreviousReleaseFence = releaseFence;

    // Prevent tracing the same release multiple times.
    if (mPreviousFrameNumber != mPreviousReleasedFrameNumber) {
        mFlinger->mFrameTracer->traceFence(getSequence(), mPreviousBufferId, mPreviousFrameNumber,
@@ -111,7 +113,7 @@ void BufferStateLayer::setTransformHint(uint32_t orientation) const {
    mTransformHint = orientation;
}

void BufferStateLayer::releasePendingBuffer(nsecs_t /*dequeueReadyTime*/) {
void BufferStateLayer::releasePendingBuffer(nsecs_t dequeueReadyTime) {
    for (const auto& handle : mDrawingState.callbackHandles) {
        handle->transformHint = mTransformHint;
    }
@@ -120,6 +122,16 @@ void BufferStateLayer::releasePendingBuffer(nsecs_t /*dequeueReadyTime*/) {
            mDrawingState.callbackHandles);

    mDrawingState.callbackHandles = {};

    const sp<Fence>& releaseFence(mPreviousReleaseFence);
    std::shared_ptr<FenceTime> releaseFenceTime = std::make_shared<FenceTime>(releaseFence);
    {
        Mutex::Autolock lock(mFrameEventHistoryMutex);
        if (mPreviousFrameNumber != 0) {
            mFrameEventHistory.addRelease(mPreviousFrameNumber, dequeueReadyTime,
                                          std::move(releaseFenceTime));
        }
    }
}

bool BufferStateLayer::shouldPresentNow(nsecs_t /*expectedPresentTime*/) const {
@@ -233,8 +245,21 @@ bool BufferStateLayer::setFrame(const Rect& frame) {
    return true;
}

bool BufferStateLayer::setBuffer(const sp<GraphicBuffer>& buffer, nsecs_t postTime,
                                 nsecs_t desiredPresentTime, const client_cache_t& clientCacheId) {
bool BufferStateLayer::updateFrameEventHistory(const sp<Fence>& acquireFence, nsecs_t postedTime,
                                               nsecs_t desiredPresentTime) {
    Mutex::Autolock lock(mFrameEventHistoryMutex);
    mAcquireTimeline.updateSignalTimes();
    std::shared_ptr<FenceTime> acquireFenceTime =
            std::make_shared<FenceTime>((acquireFence ? acquireFence : Fence::NO_FENCE));
    NewFrameEventsEntry newTimestamps = {mCurrentState.frameNumber, postedTime, desiredPresentTime,
                                         acquireFenceTime};
    mFrameEventHistory.addQueue(newTimestamps);
    return true;
}

bool BufferStateLayer::setBuffer(const sp<GraphicBuffer>& buffer, const sp<Fence>& acquireFence,
                                 nsecs_t postTime, nsecs_t desiredPresentTime,
                                 const client_cache_t& clientCacheId) {
    if (mCurrentState.buffer) {
        mReleasePreviousBuffer = true;
    }
@@ -257,6 +282,7 @@ bool BufferStateLayer::setBuffer(const sp<GraphicBuffer>& buffer, nsecs_t postTi
    mFlinger->mScheduler->recordLayerHistory(this,
                                             desiredPresentTime <= 0 ? 0 : desiredPresentTime);

    updateFrameEventHistory(acquireFence, postTime, desiredPresentTime);
    return true;
}

@@ -553,10 +579,14 @@ status_t BufferStateLayer::updateActiveBuffer() {
    return NO_ERROR;
}

status_t BufferStateLayer::updateFrameNumber(nsecs_t /*latchTime*/) {
status_t BufferStateLayer::updateFrameNumber(nsecs_t latchTime) {
    // TODO(marissaw): support frame history events
    mPreviousFrameNumber = mCurrentFrameNumber;
    mCurrentFrameNumber = mDrawingState.frameNumber;
    {
        Mutex::Autolock lock(mFrameEventHistoryMutex);
        mFrameEventHistory.addLatch(mCurrentFrameNumber, latchTime);
    }
    return NO_ERROR;
}

+5 −2
Original line number Diff line number Diff line
@@ -68,8 +68,8 @@ public:
    bool setTransformToDisplayInverse(bool transformToDisplayInverse) override;
    bool setCrop(const Rect& crop) override;
    bool setFrame(const Rect& frame) override;
    bool setBuffer(const sp<GraphicBuffer>& buffer, nsecs_t postTime, nsecs_t desiredPresentTime,
                   const client_cache_t& clientCacheId) override;
    bool setBuffer(const sp<GraphicBuffer>& buffer, const sp<Fence>& acquireFence, nsecs_t postTime,
                   nsecs_t desiredPresentTime, const client_cache_t& clientCacheId) override;
    bool setAcquireFence(const sp<Fence>& fence) override;
    bool setDataspace(ui::Dataspace dataspace) override;
    bool setHdrMetadata(const HdrMetadata& hdrMetadata) override;
@@ -109,6 +109,9 @@ protected:
    void gatherBufferInfo() override;

private:
    bool updateFrameEventHistory(const sp<Fence>& acquireFence, nsecs_t postedTime,
                                 nsecs_t requestedPresentTime);

    uint64_t getFrameNumber(nsecs_t expectedPresentTime) const override;

    bool getAutoRefresh() const override;
+2 −2
Original line number Diff line number Diff line
@@ -329,8 +329,8 @@ public:
    virtual bool setTransformToDisplayInverse(bool /*transformToDisplayInverse*/) { return false; };
    virtual bool setCrop(const Rect& /*crop*/) { return false; };
    virtual bool setFrame(const Rect& /*frame*/) { return false; };
    virtual bool setBuffer(const sp<GraphicBuffer>& /*buffer*/, nsecs_t /*postTime*/,
                           nsecs_t /*desiredPresentTime*/,
    virtual bool setBuffer(const sp<GraphicBuffer>& /*buffer*/, const sp<Fence>& /*acquireFence*/,
                           nsecs_t /*postTime*/, nsecs_t /*desiredPresentTime*/,
                           const client_cache_t& /*clientCacheId*/) {
        return false;
    };
+1 −1
Original line number Diff line number Diff line
@@ -208,7 +208,7 @@ void RefreshRateOverlay::changeRefreshRate(const RefreshRate& refreshRate) {
    const int32_t buttom = top + display->getHeight() / 32;

    auto buffer = mBufferCache[refreshRate.fps];
    mLayer->setBuffer(buffer, 0, 0, {});
    mLayer->setBuffer(buffer, Fence::NO_FENCE, 0, 0, {});

    mLayer->setFrame(Rect(left, top, right, buttom));

+2 −1
Original line number Diff line number Diff line
@@ -3570,7 +3570,8 @@ uint32_t SurfaceFlinger::setClientStateLocked(
        buffer = s.buffer;
    }
    if (buffer) {
        if (layer->setBuffer(buffer, postTime, desiredPresentTime, s.cachedBuffer)) {
        if (layer->setBuffer(buffer, s.acquireFence, postTime, desiredPresentTime,
                             s.cachedBuffer)) {
            flags |= eTraversalNeeded;
        }
    }