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

Commit b0e167d3 authored by Valerie Hau's avatar Valerie Hau Committed by Android (Google) Code Review
Browse files

Merge "Adding frame event history updates to BLAST"

parents df90a8c8 bf78464d
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
@@ -3590,7 +3590,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;
        }
    }